r600: Fix size calculation for 24 bit depth
authorRobert Noland <rnoland@2hip.net>
Mon, 19 Oct 2009 14:47:39 +0000 (09:47 -0500)
committerAlex Deucher <alexdeucher@gmail.com>
Mon, 19 Oct 2009 15:09:10 +0000 (11:09 -0400)
size was being calculated based on 3 bytes per pixel with 24 bit depth
instead of 4 bytes.  This caused corruption in the bottom 25% of objects.
This finishes fixing the menu/text corruption in compiz/kde4.

Signed-off-by: Robert Noland <rnoland@2hip.net>
src/mesa/drivers/dri/r600/r600_texstate.c

index 61ff7e8158e6a5e08905c6f23a44f55cff0e69ef..a30703e41b01a329e31a7285f5cce863bd50a35f 100644 (file)
@@ -723,7 +723,7 @@ void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
        radeonTexObjPtr t = radeon_tex_obj(tObj);
        int firstlevel = t->mt ? t->mt->firstLevel : 0;
        const struct gl_texture_image *firstImage;
-       uint32_t pitch_val, size, row_align;
+       uint32_t pitch_val, size, row_align, bpp;
 
        if (!tObj)
                return;
@@ -733,9 +733,13 @@ void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
        if (!offset)
                return;
 
+       bpp = depth / 8;
+       if (bpp == 3) 
+               bpp = 4;
+
        firstImage = t->base.Image[0][firstlevel];
        row_align = rmesa->radeon.texture_row_align - 1;
-       size = ((firstImage->Width * (depth / 8) + row_align) & ~row_align) * firstImage->Height;
+       size = ((firstImage->Width * bpp + row_align) & ~row_align) * firstImage->Height;
        if (t->bo) {
                radeon_bo_unref(t->bo);
                t->bo = NULL;