summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorSamuel Pitoiset <[email protected]>2017-08-09 15:47:22 +0200
committerSamuel Pitoiset <[email protected]>2017-08-21 15:23:56 +0200
commit2843c5d15cf7c051d6aaf0744c3c1c7d4a734184 (patch)
tree721eb7cfee35262ac393d3b835ebbbe1d17a0bca /src/gallium
parent498814a3ca66f17aa1c74d844873551467dc9336 (diff)
radeonsi: update non-resident bindless descriptors if needed
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 <[email protected]> Cc: "17.2" <[email protected]> Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/radeonsi/si_descriptors.c85
1 files changed, 55 insertions, 30 deletions
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index 1e0c422fb4b..537dc7fa508 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -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,