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

si_decompress_textures() is now 5x faster.

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 06a99fbc8a2a4fd9df590b54b0380282123414ba..b240c4d355e5f1ed4ddbbeffcb8800cf7a25995d 100644 (file)
@@ -693,18 +693,13 @@ static void si_check_render_feedback(struct si_context *sctx)
 
 static void si_decompress_resident_textures(struct si_context *sctx)
 {
-       util_dynarray_foreach(&sctx->resident_tex_handles,
+       util_dynarray_foreach(&sctx->resident_tex_needs_color_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;
 
-               if (view->texture->target == PIPE_BUFFER)
-                       continue;
-
-               if ((*tex_handle)->needs_color_decompress)
-                       si_decompress_color_texture(sctx, tex, view->u.tex.first_level,
-                                                   view->u.tex.last_level);
+               si_decompress_color_texture(sctx, tex, view->u.tex.first_level,
+                                           view->u.tex.last_level);
        }
 
        util_dynarray_foreach(&sctx->resident_tex_needs_depth_decompress,
@@ -722,17 +717,13 @@ static void si_decompress_resident_textures(struct si_context *sctx)
 
 static void si_decompress_resident_images(struct si_context *sctx)
 {
-       util_dynarray_foreach(&sctx->resident_img_handles,
+       util_dynarray_foreach(&sctx->resident_img_needs_color_decompress,
                              struct si_image_handle *, img_handle) {
                struct pipe_image_view *view = &(*img_handle)->view;
                struct r600_texture *tex = (struct r600_texture *)view->resource;
 
-               if (view->resource->target == PIPE_BUFFER)
-                       continue;
-
-               if ((*img_handle)->needs_color_decompress)
-                       si_decompress_color_texture(sctx, tex, view->u.tex.level,
-                                                   view->u.tex.level);
+               si_decompress_color_texture(sctx, tex, view->u.tex.level,
+                                           view->u.tex.level);
        }
 }
 
index a8f54e0714abb73612afe9c05ba39853a75c3e33..cb9c47c0d8351392f4668f9e9395645191227555 100644 (file)
@@ -1617,29 +1617,40 @@ static void si_set_polygon_stipple(struct pipe_context *ctx,
 static void
 si_resident_handles_update_needs_color_decompress(struct si_context *sctx)
 {
+       util_dynarray_clear(&sctx->resident_tex_needs_color_decompress);
+       util_dynarray_clear(&sctx->resident_img_needs_color_decompress);
+
        util_dynarray_foreach(&sctx->resident_tex_handles,
                              struct si_texture_handle *, tex_handle) {
                struct pipe_resource *res = (*tex_handle)->view->texture;
+               struct r600_texture *rtex;
 
-               if (res && res->target != PIPE_BUFFER) {
-                       struct r600_texture *rtex = (struct r600_texture *)res;
+               if (!res || res->target == PIPE_BUFFER)
+                       continue;
 
-                       (*tex_handle)->needs_color_decompress =
-                               color_needs_decompression(rtex);
-               }
+               rtex = (struct r600_texture *)res;
+               if (!color_needs_decompression(rtex))
+                       continue;
+
+               util_dynarray_append(&sctx->resident_tex_needs_color_decompress,
+                                    struct si_texture_handle *, *tex_handle);
        }
 
        util_dynarray_foreach(&sctx->resident_img_handles,
                              struct si_image_handle *, img_handle) {
                struct pipe_image_view *view = &(*img_handle)->view;
                struct pipe_resource *res = view->resource;
+               struct r600_texture *rtex;
 
-               if (res && res->target != PIPE_BUFFER) {
-                       struct r600_texture *rtex = (struct r600_texture *)res;
+               if (!res || res->target == PIPE_BUFFER)
+                       continue;
 
-                       (*img_handle)->needs_color_decompress =
-                               color_needs_decompression(rtex);
-               }
+               rtex = (struct r600_texture *)res;
+               if (!color_needs_decompression(rtex))
+                       continue;
+
+               util_dynarray_append(&sctx->resident_img_needs_color_decompress,
+                                    struct si_image_handle *, *img_handle);
        }
 }
 
@@ -2359,8 +2370,12 @@ static void si_make_texture_handle_resident(struct pipe_context *ctx,
                                        tex_handle);
                        }
 
-                       tex_handle->needs_color_decompress =
-                               color_needs_decompression(rtex);
+                       if (color_needs_decompression(rtex)) {
+                               util_dynarray_append(
+                                       &sctx->resident_tex_needs_color_decompress,
+                                       struct si_texture_handle *,
+                                       tex_handle);
+                       }
 
                        if (rtex->dcc_offset &&
                            p_atomic_read(&rtex->framebuffers_bound))
@@ -2396,6 +2411,10 @@ static void si_make_texture_handle_resident(struct pipe_context *ctx,
                        util_dynarray_delete_unordered(
                                &sctx->resident_tex_needs_depth_decompress,
                                struct si_texture_handle *, tex_handle);
+
+                       util_dynarray_delete_unordered(
+                               &sctx->resident_tex_needs_color_decompress,
+                               struct si_texture_handle *, tex_handle);
                }
        }
 }
@@ -2471,6 +2490,7 @@ static void si_make_image_handle_resident(struct pipe_context *ctx,
        struct si_context *sctx = (struct si_context *)ctx;
        struct si_image_handle *img_handle;
        struct pipe_image_view *view;
+       struct r600_resource *res;
        struct hash_entry *entry;
 
        entry = _mesa_hash_table_search(sctx->img_handles, (void *)handle);
@@ -2479,17 +2499,19 @@ static void si_make_image_handle_resident(struct pipe_context *ctx,
 
        img_handle = (struct si_image_handle *)entry->data;
        view = &img_handle->view;
+       res = (struct r600_resource *)view->resource;
 
        if (resident) {
-               struct r600_resource *res =
-                       (struct r600_resource *)view->resource;
-
                if (res->b.b.target != PIPE_BUFFER) {
                        struct r600_texture *rtex = (struct r600_texture *)res;
                        unsigned level = view->u.tex.level;
 
-                       img_handle->needs_color_decompress =
-                               color_needs_decompression(rtex);
+                       if (color_needs_decompression(rtex)) {
+                               util_dynarray_append(
+                                       &sctx->resident_img_needs_color_decompress,
+                                       struct si_image_handle *,
+                                       img_handle);
+                       }
 
                        if (vi_dcc_enabled(rtex, level) &&
                            p_atomic_read(&rtex->framebuffers_bound))
@@ -2521,6 +2543,13 @@ static void si_make_image_handle_resident(struct pipe_context *ctx,
                util_dynarray_delete_unordered(&sctx->resident_img_handles,
                                               struct si_image_handle *,
                                               img_handle);
+
+               if (res->b.b.target != PIPE_BUFFER) {
+                       util_dynarray_delete_unordered(
+                               &sctx->resident_img_needs_color_decompress,
+                               struct si_image_handle *,
+                               img_handle);
+               }
        }
 }
 
index fbb410746c6f85c08d94f761cb7880720116832c..d4e6d42bc21221c2ec5079b1fce3702a4ddafe01 100644 (file)
@@ -103,6 +103,8 @@ 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_needs_color_decompress);
+       util_dynarray_fini(&sctx->resident_img_needs_color_decompress);
        util_dynarray_fini(&sctx->resident_tex_needs_depth_decompress);
        FREE(sctx);
 }
@@ -343,6 +345,8 @@ 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_needs_color_decompress, NULL);
+       util_dynarray_init(&sctx->resident_img_needs_color_decompress, NULL);
        util_dynarray_init(&sctx->resident_tex_needs_depth_decompress, NULL);
 
        return &sctx->b.b;
index 3834cea893fa3204908c23ca6a47d8e25ae1e2db..afe68a3d35d26367dcf458367599c16b24f96726 100644 (file)
@@ -243,14 +243,12 @@ struct si_texture_handle
 {
        struct si_bindless_descriptor   *desc;
        struct pipe_sampler_view        *view;
-       bool                            needs_color_decompress;
 };
 
 struct si_image_handle
 {
        struct si_bindless_descriptor   *desc;
        struct pipe_image_view          view;
-       bool                            needs_color_decompress;
 };
 
 struct si_context {
@@ -432,6 +430,8 @@ struct si_context {
        struct util_dynarray    resident_img_handles;
 
        /* Resident bindless handles which need decompression */
+       struct util_dynarray    resident_tex_needs_color_decompress;
+       struct util_dynarray    resident_img_needs_color_decompress;
        struct util_dynarray    resident_tex_needs_depth_decompress;
 
        /* Bindless state */