From: Brian Paul Date: Sat, 30 Jul 2011 00:14:34 +0000 (-0700) Subject: mesa: Convert GetCompressedTexImage to using MapTextureImage(). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8df7ca71125ee0ad74260378ff7e185dcf66f3bc;p=mesa.git mesa: Convert GetCompressedTexImage to using MapTextureImage(). This changes drivers to not map the texture on their own before calling _mesa_get_compressed_teximage(). Tested-by: Brian Paul --- diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index ecccb47cee2..96717d31717 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -510,16 +510,11 @@ intelTexImage1D(struct gl_context * ctx, format, type, pixels, unpack, texObj, texImage, 0); } - -/** - * Need to map texture image into memory before copying image data, - * then unmap it. - */ static void -intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, - GLenum format, GLenum type, GLvoid * pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage, GLboolean compressed) +intelGetTexImage(struct gl_context * ctx, GLenum target, GLint level, + GLenum format, GLenum type, GLvoid * pixels, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage) { struct intel_context *intel = intel_context(ctx); struct intel_texture_image *intelImage = intel_texture_image(texImage); @@ -565,15 +560,8 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, intel_tex_image_s8z24_gather(intel, intelImage); } - if (compressed) { - _mesa_get_compressed_teximage(ctx, target, level, pixels, - texObj, texImage); - } - else { - _mesa_get_teximage(ctx, target, level, format, type, pixels, - texObj, texImage); - } - + _mesa_get_teximage(ctx, target, level, format, type, pixels, + texObj, texImage); /* Unmap */ if (intelImage->mt) { @@ -582,28 +570,6 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, } } - -static void -intelGetTexImage(struct gl_context * ctx, GLenum target, GLint level, - GLenum format, GLenum type, GLvoid * pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage) -{ - intel_get_tex_image(ctx, target, level, format, type, pixels, - texObj, texImage, GL_FALSE); -} - - -static void -intelGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level, - GLvoid *pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage) -{ - intel_get_tex_image(ctx, target, level, 0, 0, pixels, - texObj, texImage, GL_TRUE); -} - /** * Binds a region to a texture image, like it was uploaded by glTexImage2D(). * @@ -722,8 +688,6 @@ intelInitTextureImageFuncs(struct dd_function_table *functions) functions->TexImage3D = intelTexImage3D; functions->GetTexImage = intelGetTexImage; - functions->GetCompressedTexImage = intelGetCompressedTexImage; - #if FEATURE_OES_EGL_image functions->EGLImageTargetTexture2D = intel_image_target_texture_2d; #endif diff --git a/src/mesa/drivers/dri/radeon/radeon_tex_getimage.c b/src/mesa/drivers/dri/radeon/radeon_tex_getimage.c index 6e9772e2f1a..a72c2da971f 100644 --- a/src/mesa/drivers/dri/radeon/radeon_tex_getimage.c +++ b/src/mesa/drivers/dri/radeon/radeon_tex_getimage.c @@ -39,17 +39,17 @@ * Need to map texture image into memory before copying image data, * then unmap it. */ -static void -radeon_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, - GLenum format, GLenum type, GLvoid * pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage, int compressed) +void +radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level, + GLenum format, GLenum type, GLvoid * pixels, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage) { radeon_texture_image *image = get_radeon_texture_image(texImage); radeon_print(RADEON_TEXTURE, RADEON_NORMAL, - "%s(%p, tex %p, image %p) compressed %d.\n", - __func__, ctx, texObj, image, compressed); + "%s(%p, tex %p, image %p).\n", + __func__, ctx, texObj, image); if (image->mt) { radeonContextPtr rmesa = RADEON_CONTEXT(ctx); @@ -67,37 +67,10 @@ radeon_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, assert(image->base.Base.Data); } - if (compressed) { - /* FIXME: this can't work for small textures (mips) which - use different hw stride */ - _mesa_get_compressed_teximage(ctx, target, level, pixels, - texObj, texImage); - } else { - _mesa_get_teximage(ctx, target, level, format, type, pixels, - texObj, texImage); - } + _mesa_get_teximage(ctx, target, level, format, type, pixels, + texObj, texImage); if (image->mt) { radeon_teximage_unmap(image); } } - -void -radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level, - GLenum format, GLenum type, GLvoid * pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage) -{ - radeon_get_tex_image(ctx, target, level, format, type, pixels, - texObj, texImage, 0); -} - -void -radeonGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level, - GLvoid *pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage) -{ - radeon_get_tex_image(ctx, target, level, 0, 0, pixels, - texObj, texImage, 1); -} diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c index bb276299497..d7636ca7289 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texture.c +++ b/src/mesa/drivers/dri/radeon/radeon_texture.c @@ -1191,7 +1191,6 @@ radeon_init_common_texture_funcs(radeonContextPtr radeon, functions->TexSubImage3D = radeonTexSubImage3D; functions->CompressedTexImage2D = radeonCompressedTexImage2D; functions->CompressedTexSubImage2D = radeonCompressedTexSubImage2D; - functions->GetCompressedTexImage = radeonGetCompressedTexImage; functions->GetTexImage = radeonGetTexImage; functions->GenerateMipmap = radeonGenerateMipmap; diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.h b/src/mesa/drivers/dri/radeon/radeon_texture.h index c02aa30c789..3d096b1b1e4 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texture.h +++ b/src/mesa/drivers/dri/radeon/radeon_texture.h @@ -121,10 +121,6 @@ void radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels, struct gl_texture_object *texObj, struct gl_texture_image *texImage); -void radeonGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level, - GLvoid *pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage); void radeonCopyTexSubImage2D(struct gl_context *ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c index 2830dda867f..4d583094312 100644 --- a/src/mesa/main/texgetimage.c +++ b/src/mesa/main/texgetimage.c @@ -487,11 +487,11 @@ _mesa_get_compressed_teximage(struct gl_context *ctx, GLenum target, GLint level struct gl_texture_object *texObj, struct gl_texture_image *texImage) { - const GLuint row_stride = _mesa_format_row_stride(texImage->TexFormat, - texImage->Width); - const GLuint row_stride_stored = _mesa_format_row_stride(texImage->TexFormat, - texImage->RowStride); + const GLuint row_stride = + _mesa_format_row_stride(texImage->TexFormat, texImage->Width); GLuint i; + GLubyte *src; + GLint srcRowStride; if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) { /* pack texture image into a PBO */ @@ -507,25 +507,32 @@ _mesa_get_compressed_teximage(struct gl_context *ctx, GLenum target, GLint level img = ADD_POINTERS(buf, img); } + /* map src texture buffer */ + ctx->Driver.MapTextureImage(ctx, texImage, 0, + 0, 0, texImage->Width, texImage->Height, + GL_MAP_READ_BIT, &src, &srcRowStride); + /* no pixelstore or pixel transfer, but respect stride */ - if (row_stride == row_stride_stored) { + if (row_stride == srcRowStride) { const GLuint size = _mesa_format_image_size(texImage->TexFormat, texImage->Width, texImage->Height, texImage->Depth); - memcpy(img, texImage->Data, size); + memcpy(img, src, size); } else { GLuint bw, bh; _mesa_get_format_block_size(texImage->TexFormat, &bw, &bh); for (i = 0; i < (texImage->Height + bh - 1) / bh; i++) { memcpy((GLubyte *)img + i * row_stride, - (GLubyte *)texImage->Data + i * row_stride_stored, + (GLubyte *)src + i * srcRowStride, row_stride); } } + ctx->Driver.UnmapTextureImage(ctx, texImage, 0); + if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) { ctx->Driver.UnmapBuffer(ctx, ctx->Pack.BufferObj); } diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index e744a9f0d69..ffb5635d257 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -926,10 +926,10 @@ decompress_with_blit(struct gl_context * ctx, GLenum target, GLint level, * then unmap it. */ static void -st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, - GLenum format, GLenum type, GLvoid * pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage, GLboolean compressed_dst) +st_GetTexImage(struct gl_context * ctx, GLenum target, GLint level, + GLenum format, GLenum type, GLvoid * pixels, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage) { struct st_context *st = st_context(ctx); struct st_texture_image *stImage = st_texture_image(texImage); @@ -939,9 +939,7 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, GLuint depth, i; GLubyte *dest; - if (stImage->pt && - util_format_is_s3tc(stImage->pt->format) && - !compressed_dst) { + if (stImage->pt && util_format_is_s3tc(stImage->pt->format)) { /* Need to decompress the texture. * We'll do this by rendering a textured quad. * Note that we only expect RGBA formats (no Z/depth formats). @@ -983,14 +981,8 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, dest = (GLubyte *) pixels; for (i = 0; i < depth; i++) { - if (compressed_dst) { - _mesa_get_compressed_teximage(ctx, target, level, dest, - texObj, texImage); - } - else { - _mesa_get_teximage(ctx, target, level, format, type, dest, - texObj, texImage); - } + _mesa_get_teximage(ctx, target, level, format, type, dest, + texObj, texImage); if (stImage->pt && i + 1 < depth) { /* unmap this slice */ @@ -1014,29 +1006,6 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, } -static void -st_GetTexImage(struct gl_context * ctx, GLenum target, GLint level, - GLenum format, GLenum type, GLvoid * pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage) -{ - st_get_tex_image(ctx, target, level, format, type, pixels, texObj, texImage, - GL_FALSE); -} - - -static void -st_GetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level, - GLvoid *pixels, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage) -{ - st_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage, - GL_TRUE); -} - - - static void st_TexSubimage(struct gl_context *ctx, GLint dims, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, @@ -1924,7 +1893,7 @@ st_init_texture_functions(struct dd_function_table *functions) /* compressed texture functions */ functions->CompressedTexImage2D = st_CompressedTexImage2D; - functions->GetCompressedTexImage = st_GetCompressedTexImage; + functions->GetCompressedTexImage = _mesa_get_compressed_teximage; functions->NewTextureObject = st_NewTextureObject; functions->NewTextureImage = st_NewTextureImage;