radeonsi: update non-resident bindless descriptors if needed
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 9 Aug 2017 13:47:22 +0000 (15:47 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 21 Aug 2017 13:23:56 +0000 (15:23 +0200)
Only resident bindless descriptors are currently updated and
re-uploaded, this makes sure that the non-resident ones are
also updated.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Cc: "17.2" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_descriptors.c

index 1e0c422fb4b39010a6685c56346dd86c8a92fe24..537dc7fa508f52d5f3f4e2003ef42be24733a459 100644 (file)
@@ -1997,45 +1997,55 @@ static void si_upload_bindless_descriptors(struct si_context *sctx)
 }
 
 /* Update mutable image descriptor fields of all resident textures. */
-static void si_update_all_resident_texture_descriptors(struct si_context *sctx)
+static void si_update_resident_texture_descriptor(struct si_context *sctx,
+                                                 struct si_texture_handle *tex_handle)
 {
-       util_dynarray_foreach(&sctx->resident_tex_handles,
-                             struct si_texture_handle *, tex_handle) {
-               struct si_bindless_descriptor *desc = (*tex_handle)->desc;
-               struct si_sampler_view *sview =
-                       (struct si_sampler_view *)(*tex_handle)->view;
-               uint32_t desc_list[16];
+       struct si_sampler_view *sview = (struct si_sampler_view *)tex_handle->view;
+       struct si_bindless_descriptor *desc = tex_handle->desc;
+       uint32_t desc_list[16];
 
-               if (sview->base.texture->target == PIPE_BUFFER)
-                       continue;
+       if (sview->base.texture->target == PIPE_BUFFER)
+               return;
 
-               memcpy(desc_list, desc->desc_list, sizeof(desc_list));
-               si_set_sampler_view_desc(sctx, sview, &(*tex_handle)->sstate,
-                                        &desc->desc_list[0]);
+       memcpy(desc_list, desc->desc_list, sizeof(desc_list));
+       si_set_sampler_view_desc(sctx, sview, &tex_handle->sstate,
+                                &desc->desc_list[0]);
 
-               if (memcmp(desc_list, desc->desc_list, sizeof(desc_list))) {
-                       desc->dirty = true;
-                       sctx->bindless_descriptors_dirty = true;
-               }
+       if (memcmp(desc_list, desc->desc_list, sizeof(desc_list))) {
+               desc->dirty = true;
+               sctx->bindless_descriptors_dirty = true;
        }
+}
 
-       util_dynarray_foreach(&sctx->resident_img_handles,
-                             struct si_image_handle *, img_handle) {
-               struct si_bindless_descriptor *desc = (*img_handle)->desc;
-               struct pipe_image_view *view = &(*img_handle)->view;
-               uint32_t desc_list[16];
+static void si_update_resident_image_descriptor(struct si_context *sctx,
+                                               struct si_image_handle *img_handle)
+{
+       struct si_bindless_descriptor *desc = img_handle->desc;
+       struct pipe_image_view *view = &img_handle->view;
+       uint32_t desc_list[16];
 
-               if (view->resource->target == PIPE_BUFFER)
-                       continue;
+       if (view->resource->target == PIPE_BUFFER)
+               return;
 
-               memcpy(desc_list, desc->desc_list, sizeof(desc_list));
-               si_set_shader_image_desc(sctx, view, true,
-                                        &desc->desc_list[0]);
+       memcpy(desc_list, desc->desc_list, sizeof(desc_list));
+       si_set_shader_image_desc(sctx, view, true, &desc->desc_list[0]);
 
-               if (memcmp(desc_list, desc->desc_list, sizeof(desc_list))) {
-                       desc->dirty = true;
-                       sctx->bindless_descriptors_dirty = true;
-               }
+       if (memcmp(desc_list, desc->desc_list, sizeof(desc_list))) {
+               desc->dirty = true;
+               sctx->bindless_descriptors_dirty = true;
+       }
+}
+
+static void si_update_all_resident_texture_descriptors(struct si_context *sctx)
+{
+       util_dynarray_foreach(&sctx->resident_tex_handles,
+                             struct si_texture_handle *, tex_handle) {
+               si_update_resident_texture_descriptor(sctx, *tex_handle);
+       }
+
+       util_dynarray_foreach(&sctx->resident_img_handles,
+                             struct si_image_handle *, img_handle) {
+               si_update_resident_image_descriptor(sctx, *img_handle);
        }
 
        si_upload_bindless_descriptors(sctx);
@@ -2513,6 +2523,13 @@ static void si_make_texture_handle_resident(struct pipe_context *ctx,
                        if (rtex->dcc_offset &&
                            p_atomic_read(&rtex->framebuffers_bound))
                                sctx->need_check_render_feedback = true;
+
+                       /* Re-upload the descriptor if it has been updated
+                        * while it wasn't resident.
+                        */
+                       si_update_resident_texture_descriptor(sctx, tex_handle);
+                       if (tex_handle->desc->dirty)
+                               sctx->bindless_descriptors_dirty = true;
                } else {
                        si_invalidate_bindless_buf_desc(sctx, tex_handle->desc,
                                                        sview->base.texture,
@@ -2649,6 +2666,14 @@ static void si_make_image_handle_resident(struct pipe_context *ctx,
                        if (vi_dcc_enabled(rtex, level) &&
                            p_atomic_read(&rtex->framebuffers_bound))
                                sctx->need_check_render_feedback = true;
+
+                       /* Re-upload the descriptor if it has been updated
+                        * while it wasn't resident.
+                        */
+                       si_update_resident_image_descriptor(sctx, img_handle);
+                       if (img_handle->desc->dirty)
+                               sctx->bindless_descriptors_dirty = true;
+
                } else {
                        si_invalidate_bindless_buf_desc(sctx, img_handle->desc,
                                                        view->resource,