@@ -555,12 +555,11 @@ bool cvdescriptorset::DescriptorSet::ValidateDrawState(const std::map<uint32_t,
555555 return true ;
556556}
557557
558- // For given bindings, place any update buffers or images into the passed-in unordered_sets
559- uint32_t cvdescriptorset::DescriptorSet::GetReadWriteBuffersAndImages (const std::map<uint32_t , descriptor_req> &bindings,
560- std::unordered_set<VkBuffer> *read_buffer_set,
561- std::unordered_set<VkImageView> *read_image_set,
562- std::unordered_set<VkBuffer> *write_buffer_set,
563- std::unordered_set<VkImageView> *write_image_set) const {
558+ // For given bindings, place any active buffers or images into the passed-in vectors
559+ // TODO: Currently just adding entire binding as imprecise update, but ideally would limit access based on view
560+ uint32_t cvdescriptorset::DescriptorSet::AddReadWriteBuffersAndImages (const std::map<uint32_t , descriptor_req> &bindings,
561+ CMD_TYPE cmd, std::vector<MemoryAccess> *read_access_vector,
562+ std::vector<MemoryAccess> *write_access_vector) const {
564563 auto num_updates = 0 ;
565564 for (auto binding_pair : bindings) {
566565 auto binding = binding_pair.first ;
@@ -569,49 +568,71 @@ uint32_t cvdescriptorset::DescriptorSet::GetReadWriteBuffersAndImages(const std:
569568 continue ;
570569 }
571570 auto start_idx = p_layout_->GetGlobalStartIndexFromBinding (binding);
572- auto &buffer_set = read_buffer_set;
573- auto &image_set = read_image_set;
571+ const auto descriptor_count = p_layout_->GetDescriptorCountFromBinding (binding);
572+ auto &update_vector = read_access_vector;
573+ auto update_function = &AddReadMemoryAccess;
574574 if (descriptors_[start_idx]->IsStorage ()) {
575- buffer_set = write_buffer_set ;
576- image_set = write_image_set ;
575+ update_vector = write_access_vector ;
576+ update_function = &AddWriteMemoryAccess ;
577577 }
578578 switch (descriptors_[start_idx]->descriptor_class ) {
579579 case (Image): {
580- for (uint32_t i = 0 ; i < p_layout_-> GetDescriptorCountFromBinding (binding) ; ++i) {
580+ for (uint32_t i = 0 ; i < descriptor_count ; ++i) {
581581 if (descriptors_[start_idx + i]->updated ) {
582- image_set->insert (static_cast <ImageDescriptor *>(descriptors_[start_idx + i].get ())->GetImageView ());
583- num_updates++;
582+ auto image_view = static_cast <ImageDescriptor *>(descriptors_[start_idx + i].get ())->GetImageView ();
583+ auto image_view_state = GetImageViewState (device_data_, image_view);
584+ if (image_view_state) {
585+ auto image_node = GetImageState (device_data_, image_view_state->create_info .image );
586+ if (image_node) {
587+ update_function (cmd, update_vector, image_node->binding , false );
588+ num_updates++;
589+ }
590+ }
584591 }
585592 }
586593 break ;
587594 }
588595 case (ImageSampler): {
589- for (uint32_t i = 0 ; i < p_layout_-> GetDescriptorCountFromBinding (binding) ; ++i) {
596+ for (uint32_t i = 0 ; i < descriptor_count ; ++i) {
590597 if (descriptors_[start_idx + i]->updated ) {
591- image_set->insert (static_cast <ImageSamplerDescriptor *>(descriptors_[start_idx + i].get ())->GetImageView ());
592- num_updates++;
598+ auto image_view = static_cast <ImageSamplerDescriptor *>(descriptors_[start_idx + i].get ())->GetImageView ();
599+ auto image_view_state = GetImageViewState (device_data_, image_view);
600+ if (image_view_state) {
601+ auto image_node = GetImageState (device_data_, image_view_state->create_info .image );
602+ if (image_node) {
603+ update_function (cmd, update_vector, image_node->binding , false );
604+ num_updates++;
605+ }
606+ }
593607 }
594608 }
595609 break ;
596610 }
597611 case (TexelBuffer): {
598- for (uint32_t i = 0 ; i < p_layout_-> GetDescriptorCountFromBinding (binding) ; ++i) {
612+ for (uint32_t i = 0 ; i < descriptor_count ; ++i) {
599613 if (descriptors_[start_idx + i]->updated ) {
600614 auto bufferview = static_cast <TexelDescriptor *>(descriptors_[start_idx + i].get ())->GetBufferView ();
601615 auto bv_state = GetBufferViewState (device_data_, bufferview);
602616 if (bv_state) {
603- buffer_set->insert (bv_state->create_info .buffer );
604- num_updates++;
617+ auto buff_state = GetBufferState (device_data_, bv_state->create_info .buffer );
618+ if (buff_state) {
619+ update_function (cmd, update_vector, buff_state->binding , false );
620+ num_updates++;
621+ }
605622 }
606623 }
607624 }
608625 break ;
609626 }
610627 case (GeneralBuffer): {
611- for (uint32_t i = 0 ; i < p_layout_-> GetDescriptorCountFromBinding (binding) ; ++i) {
628+ for (uint32_t i = 0 ; i < descriptor_count ; ++i) {
612629 if (descriptors_[start_idx + i]->updated ) {
613- buffer_set->insert (static_cast <BufferDescriptor *>(descriptors_[start_idx + i].get ())->GetBuffer ());
614- num_updates++;
630+ auto buff_state = GetBufferState (
631+ device_data_, static_cast <BufferDescriptor *>(descriptors_[start_idx + i].get ())->GetBuffer ());
632+ if (buff_state) {
633+ update_function (cmd, update_vector, buff_state->binding , false );
634+ num_updates++;
635+ }
615636 }
616637 }
617638 break ;
0 commit comments