From: Eric Anholt Date: Fri, 19 Apr 2013 21:00:22 +0000 (-0700) Subject: swrast: Make a teximage's stored RowStride be in terms of bytes per row. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f91823f026fc5996f9b2ffa1dc48573810f1e4fd;p=mesa.git swrast: Make a teximage's stored RowStride be in terms of bytes per row. For hardware drivers with pitch alignment requirements, a non-power-of-two-sized texture format won't end up being an integer number of pixels per row. Also, avoids having to change our units between MapTextureImage's rowStride and swrast's RowStride. This doesn't fully convert the compressed texel fetch path, but does make sure we don't drop any bits (not that we'd expect to). Reviewed-by: Kenneth Graunke Reviewed-by: Brian Paul --- diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h index 7b3c740c1ca..38015483597 100644 --- a/src/mesa/swrast/s_context.h +++ b/src/mesa/swrast/s_context.h @@ -138,8 +138,16 @@ struct swrast_texture_image /** used for mipmap LOD computation */ GLfloat WidthScale, HeightScale, DepthScale; - /** These fields only valid when texture memory is mapped */ - GLint RowStride; /**< Padded width in units of texels */ + /** + * Byte stride between rows in ImageSlices. + * + * For compressed textures, this is the byte stride between one row of + * blocks and the next row of blocks. + * + * Only valid while one of the ImageSlices is mapped, and must be the same + * between all slices. + */ + GLint RowStride; void **ImageSlices; /**< if 3D texture: array [Depth] of offsets to each 2D slice in 'Data', in texels */ GLubyte *Map; /**< Pointer to mapped image memory */ diff --git a/src/mesa/swrast/s_texfetch.c b/src/mesa/swrast/s_texfetch.c index a9bc3fad0a2..f6c269d8baf 100644 --- a/src/mesa/swrast/s_texfetch.c +++ b/src/mesa/swrast/s_texfetch.c @@ -98,8 +98,16 @@ static void fetch_compressed(const struct swrast_texture_image *swImage, GLint i, GLint j, GLint k, GLfloat *texel) { + /* The FetchCompressedTexel function takes an integer pixel rowstride, + * while the image's rowstride is bytes per row of blocks. + */ + GLuint bw, bh; + GLuint texelBytes = _mesa_get_format_bytes(swImage->Base.TexFormat); + _mesa_get_format_block_size(swImage->Base.TexFormat, &bw, &bh); + assert(swImage->RowStride * bw % texelBytes == 0); + swImage->FetchCompressedTexel(swImage->ImageSlices[k], - swImage->RowStride, + swImage->RowStride * bw / texelBytes, i, j, texel); } diff --git a/src/mesa/swrast/s_texfetch_tmp.h b/src/mesa/swrast/s_texfetch_tmp.h index 4cd42c06dfe..c9991cd84d9 100644 --- a/src/mesa/swrast/s_texfetch_tmp.h +++ b/src/mesa/swrast/s_texfetch_tmp.h @@ -52,15 +52,16 @@ #define TEXEL_ADDR( type, image, i, j, k, size ) \ ((void) (k), \ - ((type *)(image)->ImageSlices[0] + ((image)->RowStride * (j) + (i)) * (size))) + ((type *)((image)->ImageSlices[0] + (image)->RowStride * (j)) + \ + (i) * (size))) #define FETCH(x) fetch_texel_2d_##x #elif DIM == 3 #define TEXEL_ADDR( type, image, i, j, k, size ) \ - ((type *)(image)->ImageSlices[k] + \ - ((image)->RowStride * (j) + (i)) * (size)) + ((type *)((image)->ImageSlices[k] + \ + (image)->RowStride * (j)) + (i) * (size)) #define FETCH(x) fetch_texel_3d_##x diff --git a/src/mesa/swrast/s_texfilter.c b/src/mesa/swrast/s_texfilter.c index ee3d737e26c..c8ea26adae8 100644 --- a/src/mesa/swrast/s_texfilter.c +++ b/src/mesa/swrast/s_texfilter.c @@ -1505,7 +1505,9 @@ sample_lambda_2d(struct gl_context *ctx, const GLboolean repeatNoBorderPOT = (samp->WrapS == GL_REPEAT) && (samp->WrapT == GL_REPEAT) - && (tImg->Border == 0 && (tImg->Width == swImg->RowStride)) + && (tImg->Border == 0) + && (_mesa_format_row_stride(tImg->TexFormat, tImg->Width) == + swImg->RowStride) && swImg->_IsPowerOfTwo; ASSERT(lambda != NULL); diff --git a/src/mesa/swrast/s_texture.c b/src/mesa/swrast/s_texture.c index b0990a8cc30..1783d9c477f 100644 --- a/src/mesa/swrast/s_texture.c +++ b/src/mesa/swrast/s_texture.c @@ -104,7 +104,8 @@ _swrast_alloc_texture_image_buffer(struct gl_context *ctx, return GL_FALSE; /* RowStride and ImageSlices[] describe how to address texels in 'Data' */ - swImg->RowStride = texImage->Width; + swImg->RowStride = _mesa_format_row_stride(texImage->TexFormat, + texImage->Width); for (i = 0; i < slices; i++) { swImg->ImageSlices[i] = swImg->Buffer + bytesPerSlice * i; diff --git a/src/mesa/swrast/s_triangle.c b/src/mesa/swrast/s_triangle.c index eceac83f719..ffe99832bce 100644 --- a/src/mesa/swrast/s_triangle.c +++ b/src/mesa/swrast/s_triangle.c @@ -1079,7 +1079,8 @@ _swrast_choose_triangle( struct gl_context *ctx ) && texObj2D->_Swizzle == SWIZZLE_NOOP && swImg->_IsPowerOfTwo && texImg->Border == 0 - && texImg->Width == swImg->RowStride + && (_mesa_format_row_stride(format, texImg->Width) == + swImg->RowStride) && (format == MESA_FORMAT_RGB888 || format == MESA_FORMAT_RGBA8888) && minFilter == magFilter && ctx->Light.Model.ColorControl == GL_SINGLE_COLOR