From 7bd5931cc1e1102e0171ca70bd2d6bbad81f71dc Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 31 May 2017 13:48:10 -0700 Subject: [PATCH] i965/tex: Unify the TexImage and TexSubImage code It's nearly the same so there's no good reason why it can't be in a common function. The one difference is that _mesa_store_teximage calls AllocTextureImageBuffer for us, while _mesa_store_texsubimage doesn't, but we don't need that anyway - intelTexImage already does it. Reviewed-by: Kenneth Graunke Reviewed-by: Iago Toral Quiroga --- src/mesa/drivers/dri/i965/intel_tex_image.c | 111 +++++++++----------- 1 file changed, 49 insertions(+), 62 deletions(-) diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c index 29a49840d81..ceb0b3f9810 100644 --- a/src/mesa/drivers/dri/i965/intel_tex_image.c +++ b/src/mesa/drivers/dri/i965/intel_tex_image.c @@ -284,62 +284,7 @@ intel_texsubimage_tiled_memcpy(struct gl_context * ctx, static void -intelTexImage(struct gl_context * ctx, - GLuint dims, - struct gl_texture_image *texImage, - GLenum format, GLenum type, const void *pixels, - const struct gl_pixelstore_attrib *unpack) -{ - struct intel_texture_image *intelImage = intel_texture_image(texImage); - bool ok; - - bool tex_busy = intelImage->mt && brw_bo_busy(intelImage->mt->bo); - - DBG("%s mesa_format %s target %s format %s type %s level %d %dx%dx%d\n", - __func__, _mesa_get_format_name(texImage->TexFormat), - _mesa_enum_to_string(texImage->TexObject->Target), - _mesa_enum_to_string(format), _mesa_enum_to_string(type), - texImage->Level, texImage->Width, texImage->Height, texImage->Depth); - - /* Allocate storage for texture data. */ - if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims); - return; - } - - assert(intelImage->mt); - - if (intelImage->mt->format == MESA_FORMAT_S_UINT8) - intelImage->mt->r8stencil_needs_update = true; - - ok = _mesa_meta_pbo_TexSubImage(ctx, dims, texImage, 0, 0, 0, - texImage->Width, texImage->Height, - texImage->Depth, - format, type, pixels, - tex_busy, unpack); - if (ok) - return; - - ok = intel_texsubimage_tiled_memcpy(ctx, dims, texImage, - 0, 0, 0, /*x,y,z offsets*/ - texImage->Width, - texImage->Height, - texImage->Depth, - format, type, pixels, unpack); - if (ok) - return; - - DBG("%s: upload image %dx%dx%d pixels %p\n", - __func__, texImage->Width, texImage->Height, texImage->Depth, - pixels); - - _mesa_store_teximage(ctx, dims, texImage, - format, type, pixels, unpack); -} - - -static void -intelTexSubImage(struct gl_context * ctx, +intel_upload_tex(struct gl_context * ctx, GLuint dims, struct gl_texture_image *texImage, GLint xoffset, GLint yoffset, GLint zoffset, @@ -356,12 +301,6 @@ intelTexSubImage(struct gl_context * ctx, if (mt && mt->format == MESA_FORMAT_S_UINT8) mt->r8stencil_needs_update = true; - DBG("%s mesa_format %s target %s format %s type %s level %d %dx%dx%d\n", - __func__, _mesa_get_format_name(texImage->TexFormat), - _mesa_enum_to_string(texImage->TexObject->Target), - _mesa_enum_to_string(format), _mesa_enum_to_string(type), - texImage->Level, texImage->Width, texImage->Height, texImage->Depth); - ok = _mesa_meta_pbo_TexSubImage(ctx, dims, texImage, xoffset, yoffset, zoffset, width, height, depth, format, type, @@ -383,6 +322,54 @@ intelTexSubImage(struct gl_context * ctx, } +static void +intelTexImage(struct gl_context * ctx, + GLuint dims, + struct gl_texture_image *texImage, + GLenum format, GLenum type, const void *pixels, + const struct gl_pixelstore_attrib *unpack) +{ + DBG("%s mesa_format %s target %s format %s type %s level %d %dx%dx%d\n", + __func__, _mesa_get_format_name(texImage->TexFormat), + _mesa_enum_to_string(texImage->TexObject->Target), + _mesa_enum_to_string(format), _mesa_enum_to_string(type), + texImage->Level, texImage->Width, texImage->Height, texImage->Depth); + + /* Allocate storage for texture data. */ + if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims); + return; + } + + assert(intel_texture_image(texImage)->mt); + + intel_upload_tex(ctx, dims, texImage, 0, 0, 0, + texImage->Width, texImage->Height, texImage->Depth, + format, type, pixels, unpack); +} + + +static void +intelTexSubImage(struct gl_context * ctx, + GLuint dims, + struct gl_texture_image *texImage, + GLint xoffset, GLint yoffset, GLint zoffset, + GLsizei width, GLsizei height, GLsizei depth, + GLenum format, GLenum type, + const GLvoid * pixels, + const struct gl_pixelstore_attrib *packing) +{ + DBG("%s mesa_format %s target %s format %s type %s level %d %dx%dx%d\n", + __func__, _mesa_get_format_name(texImage->TexFormat), + _mesa_enum_to_string(texImage->TexObject->Target), + _mesa_enum_to_string(format), _mesa_enum_to_string(type), + texImage->Level, texImage->Width, texImage->Height, texImage->Depth); + + intel_upload_tex(ctx, dims, texImage, xoffset, yoffset, zoffset, + width, height, depth, format, type, pixels, packing); +} + + static void intel_set_texture_image_mt(struct brw_context *brw, struct gl_texture_image *image,