Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
On Sat, Nov 4, 2017 at 9:15 PM, Dave Airlie <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@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-sta...@lists.freedesktop.org> > Signed-off-by: Dave Airlie <airl...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev