radeonsi: reduce overhead for resident textures which need depth decompression
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 14 Jun 2017 11:55:11 +0000 (13:55 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sun, 18 Jun 2017 12:10:36 +0000 (14:10 +0200)
This is done by introducing a separate list.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_blit.c
src/gallium/drivers/radeonsi/si_descriptors.c
src/gallium/drivers/radeonsi/si_pipe.c
src/gallium/drivers/radeonsi/si_pipe.h

index bfce5a411f14a347ed788f43321c0333984ab94b..06a99fbc8a2a4fd9df590b54b0380282123414ba 100644 (file)
@@ -705,12 +705,18 @@ static void si_decompress_resident_textures(struct si_context *sctx)
                if ((*tex_handle)->needs_color_decompress)
                        si_decompress_color_texture(sctx, tex, view->u.tex.first_level,
                                                    view->u.tex.last_level);
                if ((*tex_handle)->needs_color_decompress)
                        si_decompress_color_texture(sctx, tex, view->u.tex.first_level,
                                                    view->u.tex.last_level);
+       }
 
 
-               if ((*tex_handle)->needs_depth_decompress)
-                       si_decompress_depth(sctx, tex,
-                               sview->is_stencil_sampler ? PIPE_MASK_S : PIPE_MASK_Z,
-                               view->u.tex.first_level, view->u.tex.last_level,
-                               0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level));
+       util_dynarray_foreach(&sctx->resident_tex_needs_depth_decompress,
+                             struct si_texture_handle *, tex_handle) {
+               struct pipe_sampler_view *view = (*tex_handle)->view;
+               struct si_sampler_view *sview = (struct si_sampler_view *)view;
+               struct r600_texture *tex = (struct r600_texture *)view->texture;
+
+               si_decompress_depth(sctx, tex,
+                       sview->is_stencil_sampler ? PIPE_MASK_S : PIPE_MASK_Z,
+                       view->u.tex.first_level, view->u.tex.last_level,
+                       0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level));
        }
 }
 
        }
 }
 
index 90c4a9e5571f16f440815cbdcd70df375155242c..a8f54e0714abb73612afe9c05ba39853a75c3e33 100644 (file)
@@ -2352,8 +2352,13 @@ static void si_make_texture_handle_resident(struct pipe_context *ctx,
                        struct r600_texture *rtex =
                                (struct r600_texture *)sview->base.texture;
 
                        struct r600_texture *rtex =
                                (struct r600_texture *)sview->base.texture;
 
-                       tex_handle->needs_depth_decompress =
-                               depth_needs_decompression(rtex, sview);
+                       if (depth_needs_decompression(rtex, sview)) {
+                               util_dynarray_append(
+                                       &sctx->resident_tex_needs_depth_decompress,
+                                       struct si_texture_handle *,
+                                       tex_handle);
+                       }
+
                        tex_handle->needs_color_decompress =
                                color_needs_decompression(rtex);
 
                        tex_handle->needs_color_decompress =
                                color_needs_decompression(rtex);
 
@@ -2386,6 +2391,12 @@ static void si_make_texture_handle_resident(struct pipe_context *ctx,
                util_dynarray_delete_unordered(&sctx->resident_tex_handles,
                                               struct si_texture_handle *,
                                               tex_handle);
                util_dynarray_delete_unordered(&sctx->resident_tex_handles,
                                               struct si_texture_handle *,
                                               tex_handle);
+
+               if (sview->base.texture->target != PIPE_BUFFER) {
+                       util_dynarray_delete_unordered(
+                               &sctx->resident_tex_needs_depth_decompress,
+                               struct si_texture_handle *, tex_handle);
+               }
        }
 }
 
        }
 }
 
index 9f6e3c26f43fe034ecc5effc04bb57c8b48f8dc3..fbb410746c6f85c08d94f761cb7880720116832c 100644 (file)
@@ -103,6 +103,7 @@ static void si_destroy_context(struct pipe_context *context)
 
        util_dynarray_fini(&sctx->resident_tex_handles);
        util_dynarray_fini(&sctx->resident_img_handles);
 
        util_dynarray_fini(&sctx->resident_tex_handles);
        util_dynarray_fini(&sctx->resident_img_handles);
+       util_dynarray_fini(&sctx->resident_tex_needs_depth_decompress);
        FREE(sctx);
 }
 
        FREE(sctx);
 }
 
@@ -342,6 +343,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
 
        util_dynarray_init(&sctx->resident_tex_handles, NULL);
        util_dynarray_init(&sctx->resident_img_handles, NULL);
 
        util_dynarray_init(&sctx->resident_tex_handles, NULL);
        util_dynarray_init(&sctx->resident_img_handles, NULL);
+       util_dynarray_init(&sctx->resident_tex_needs_depth_decompress, NULL);
 
        return &sctx->b.b;
 fail:
 
        return &sctx->b.b;
 fail:
index 427ac1c83ae2acf0106cc7cb348fea16ecd035fc..3834cea893fa3204908c23ca6a47d8e25ae1e2db 100644 (file)
@@ -244,7 +244,6 @@ struct si_texture_handle
        struct si_bindless_descriptor   *desc;
        struct pipe_sampler_view        *view;
        bool                            needs_color_decompress;
        struct si_bindless_descriptor   *desc;
        struct pipe_sampler_view        *view;
        bool                            needs_color_decompress;
-       bool                            needs_depth_decompress;
 };
 
 struct si_image_handle
 };
 
 struct si_image_handle
@@ -432,6 +431,9 @@ struct si_context {
        struct util_dynarray    resident_tex_handles;
        struct util_dynarray    resident_img_handles;
 
        struct util_dynarray    resident_tex_handles;
        struct util_dynarray    resident_img_handles;
 
+       /* Resident bindless handles which need decompression */
+       struct util_dynarray    resident_tex_needs_depth_decompress;
+
        /* Bindless state */
        bool                    uses_bindless_samplers;
        bool                    uses_bindless_images;
        /* Bindless state */
        bool                    uses_bindless_samplers;
        bool                    uses_bindless_images;