r600g: fix fbo depth/stencil texture allocation for evergreen+
authorAlex Deucher <alexdeucher@gmail.com>
Tue, 21 Jun 2011 21:31:14 +0000 (17:31 -0400)
committerAlex Deucher <alexdeucher@gmail.com>
Tue, 21 Jun 2011 21:32:42 +0000 (17:32 -0400)
evergreen+ stores depth and stencil separately so when we
allocate a depth/stencil fbo, make sure we allocate enough
memory for both depth and stencil buffers.

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
src/gallium/drivers/r600/r600_texture.c

index 470d26e2c9f47d4dff0fca401f867fd81a939cae..8c98a5a277f82e6e0b61d309f43a9e2be4bd2880 100644 (file)
@@ -243,10 +243,11 @@ static void r600_setup_miptree(struct pipe_screen *screen,
        struct radeon *radeon = (struct radeon *)screen->winsys;
        enum chip_class chipc = r600_get_family_class(radeon);
        unsigned size, layer_size, i, offset;
-       unsigned nblocksx, nblocksy;
+       unsigned nblocksx, nblocksy, extra_size;
 
        for (i = 0, offset = 0; i <= ptex->last_level; i++) {
                unsigned blocksize = util_format_get_blocksize(ptex->format);
+               unsigned base_align = r600_get_base_alignment(screen, ptex->format, array_mode);
 
                r600_texture_set_array_mode(screen, rtex, i, array_mode);
 
@@ -265,9 +266,13 @@ static void r600_setup_miptree(struct pipe_screen *screen,
                else
                        size = layer_size * ptex->array_size;
 
+               /* evergreen stores depth and stencil separately */
+               if ((chipc >= EVERGREEN) && util_format_is_depth_or_stencil(ptex->format))
+                       extra_size = align(extra_size + (nblocksx * nblocksy * 1), base_align);
+
                /* align base image and start of miptree */
                if ((i == 0) || (i == 1))
-                       offset = align(offset, r600_get_base_alignment(screen, ptex->format, array_mode));
+                       offset = align(offset, base_align);
                rtex->offset[i] = offset;
                rtex->layer_size[i] = layer_size;
                rtex->pitch_in_blocks[i] = nblocksx; /* CB talks in elements */
@@ -275,7 +280,7 @@ static void r600_setup_miptree(struct pipe_screen *screen,
 
                offset += size;
        }
-       rtex->size = offset;
+       rtex->size = offset + extra_size;
 }
 
 /* Figure out whether u_blitter will fallback to a transfer operation.