radeonsi: Fix z/stencil texture creation.
authorJerome Glisse <jglisse@redhat.com>
Tue, 13 Nov 2012 16:41:59 +0000 (17:41 +0100)
committerMichel Dänzer <michel@daenzer.net>
Wed, 28 Nov 2012 12:35:16 +0000 (13:35 +0100)
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
[ Cherry-picked from r600g commit b4f0ab0b22625ac1bb3cf16342039557c086ebae ]

src/gallium/drivers/radeonsi/r600_texture.c

index 8fae79200b68330acc7d248a166531aeb1f994d1..183827bfd04288507c6d81e63c1c2220f3ee4dcd 100644 (file)
@@ -75,7 +75,7 @@ static unsigned r600_texture_get_offset(struct r600_resource_texture *rtex,
 
 static int r600_init_surface(struct radeon_surface *surface,
                             const struct pipe_resource *ptex,
-                            unsigned array_mode)
+                            unsigned array_mode, bool is_transfer)
 {
        surface->npix_x = ptex->width0;
        surface->npix_y = ptex->height0;
@@ -136,7 +136,7 @@ static int r600_init_surface(struct radeon_surface *surface,
        if (ptex->bind & PIPE_BIND_SCANOUT) {
                surface->flags |= RADEON_SURF_SCANOUT;
        }
-       if (util_format_is_depth_and_stencil(ptex->format)) {
+       if (util_format_is_depth_and_stencil(ptex->format) && !is_transfer) {
                surface->flags |= RADEON_SURF_ZBUFFER;
                surface->flags |= RADEON_SURF_SBUFFER;
        }
@@ -152,11 +152,6 @@ static int r600_setup_surface(struct pipe_screen *screen,
        struct r600_screen *rscreen = (struct r600_screen*)screen;
        int r;
 
-       if (util_format_is_depth_or_stencil(rtex->real_format)) {
-               rtex->surface.flags |= RADEON_SURF_ZBUFFER;
-               rtex->surface.flags |= RADEON_SURF_SBUFFER;
-       }
-
        r = rscreen->ws->surface_init(rscreen->ws, &rtex->surface);
        if (r) {
                return r;
@@ -514,7 +509,8 @@ struct pipe_resource *si_texture_create(struct pipe_screen *screen,
        }
 #endif
 
-       r = r600_init_surface(&surface, templ, array_mode);
+       r = r600_init_surface(&surface, templ, array_mode,
+                             templ->flags & R600_RESOURCE_FLAG_TRANSFER);
        if (r) {
                return NULL;
        }
@@ -595,7 +591,7 @@ struct pipe_resource *si_texture_from_handle(struct pipe_screen *screen,
        else
                array_mode = V_009910_ARRAY_LINEAR_ALIGNED;
 
-       r = r600_init_surface(&surface, templ, array_mode);
+       r = r600_init_surface(&surface, templ, array_mode, 0);
        if (r) {
                return NULL;
        }