From: Nicolai Hähnle <nicolai.haeh...@amd.com>

Reviewed-by: Marek Olšák <marek.ol...@amd.com>
---
 src/gallium/drivers/radeon/r600_texture.c | 37 ++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 99c7f35..434bd44 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -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;
-- 
2.7.4

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

Reply via email to