OSDN Git Service

radeonsi: Use stencil surface level information for stencil texturing
authorMichel Dänzer <michel.daenzer@amd.com>
Fri, 15 Feb 2013 10:30:50 +0000 (11:30 +0100)
committerMichel Dänzer <michel@daenzer.net>
Mon, 18 Feb 2013 14:58:37 +0000 (15:58 +0100)
7 more little dwarves^W piglits.

NOTE: This is a candidate for the 9.1 branch.

src/gallium/drivers/radeonsi/r600_texture.c
src/gallium/drivers/radeonsi/si_state.c

index 3f75adb..e8d9932 100644 (file)
@@ -153,8 +153,7 @@ static int r600_init_surface(struct r600_screen *rscreen,
                surface->flags |= RADEON_SURF_SCANOUT;
        }
 
-       if ((ptex->bind & PIPE_BIND_DEPTH_STENCIL) &&
-           !is_flushed_depth && is_depth) {
+       if (!is_flushed_depth && is_depth) {
                surface->flags |= RADEON_SURF_ZBUFFER;
 
                if (is_stencil) {
index 0c2ea86..09665b5 100644 (file)
@@ -2088,6 +2088,7 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx
        unsigned char state_swizzle[4], swizzle[4];
        unsigned height, depth, width;
        enum pipe_format pipe_format = state->format;
+       struct radeon_surface_level *surflevel;
        int first_non_void;
        uint64_t va;
 
@@ -2107,6 +2108,8 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx
        state_swizzle[2] = state->swizzle_b;
        state_swizzle[3] = state->swizzle_a;
 
+       surflevel = tmp->surface.level;
+
        /* Texturing with separate depth and stencil. */
        if (tmp->is_depth && !tmp->is_flushing_texture) {
                switch (pipe_format) {
@@ -2122,6 +2125,7 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx
                case PIPE_FORMAT_S8X24_UINT:
                case PIPE_FORMAT_X32_S8X24_UINT:
                        pipe_format = PIPE_FORMAT_S8_UINT;
+                       surflevel = tmp->surface.stencil_level;
                        break;
                default:;
                }
@@ -2194,10 +2198,10 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx
        /* not supported any more */
        //endian = si_colorformat_endian_swap(format);
 
-       width = tmp->surface.level[0].npix_x;
-       height = tmp->surface.level[0].npix_y;
-       depth = tmp->surface.level[0].npix_z;
-       pitch = tmp->surface.level[0].nblk_x * util_format_get_blockwidth(pipe_format);
+       width = surflevel[0].npix_x;
+       height = surflevel[0].npix_y;
+       depth = surflevel[0].npix_z;
+       pitch = surflevel[0].nblk_x * util_format_get_blockwidth(pipe_format);
 
        if (texture->target == PIPE_TEXTURE_1D_ARRAY) {
                height = 1;
@@ -2207,7 +2211,7 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx
        }
 
        va = r600_resource_va(ctx->screen, texture);
-       va += tmp->surface.level[0].offset;
+       va += surflevel[0].offset;
        view->state[0] = va >> 8;
        view->state[1] = (S_008F14_BASE_ADDRESS_HI(va >> 40) |
                          S_008F14_DATA_FORMAT(format) |