diff options
author | Marek Olšák <[email protected]> | 2016-09-12 12:49:34 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2016-09-13 20:38:25 +0200 |
commit | fd69fa65a8fc2d3cd2a99ee7519a7e8eb18228c7 (patch) | |
tree | 7502d2ec446d4d4b4bb00a76667e0df4b9028025 | |
parent | 275c073c6a49eacac85c21dc618d3c577f4d0495 (diff) |
radeonsi: add sampler view BOs to the BO list last
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 <[email protected]>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_descriptors.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index b9fae79c577..b1a8594c87e 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -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 |