[Mesa-dev] [PATCH 8/8] radeonsi: fix stencil setup

Christian König deathsimple at vodafone.de
Sun Jul 29 05:26:53 PDT 2012


Signed-off-by: Christian König <deathsimple at vodafone.de>
---
 src/gallium/drivers/radeonsi/r600_resource.h |    1 -
 src/gallium/drivers/radeonsi/r600_texture.c  |   22 --------
 src/gallium/drivers/radeonsi/si_state.c      |   74 +++++++++++++-------------
 3 files changed, 37 insertions(+), 60 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/r600_resource.h b/src/gallium/drivers/radeonsi/r600_resource.h
index b4427a1..678bf12 100644
--- a/src/gallium/drivers/radeonsi/r600_resource.h
+++ b/src/gallium/drivers/radeonsi/r600_resource.h
@@ -55,7 +55,6 @@ struct r600_resource_texture {
 	unsigned			size;
 	unsigned			depth;
 	unsigned			dirty_db;
-	struct r600_resource_texture    *stencil; /* Stencil is in a separate buffer on Evergreen. */
 	struct r600_resource_texture	*flushed_depth_texture;
 	boolean				is_flushing_texture;
 	struct radeon_surface		surface;
diff --git a/src/gallium/drivers/radeonsi/r600_texture.c b/src/gallium/drivers/radeonsi/r600_texture.c
index 38ff36d..e34247e 100644
--- a/src/gallium/drivers/radeonsi/r600_texture.c
+++ b/src/gallium/drivers/radeonsi/r600_texture.c
@@ -485,9 +485,6 @@ static void r600_texture_destroy(struct pipe_screen *screen,
 	if (rtex->flushed_depth_texture)
 		si_resource_reference(&rtex->flushed_depth_texture, NULL);
 
-	if (rtex->stencil)
-		si_resource_reference(&rtex->stencil, NULL);
-
 	pb_reference(&resource->buf, NULL);
 	FREE(rtex);
 }
@@ -543,19 +540,6 @@ r600_texture_create_object(struct pipe_screen *screen,
 		return NULL;
 	}
 
-	/* If we initialized separate stencil for Evergreen. place it after depth. */
-	if (rtex->stencil) {
-		unsigned stencil_align, stencil_offset;
-
-		stencil_align = r600_get_base_alignment(screen, rtex->stencil->real_format, array_mode);
-		stencil_offset = align(rtex->size, stencil_align);
-
-		for (unsigned i = 0; i <= rtex->stencil->resource.b.b.last_level; i++)
-			rtex->stencil->offset[i] += stencil_offset;
-
-		rtex->size = stencil_offset + rtex->stencil->size;
-	}
-
 	/* Now create the backing buffer. */
 	if (!buf && alloc_bo) {
 		struct pipe_resource *ptex = &rtex->resource.b.b;
@@ -563,7 +547,6 @@ r600_texture_create_object(struct pipe_screen *screen,
 
 		base_align = rtex->surface.bo_alignment;
 		if (!r600_init_resource(rscreen, resource, rtex->size, base_align, base->bind, base->usage)) {
-			si_resource_reference(&rtex->stencil, NULL);
 			FREE(rtex);
 			return NULL;
 		}
@@ -573,11 +556,6 @@ r600_texture_create_object(struct pipe_screen *screen,
 		resource->domains = RADEON_DOMAIN_GTT | RADEON_DOMAIN_VRAM;
 	}
 
-	if (rtex->stencil) {
-		pb_reference(&rtex->stencil->resource.buf, rtex->resource.buf);
-		rtex->stencil->resource.cs_buf = rtex->resource.cs_buf;
-		rtex->stencil->resource.domains = rtex->resource.domains;
-	}
 	return rtex;
 }
 
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index b2dabf5..f35eec6 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1505,8 +1505,8 @@ static void si_db(struct r600_context *rctx, struct si_pm4_state *pm4,
 	struct r600_resource_texture *rtex;
 	struct r600_surface *surf;
 	unsigned level, first_layer, pitch, slice, format;
-	uint32_t db_z_info, stencil_info;
-	uint64_t offset;
+	uint32_t z_info, s_info;
+	uint64_t z_offs, s_offs;
 
 	if (state->zsbuf == NULL) {
 		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
@@ -1521,64 +1521,64 @@ static void si_db(struct r600_context *rctx, struct si_pm4_state *pm4,
 	first_layer = surf->base.u.tex.first_layer;
 	format = si_translate_dbformat(rtex->real_format);
 
-	offset = r600_resource_va(rctx->context.screen, surf->base.texture);
-	offset += rtex->surface.level[level].offset;
+	z_offs = r600_resource_va(rctx->context.screen, surf->base.texture);
+	z_offs += r600_texture_get_offset(rtex, level, first_layer);
+
+	s_offs = z_offs + rtex->surface.stencil_offset;
+
+	z_offs >>= 8;
+	s_offs >>= 8;
+
 	pitch = (rtex->surface.level[level].nblk_x / 8) - 1;
 	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
 	if (slice) {
 		slice = slice - 1;
 	}
-	offset >>= 8;
-
-	si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE);
-	si_pm4_set_reg(pm4, R_028048_DB_Z_READ_BASE, offset);
-	si_pm4_set_reg(pm4, R_028050_DB_Z_WRITE_BASE, offset);
-	si_pm4_set_reg(pm4, R_028008_DB_DEPTH_VIEW,
-		       S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) |
-		       S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer));
 
-	db_z_info = S_028040_FORMAT(format);
-	stencil_info = S_028044_FORMAT(rtex->stencil != 0);
+	z_info = S_028040_FORMAT(format);
+	s_info = S_028044_FORMAT(1);
 
 	switch (format) {
 	case V_028040_Z_16:
-		db_z_info |= S_028040_TILE_MODE_INDEX(5);
-		stencil_info |= S_028044_TILE_MODE_INDEX(5);
+		z_info |= S_028040_TILE_MODE_INDEX(5);
+		s_info |= S_028044_TILE_MODE_INDEX(5);
 		break;
 	case V_028040_Z_24:
 	case V_028040_Z_32_FLOAT:
-		db_z_info |= S_028040_TILE_MODE_INDEX(6);
-		stencil_info |= S_028044_TILE_MODE_INDEX(6);
+		z_info |= S_028040_TILE_MODE_INDEX(6);
+		s_info |= S_028044_TILE_MODE_INDEX(6);
 		break;
 	default:
-		db_z_info |= S_028040_TILE_MODE_INDEX(7);
-		stencil_info |= S_028044_TILE_MODE_INDEX(7);
+		z_info |= S_028040_TILE_MODE_INDEX(7);
+		s_info |= S_028044_TILE_MODE_INDEX(7);
 	}
 
-	if (rtex->stencil) {
-		uint64_t stencil_offset =
-			r600_texture_get_offset(rtex->stencil, level, first_layer);
+	si_pm4_set_reg(pm4, R_028008_DB_DEPTH_VIEW,
+		       S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) |
+		       S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer));
 
-		stencil_offset += r600_resource_va(rctx->context.screen, (void*)rtex->stencil);
-		stencil_offset >>= 8;
+	si_pm4_set_reg(pm4, R_02803C_DB_DEPTH_INFO, 0x1);
+	if (format != ~0U) {
+		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, z_info);
 
-		si_pm4_add_bo(pm4, &rtex->stencil->resource, RADEON_USAGE_READWRITE);
-		si_pm4_set_reg(pm4, R_02804C_DB_STENCIL_READ_BASE, stencil_offset);
-		si_pm4_set_reg(pm4, R_028054_DB_STENCIL_WRITE_BASE, stencil_offset);
-		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, stencil_info);
 	} else {
-		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
+		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
 	}
 
-	if (format != ~0U) {
-		si_pm4_set_reg(pm4, R_02803C_DB_DEPTH_INFO, 0x1);
-		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, db_z_info);
-		si_pm4_set_reg(pm4, R_028058_DB_DEPTH_SIZE, S_028058_PITCH_TILE_MAX(pitch));
-		si_pm4_set_reg(pm4, R_02805C_DB_DEPTH_SLICE, S_02805C_SLICE_TILE_MAX(slice));
-
+	if (rtex->surface.flags & RADEON_SURF_SBUFFER) {
+		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, s_info);
 	} else {
-		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
+		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
 	}
+
+	si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE);
+	si_pm4_set_reg(pm4, R_028048_DB_Z_READ_BASE, z_offs);
+	si_pm4_set_reg(pm4, R_02804C_DB_STENCIL_READ_BASE, s_offs);
+	si_pm4_set_reg(pm4, R_028050_DB_Z_WRITE_BASE, z_offs);
+	si_pm4_set_reg(pm4, R_028054_DB_STENCIL_WRITE_BASE, s_offs);
+
+	si_pm4_set_reg(pm4, R_028058_DB_DEPTH_SIZE, S_028058_PITCH_TILE_MAX(pitch));
+	si_pm4_set_reg(pm4, R_02805C_DB_DEPTH_SLICE, S_02805C_SLICE_TILE_MAX(slice));
 }
 
 static void si_set_framebuffer_state(struct pipe_context *ctx,
-- 
1.7.9.5



More information about the mesa-dev mailing list