[Mesa-stable] [PATCH] radeonsi: update non-resident bindless descriptors if needed
Marek Olšák
maraeo at gmail.com
Fri Aug 11 17:44:21 UTC 2017
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Wed, Aug 9, 2017 at 3:47 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> 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 at gmail.com>
> Cc: "17.2" <mesa-stable at lists.freedesktop.org>
> ---
> src/gallium/drivers/radeonsi/si_descriptors.c | 85 +++++++++++++++++----------
> 1 file changed, 55 insertions(+), 30 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
> index 1e0c422fb4..537dc7fa50 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,
> --
> 2.14.0
>
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-stable
More information about the mesa-stable
mailing list