radeonsi: add sampler view BOs to the BO list last
authorMarek Olšák <marek.olsak@amd.com>
Mon, 12 Sep 2016 10:49:34 +0000 (12:49 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 13 Sep 2016 18:38:25 +0000 (20:38 +0200)
If si_sampler_view_add_buffer ends up flushing, then the code
in begin_new_cs would previously have added the buffer(s) for
whatever was previously bound to that slot. Now it would add only
the new buffer.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_descriptors.c

index b9fae79c57772b9f9a18d3aa175ecaed79e3ef0b..b1a8594c87e3ddde4bd1e4b9018f511c96a18395 100644 (file)
@@ -410,10 +410,6 @@ static void si_set_sampler_view(struct si_context *sctx,
                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);
 
@@ -446,6 +442,12 @@ static void si_set_sampler_view(struct si_context *sctx,
                }
 
                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);
@@ -627,9 +629,6 @@ static void si_set_shader_image(struct si_context *ctx,
        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);
@@ -702,6 +701,10 @@ static void si_set_shader_image(struct si_context *ctx,
        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