@@ -102,8 +102,11 @@ std::string DescriptorValidator::DescribeDescriptor(const spirv::ResourceInterfa
102
102
break ;
103
103
}
104
104
105
- ss << " descriptor [" << FormatHandle (descriptor_set.Handle ()) << " , Set " << set_index << " , Binding "
106
- << resource_variable.decorations .binding << " , Index " << index;
105
+ ss << " descriptor [" ;
106
+ if (!descriptor_set.IsPushDescriptor ()) {
107
+ ss << FormatHandle (descriptor_set.Handle ()) << " , " ;
108
+ }
109
+ ss << " Set " << set_index << " , Binding " << resource_variable.decorations .binding << " , Index " << index;
107
110
108
111
// If multiple variables tied to a binding, don't attempt to detect which one
109
112
if (!resource_variable.debug_name .empty ()) {
@@ -534,21 +537,28 @@ bool DescriptorValidator::ValidateDescriptor(const spirv::ResourceInterfaceVaria
534
537
// Verify Image Layout
535
538
// No "invalid layout" VUID required for this call, since the optimal_layout parameter is UNDEFINED.
536
539
bool hit_error = false ;
537
- dev_proxy.VerifyImageLayout (cb_state, *image_view_state, image_layout, loc.Get (),
538
- " VUID-VkDescriptorImageInfo-imageLayout-00344" , &hit_error);
539
- if (hit_error) {
540
- std::stringstream msg;
541
- if (!descriptor_set.IsPushDescriptor ()) {
542
- msg << " Descriptor set " << FormatHandle (descriptor_set.Handle ())
543
- << " Image layout specified by vkCmdBindDescriptorSets doesn't match actual image layout at time "
544
- " descriptor is used." ;
545
- } else {
546
- msg << " Image layout specified by vkCmdPushDescriptorSet doesn't match actual image layout at time "
547
- " descriptor is used." ;
540
+ if (const auto image_layout_map = cb_state.GetImageLayoutMap (image_state->VkHandle ())) {
541
+ dev_proxy.VerifyImageLayoutRange (cb_state, *image_state, image_view_state->create_info .subresourceRange .aspectMask ,
542
+ image_layout, *image_layout_map,
543
+ subresource_adapter::RangeGenerator (image_view_state->range_generator ), loc.Get (),
544
+ " VUID-VkDescriptorImageInfo-imageLayout-00344" , &hit_error);
545
+
546
+ if (hit_error) {
547
+ std::stringstream msg;
548
+ if (!descriptor_set.IsPushDescriptor ()) {
549
+ msg << " Descriptor set " << FormatHandle (descriptor_set.Handle ())
550
+ << " Image layout specified by vkCmdBindDescriptorSets " ;
551
+ } else {
552
+ msg << " Image layout specified by vkCmdPushDescriptorSet " ;
553
+ }
554
+ msg << " doesn't match actual image layout at time descriptor ("
555
+ << DescribeDescriptor (resource_variable, index, descriptor_type) << " ) is used." ;
556
+ // TODO - This is bad, VerifyImageLayoutRange should be able to return a bool (or pass info into it) and only have a
557
+ // single VU here https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/10730
558
+ msg << " See previous error callback for specific details." << DescribeInstruction ();
559
+ const LogObjectList objlist (cb_state.Handle (), this ->objlist , descriptor_set.Handle (), image_view);
560
+ skip |= LogError (vuids->descriptor_buffer_bit_set_08114 , objlist, loc.Get (), " %s." , msg.str ().c_str ());
548
561
}
549
- msg << " See previous error callback for specific details." << DescribeInstruction ();
550
- const LogObjectList objlist (cb_state.Handle (), this ->objlist , descriptor_set.Handle (), image_view);
551
- skip |= LogError (vuids->descriptor_buffer_bit_set_08114 , objlist, loc.Get (), " %s." , msg.str ().c_str ());
552
562
}
553
563
}
554
564
0 commit comments