diff options
Diffstat (limited to 'src/mesa/swrast')
-rw-r--r-- | src/mesa/swrast/s_context.h | 12 | ||||
-rw-r--r-- | src/mesa/swrast/s_texfetch.c | 10 | ||||
-rw-r--r-- | src/mesa/swrast/s_texfetch_tmp.h | 7 | ||||
-rw-r--r-- | src/mesa/swrast/s_texfilter.c | 4 | ||||
-rw-r--r-- | src/mesa/swrast/s_texture.c | 3 | ||||
-rw-r--r-- | src/mesa/swrast/s_triangle.c | 3 |
6 files changed, 30 insertions, 9 deletions
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 |