Mesa (master): r600g: fix fbo depth/ stencil texture allocation for evergreen+

Alex Deucher agd5f at kemper.freedesktop.org
Tue Jun 21 21:33:28 UTC 2011


Module: Mesa
Branch: master
Commit: 21972c85ea734dbfcf69629c6b0b940efb42d4ba
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=21972c85ea734dbfcf69629c6b0b940efb42d4ba

Author: Alex Deucher <alexdeucher at gmail.com>
Date:   Tue Jun 21 17:31:14 2011 -0400

r600g: fix fbo depth/stencil texture allocation for evergreen+

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 at gmail.com>

---

 src/gallium/drivers/r600/r600_texture.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
index 470d26e..8c98a5a 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -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.




More information about the mesa-commit mailing list