@@ -552,12 +552,11 @@ bool cvdescriptorset::DescriptorSet::ValidateDrawState(const std::map<uint32_t,
552552 return true ;
553553}
554554
555- // For given bindings, place any update buffers or images into the passed-in unordered_sets
556- uint32_t cvdescriptorset::DescriptorSet::GetReadWriteBuffersAndImages (const std::map<uint32_t , descriptor_req> &bindings,
557- std::unordered_set<VkBuffer> *read_buffer_set,
558- std::unordered_set<VkImageView> *read_image_set,
559- std::unordered_set<VkBuffer> *write_buffer_set,
560- std::unordered_set<VkImageView> *write_image_set) const {
555+ // For given bindings, place any active buffers or images into the passed-in vectors
556+ // TODO: Currently just adding entire binding as imprecise update, but ideally would limit access based on view
557+ uint32_t cvdescriptorset::DescriptorSet::AddReadWriteBuffersAndImages (const std::map<uint32_t , descriptor_req> &bindings,
558+ CMD_TYPE cmd, std::vector<MemoryAccess> *read_access_vector,
559+ std::vector<MemoryAccess> *write_access_vector) const {
561560 auto num_updates = 0 ;
562561 for (auto binding_pair : bindings) {
563562 auto binding = binding_pair.first ;
@@ -566,27 +565,41 @@ uint32_t cvdescriptorset::DescriptorSet::GetReadWriteBuffersAndImages(const std:
566565 continue ;
567566 }
568567 auto start_idx = p_layout_->GetGlobalStartIndexFromBinding (binding);
569- auto &buffer_set = read_buffer_set ;
570- auto &image_set = read_image_set ;
568+ auto &update_vector = read_access_vector ;
569+ auto update_function = &AddReadMemoryAccess ;
571570 if (descriptors_[start_idx]->IsStorage ()) {
572- buffer_set = write_buffer_set ;
573- image_set = write_image_set ;
571+ update_vector = write_access_vector ;
572+ update_function = &AddWriteMemoryAccess ;
574573 }
575574 switch (descriptors_[start_idx]->descriptor_class ) {
576575 case (Image): {
577576 for (uint32_t i = 0 ; i < p_layout_->GetDescriptorCountFromBinding (binding); ++i) {
578577 if (descriptors_[start_idx + i]->updated ) {
579- image_set->insert (static_cast <ImageDescriptor *>(descriptors_[start_idx + i].get ())->GetImageView ());
580- num_updates++;
578+ auto image_view = static_cast <ImageDescriptor *>(descriptors_[start_idx + i].get ())->GetImageView ();
579+ auto image_view_state = GetImageViewState (device_data_, image_view);
580+ if (image_view_state) {
581+ auto image_node = GetImageState (device_data_, image_view_state->create_info .image );
582+ if (image_node) {
583+ update_function (cmd, update_vector, image_node->binding , false );
584+ num_updates++;
585+ }
586+ }
581587 }
582588 }
583589 break ;
584590 }
585591 case (ImageSampler): {
586592 for (uint32_t i = 0 ; i < p_layout_->GetDescriptorCountFromBinding (binding); ++i) {
587593 if (descriptors_[start_idx + i]->updated ) {
588- image_set->insert (static_cast <ImageSamplerDescriptor *>(descriptors_[start_idx + i].get ())->GetImageView ());
589- num_updates++;
594+ auto image_view = static_cast <ImageSamplerDescriptor *>(descriptors_[start_idx + i].get ())->GetImageView ();
595+ auto image_view_state = GetImageViewState (device_data_, image_view);
596+ if (image_view_state) {
597+ auto image_node = GetImageState (device_data_, image_view_state->create_info .image );
598+ if (image_node) {
599+ update_function (cmd, update_vector, image_node->binding , false );
600+ num_updates++;
601+ }
602+ }
590603 }
591604 }
592605 break ;
@@ -597,8 +610,11 @@ uint32_t cvdescriptorset::DescriptorSet::GetReadWriteBuffersAndImages(const std:
597610 auto bufferview = static_cast <TexelDescriptor *>(descriptors_[start_idx + i].get ())->GetBufferView ();
598611 auto bv_state = GetBufferViewState (device_data_, bufferview);
599612 if (bv_state) {
600- buffer_set->insert (bv_state->create_info .buffer );
601- num_updates++;
613+ auto buff_state = GetBufferState (device_data_, bv_state->create_info .buffer );
614+ if (buff_state) {
615+ update_function (cmd, update_vector, buff_state->binding , false );
616+ num_updates++;
617+ }
602618 }
603619 }
604620 }
@@ -607,8 +623,12 @@ uint32_t cvdescriptorset::DescriptorSet::GetReadWriteBuffersAndImages(const std:
607623 case (GeneralBuffer): {
608624 for (uint32_t i = 0 ; i < p_layout_->GetDescriptorCountFromBinding (binding); ++i) {
609625 if (descriptors_[start_idx + i]->updated ) {
610- buffer_set->insert (static_cast <BufferDescriptor *>(descriptors_[start_idx + i].get ())->GetBuffer ());
611- num_updates++;
626+ auto buff_state = GetBufferState (
627+ device_data_, static_cast <BufferDescriptor *>(descriptors_[start_idx + i].get ())->GetBuffer ());
628+ if (buff_state) {
629+ update_function (cmd, update_vector, buff_state->binding , false );
630+ num_updates++;
631+ }
612632 }
613633 }
614634 break ;
0 commit comments