diff options
author | Dave Airlie <[email protected]> | 2017-11-03 04:06:35 +0000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-11-06 19:12:39 +0000 |
commit | 4bcb48b8319fd8185a326bbd1f77191bddd35506 (patch) | |
tree | e95cd136ad43ad11b16e06726b360fd48e264ff4 | |
parent | 71f5fe36b7f4f092398d27a130ef18b7e0913889 (diff) |
radv: add initial copy descriptor support. (v2)
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.
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Reviewed-by: Andres Rodriguez <[email protected]>
Cc: "17.2 17.3" <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
-rw-r--r-- | src/amd/vulkan/radv_descriptor_set.c | 55 |
1 files 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( |