[Mesa-dev] [PATCH] radv: add initial copy descriptor support. (v2)
Bas Nieuwenhuizen
bas at basnieuwenhuizen.nl
Mon Nov 6 19:03:26 UTC 2017
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
On Sat, Nov 4, 2017 at 9:15 PM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> It appears the latest dota2 vulkan uses this,
> and we get a hang in VR mode without it.
>
> v2: remove finishme I left in after finishing.
>
> Cc: "17.2 17.3" <mesa-stable at lists.freedesktop.org>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/amd/vulkan/radv_descriptor_set.c | 55 ++++++++++++++++++++++++++++++++++--
> 1 file changed, 53 insertions(+), 2 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c
> index 317a2b37c43..424756c13f5 100644
> --- a/src/amd/vulkan/radv_descriptor_set.c
> +++ b/src/amd/vulkan/radv_descriptor_set.c
> @@ -757,8 +757,59 @@ void radv_update_descriptor_sets(
> }
>
> }
> - if (descriptorCopyCount)
> - radv_finishme("copy descriptors");
> +
> + for (i = 0; i < descriptorCopyCount; i++) {
> + const VkCopyDescriptorSet *copyset = &pDescriptorCopies[i];
> + RADV_FROM_HANDLE(radv_descriptor_set, src_set,
> + copyset->srcSet);
> + RADV_FROM_HANDLE(radv_descriptor_set, dst_set,
> + copyset->dstSet);
> + const struct radv_descriptor_set_binding_layout *src_binding_layout =
> + src_set->layout->binding + copyset->srcBinding;
> + const struct radv_descriptor_set_binding_layout *dst_binding_layout =
> + dst_set->layout->binding + copyset->dstBinding;
> + uint32_t *src_ptr = src_set->mapped_ptr;
> + uint32_t *dst_ptr = dst_set->mapped_ptr;
> + struct radeon_winsys_bo **src_buffer_list = src_set->descriptors;
> + struct radeon_winsys_bo **dst_buffer_list = dst_set->descriptors;
> +
> + src_ptr += src_binding_layout->offset / 4;
> + dst_ptr += dst_binding_layout->offset / 4;
> +
> + src_ptr += src_binding_layout->size * copyset->srcArrayElement / 4;
> + dst_ptr += dst_binding_layout->size * copyset->dstArrayElement / 4;
> +
> + src_buffer_list += src_binding_layout->buffer_offset;
> + src_buffer_list += copyset->srcArrayElement;
> +
> + dst_buffer_list += dst_binding_layout->buffer_offset;
> + dst_buffer_list += copyset->dstArrayElement;
> +
> + for (j = 0; j < copyset->descriptorCount; ++j) {
> + switch (src_binding_layout->type) {
> + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
> + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
> + unsigned src_idx = copyset->srcArrayElement + j;
> + unsigned dst_idx = copyset->dstArrayElement + j;
> + struct radv_descriptor_range *src_range, *dst_range;
> + src_idx += src_binding_layout->dynamic_offset_offset;
> + dst_idx += dst_binding_layout->dynamic_offset_offset;
> +
> + src_range = src_set->dynamic_descriptors + src_idx;
> + dst_range = dst_set->dynamic_descriptors + dst_idx;
> + *dst_range = *src_range;
> + break;
> + }
> + default:
> + memcpy(dst_ptr, src_ptr, src_binding_layout->size);
> + }
> + src_ptr += src_binding_layout->size / 4;
> + dst_ptr += dst_binding_layout->size / 4;
> + dst_buffer_list[j] = src_buffer_list[j];
> + ++src_buffer_list;
> + ++dst_buffer_list;
> + }
> + }
> }
>
> void radv_UpdateDescriptorSets(
> --
> 2.14.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list