Signed-off-by: Christian König <deathsim...@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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to