gallium/radeon: allocate only the required plane for flushed depth
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 30 Jun 2016 15:22:54 +0000 (17:22 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 6 Jul 2016 08:43:52 +0000 (10:43 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/r600_texture.c

index 99c7f35..434bd44 100644 (file)
@@ -1275,12 +1275,43 @@ bool r600_init_flushed_depth_texture(struct pipe_context *ctx,
        struct pipe_resource resource;
        struct r600_texture **flushed_depth_texture = staging ?
                        staging : &rtex->flushed_depth_texture;
+       enum pipe_format pipe_format = texture->format;
+
+       if (!staging) {
+               if (rtex->flushed_depth_texture)
+                       return true; /* it's ready */
+
+               if (!rtex->can_sample_z && rtex->can_sample_s) {
+                       switch (pipe_format) {
+                       case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
+                               /* Save memory by not allocating the S plane. */
+                               pipe_format = PIPE_FORMAT_Z32_FLOAT;
+                               break;
+                       case PIPE_FORMAT_Z24_UNORM_S8_UINT:
+                       case PIPE_FORMAT_S8_UINT_Z24_UNORM:
+                               /* Save memory bandwidth by not copying the
+                                * stencil part during flush.
+                                *
+                                * This potentially increases memory bandwidth
+                                * if an application uses both Z and S texturing
+                                * simultaneously (a flushed Z24S8 texture
+                                * would be stored compactly), but how often
+                                * does that really happen?
+                                */
+                               pipe_format = PIPE_FORMAT_Z24X8_UNORM;
+                               break;
+                       default:;
+                       }
+               } else if (!rtex->can_sample_s && rtex->can_sample_z) {
+                       assert(util_format_has_stencil(util_format_description(pipe_format)));
 
-       if (!staging && rtex->flushed_depth_texture)
-               return true; /* it's ready */
+                       /* DB->CB copies to an 8bpp surface don't work. */
+                       pipe_format = PIPE_FORMAT_X24S8_UINT;
+               }
+       }
 
        resource.target = texture->target;
-       resource.format = texture->format;
+       resource.format = pipe_format;
        resource.width0 = texture->width0;
        resource.height0 = texture->height0;
        resource.depth0 = texture->depth0;