From: Marek Olšák <marek.ol...@amd.com>

This might not be stricly needed, but better safe than sorry.
---
 src/gallium/drivers/radeonsi/si_descriptors.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c 
b/src/gallium/drivers/radeonsi/si_descriptors.c
index b9fae79..b1a8594 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -403,24 +403,20 @@ static void si_set_sampler_view(struct si_context *sctx,
        struct si_sampler_view *rview = (struct si_sampler_view*)view;
        struct si_descriptors *descs = si_sampler_descriptors(sctx, shader);
 
        if (views->views[slot] == view && !disallow_early_out)
                return;
 
        if (view) {
                struct r600_texture *rtex = (struct r600_texture 
*)view->texture;
                uint32_t *desc = descs->list + slot * 16;
 
-               si_sampler_view_add_buffer(sctx, view->texture,
-                                          RADEON_USAGE_READ,
-                                          rview->is_stencil_sampler, true);
-
                pipe_sampler_view_reference(&views->views[slot], view);
                memcpy(desc, rview->state, 8*4);
 
                if (view->texture && view->texture->target != PIPE_BUFFER) {
                        bool is_separate_stencil =
                                rtex->db_compatible &&
                                rview->is_stencil_sampler;
 
                        si_set_mutable_tex_desc_fields(rtex,
                                                       rview->base_level_info,
@@ -439,20 +435,26 @@ static void si_set_sampler_view(struct si_context *sctx,
                        /* Disable FMASK and bind sampler state in [12:15]. */
                        memcpy(desc + 8,
                               null_texture_descriptor, 4*4);
 
                        if (views->sampler_states[slot])
                                memcpy(desc + 12,
                                       views->sampler_states[slot], 4*4);
                }
 
                views->enabled_mask |= 1u << slot;
+
+               /* Since this can flush, it must be done after enabled_mask is
+                * updated. */
+               si_sampler_view_add_buffer(sctx, view->texture,
+                                          RADEON_USAGE_READ,
+                                          rview->is_stencil_sampler, true);
        } else {
                pipe_sampler_view_reference(&views->views[slot], NULL);
                memcpy(descs->list + slot*16, null_texture_descriptor, 8*4);
                /* Only clear the lower dwords of FMASK. */
                memcpy(descs->list + slot*16 + 8, null_texture_descriptor, 4*4);
                views->enabled_mask &= ~(1u << slot);
        }
 
        descs->dirty_mask |= 1u << slot;
        sctx->descriptors_dirty |= 1u << si_sampler_descriptors_idx(shader);
@@ -620,23 +622,20 @@ static void si_set_shader_image(struct si_context *ctx,
        if (!view || !view->resource) {
                si_disable_shader_image(ctx, shader, slot);
                return;
        }
 
        res = (struct r600_resource *)view->resource;
 
        if (&images->views[slot] != view)
                util_copy_image_view(&images->views[slot], view);
 
-       si_sampler_view_add_buffer(ctx, &res->b.b,
-                                  RADEON_USAGE_READWRITE, false, true);
-
        if (res->b.b.target == PIPE_BUFFER) {
                if (view->access & PIPE_IMAGE_ACCESS_WRITE)
                        si_mark_image_range_valid(view);
 
                si_make_buffer_descriptor(screen, res,
                                          view->format,
                                          view->u.buf.offset,
                                          view->u.buf.size,
                                          descs->list + slot * 8);
                images->compressed_colortex_mask &= ~(1 << slot);
@@ -695,20 +694,24 @@ static void si_set_shader_image(struct si_context *ctx,
                                           desc, NULL);
                si_set_mutable_tex_desc_fields(tex, &tex->surface.level[level],
                                               level, level,
                                               
util_format_get_blockwidth(view->format),
                                               false, desc);
        }
 
        images->enabled_mask |= 1u << slot;
        descs->dirty_mask |= 1u << slot;
        ctx->descriptors_dirty |= 1u << si_image_descriptors_idx(shader);
+
+       /* Since this can flush, it must be done after enabled_mask is updated. 
*/
+       si_sampler_view_add_buffer(ctx, &res->b.b,
+                                  RADEON_USAGE_READWRITE, false, true);
 }
 
 static void
 si_set_shader_images(struct pipe_context *pipe,
                     enum pipe_shader_type shader,
                     unsigned start_slot, unsigned count,
                     const struct pipe_image_view *views)
 {
        struct si_context *ctx = (struct si_context *)pipe;
        unsigned i, slot;
-- 
2.7.4

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

Reply via email to