Mesa (9.0): r600g: fix possible issue with stencil mipmap rendering

Marek Olšák mareko at kemper.freedesktop.org
Sat Oct 6 03:44:22 UTC 2012


Module: Mesa
Branch: 9.0
Commit: 7851d398def2df3f6836a500d67123eed50f3943
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7851d398def2df3f6836a500d67123eed50f3943

Author: Marek Olšák <maraeo at gmail.com>
Date:   Sat Oct  6 05:23:47 2012 +0200

r600g: fix possible issue with stencil mipmap rendering

Somehow I only hit this issue with my latest libdrm changes.
This won't be needed with DB texturing.

NOTE: This is a candidate for the 9.0 branch.
(cherry picked from commit 9dfca930d7fcfda6767d3be9b1690d010f08fea5)

---

 src/gallium/drivers/r600/evergreen_state.c |   13 ++++++++++++-
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index feeff10..6bf4247 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -1491,13 +1491,24 @@ static void evergreen_init_depth_surface(struct r600_context *rctx,
 
 	if (rtex->surface.flags & RADEON_SURF_SBUFFER) {
 		uint64_t stencil_offset = rtex->surface.stencil_offset;
-		unsigned stile_split = rtex->surface.stencil_tile_split;
+		unsigned i, stile_split = rtex->surface.stencil_tile_split;
 
 		stile_split = eg_tile_split(stile_split);
 		stencil_offset += r600_resource_va(screen, surf->base.texture);
 		stencil_offset += rtex->surface.level[level].offset / 4;
 		stencil_offset >>= 8;
 
+		/* We're guessing the stencil offset from the depth offset.
+		 * Make sure each mipmap level has a unique offset. */
+		for (i = 1; i <= level; i++) {
+			/* If two levels have the same address, add 256
+			 * to the offset of the smaller level. */
+			if ((rtex->surface.level[i-1].offset / 4) >> 8 ==
+			    (rtex->surface.level[i].offset / 4) >> 8) {
+				stencil_offset++;
+			}
+		}
+
 		surf->db_stencil_base = stencil_offset;
 		surf->db_stencil_info = 1 | S_028044_TILE_SPLIT(stile_split);
 	} else {




More information about the mesa-commit mailing list