@@ -3237,8 +3237,6 @@ bool CoreChecks::ValidateShaderDescriptorSetAndBindingMappingInfo(const spirv::M
32373237 VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_ARRAY_EXT,
32383238 VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_SHADER_RECORD_INDEX_EXT})) {
32393239 const uint32_t base_opcode = resource_variable.base_type .Opcode ();
3240- // TODO - Seem we are missing the image portion of combined image samplers
3241- const bool is_sampler = resource_variable.is_combined_image_sampler ;
32423240
32433241 struct MappingSourceInfo {
32443242 uint32_t offset = 0 ;
@@ -3248,10 +3246,12 @@ bool CoreChecks::ValidateShaderDescriptorSetAndBindingMappingInfo(const spirv::M
32483246 Field align_field = Field::Empty;
32493247 } info;
32503248
3251- if (is_sampler) {
3252- info.vuid = " VUID-VkDescriptorSetAndBindingMappingEXT-source-11254" ;
3253- info.align = phys_dev_ext_props.descriptor_heap_props .samplerDescriptorAlignment ;
3254- info.align_field = Field::samplerDescriptorAlignment;
3249+ if (base_opcode == spv::OpTypeSampledImage) {
3250+ // VUID being added in
3251+ // https://gitlab.khronos.org/vulkan/vulkan/-/merge_requests/8242
3252+ info.vuid = " UNASSIGNED-VkDescriptorSetAndBindingMappingEXT-combined-image" ;
3253+ info.align = phys_dev_ext_props.descriptor_heap_props .imageDescriptorAlignment ;
3254+ info.align_field = Field::imageDescriptorAlignment;
32553255 } else if (base_opcode == spv::OpTypeImage) {
32563256 info.vuid = " VUID-VkDescriptorSetAndBindingMappingEXT-source-11251" ;
32573257 info.align = phys_dev_ext_props.descriptor_heap_props .imageDescriptorAlignment ;
@@ -3274,45 +3274,86 @@ bool CoreChecks::ValidateShaderDescriptorSetAndBindingMappingInfo(const spirv::M
32743274
32753275 if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_CONSTANT_OFFSET_EXT) {
32763276 const auto & source_data = mapping.sourceData .constantOffset ;
3277- info.offset = is_sampler ? source_data. samplerHeapOffset : source_data.heapOffset ;
3278- info.array_stride = is_sampler ? source_data. samplerHeapArrayStride : source_data.heapArrayStride ;
3277+ info.offset = source_data.heapOffset ;
3278+ info.array_stride = source_data.heapArrayStride ;
32793279 } else if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_PUSH_INDEX_EXT) {
32803280 const auto & source_data = mapping.sourceData .pushIndex ;
3281- info.offset = is_sampler ? source_data. samplerHeapOffset : source_data.heapOffset ;
3282- info.array_stride = is_sampler ? source_data. samplerHeapArrayStride : source_data.heapArrayStride ;
3281+ info.offset = source_data.heapOffset ;
3282+ info.array_stride = source_data.heapArrayStride ;
32833283 } else if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_EXT) {
32843284 const auto & source_data = mapping.sourceData .indirectIndex ;
3285- info.offset = is_sampler ? source_data. samplerHeapOffset : source_data.heapOffset ;
3286- info.array_stride = is_sampler ? source_data. samplerHeapArrayStride : source_data.heapArrayStride ;
3285+ info.offset = source_data.heapOffset ;
3286+ info.array_stride = source_data.heapArrayStride ;
32873287 } else if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_ARRAY_EXT) {
32883288 const auto & source_data = mapping.sourceData .indirectIndexArray ;
3289- info.offset = is_sampler ? source_data. samplerHeapOffset : source_data.heapOffset ;
3289+ info.offset = source_data.heapOffset ;
32903290 } else if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_SHADER_RECORD_INDEX_EXT) {
32913291 const auto & source_data = mapping.sourceData .shaderRecordIndex ;
3292- info.offset = is_sampler ? source_data. samplerHeapOffset : source_data.heapOffset ;
3293- info.array_stride = is_sampler ? source_data. samplerHeapArrayStride : source_data.heapArrayStride ;
3292+ info.offset = source_data.heapOffset ;
3293+ info.array_stride = source_data.heapArrayStride ;
32943294 }
32953295
32963296 if (!IsIntegerMultipleOf (info.offset , info.align ) || !IsIntegerMultipleOf (info.array_stride , info.align )) {
32973297 const Field source_field = vvl::Field_VkDescriptorMappingSourceDataEXT (mapping.source );
3298- const Field offset_field = is_sampler ? Field::samplerHeapOffset : Field::heapOffset;
3299- const Field stride_field = is_sampler ? Field::samplerHeapArrayStride : Field::heapArrayStride;
33003298
33013299 std::stringstream ss;
33023300 ss << " (" << string_VkDescriptorMappingSourceEXT (mapping.source ) << " ) is used to map descriptor "
33033301 << resource_variable.DescribeDescriptor () << " in " << entrypoint.Describe () << " but it is unaligned.\n "
3304- << String (source_field) << " ." << String (offset_field) << " (" << info.offset << " ) " ;
3302+ << String (source_field) << " .heapOffset (" << info.offset << " ) " ;
33053303 if (mapping.source != VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_ARRAY_EXT) {
3306- ss << " and " << String (source_field) << " ." << String (stride_field) << " (" << info.array_stride
3307- << " ) both " ;
3304+ ss << " and " << String (source_field) << " .heapArrayStride (" << info.array_stride << " ) both " ;
33083305 }
3309- ss << " must be aligned with " << String (info.align_field ) << " (" << info.align << " )" ;
3306+ ss << " must be zero or aligned with " << String (info.align_field ) << " (" << info.align << " )" ;
33103307
33113308 skip |= LogError (
33123309 info.vuid , module_state.handle (),
33133310 loc.pNext (Struct::VkShaderDescriptorSetAndBindingMappingInfoEXT, Field::pMappings, i).dot (Field::source),
33143311 " %s" , ss.str ().c_str ());
33153312 }
3313+
3314+ // Combined Image Sampler is only spot we need to check twice
3315+ if (base_opcode == spv::OpTypeSampledImage) {
3316+ if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_CONSTANT_OFFSET_EXT) {
3317+ const auto & source_data = mapping.sourceData .constantOffset ;
3318+ info.offset = source_data.samplerHeapOffset ;
3319+ info.array_stride = source_data.samplerHeapArrayStride ;
3320+ } else if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_PUSH_INDEX_EXT) {
3321+ const auto & source_data = mapping.sourceData .pushIndex ;
3322+ info.offset = source_data.samplerHeapOffset ;
3323+ info.array_stride = source_data.samplerHeapArrayStride ;
3324+ } else if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_EXT) {
3325+ const auto & source_data = mapping.sourceData .indirectIndex ;
3326+ info.offset = source_data.samplerHeapOffset ;
3327+ info.array_stride = source_data.samplerHeapArrayStride ;
3328+ } else if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_ARRAY_EXT) {
3329+ const auto & source_data = mapping.sourceData .indirectIndexArray ;
3330+ info.offset = source_data.samplerHeapOffset ;
3331+ } else if (mapping.source == VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_SHADER_RECORD_INDEX_EXT) {
3332+ const auto & source_data = mapping.sourceData .shaderRecordIndex ;
3333+ info.offset = source_data.samplerHeapOffset ;
3334+ info.array_stride = source_data.samplerHeapArrayStride ;
3335+ }
3336+
3337+ info.align = phys_dev_ext_props.descriptor_heap_props .samplerDescriptorAlignment ;
3338+
3339+ if (!IsIntegerMultipleOf (info.offset , info.align ) || !IsIntegerMultipleOf (info.array_stride , info.align )) {
3340+ const Field source_field = vvl::Field_VkDescriptorMappingSourceDataEXT (mapping.source );
3341+
3342+ std::stringstream ss;
3343+ ss << " (" << string_VkDescriptorMappingSourceEXT (mapping.source ) << " ) is used to map descriptor "
3344+ << resource_variable.DescribeDescriptor () << " in " << entrypoint.Describe () << " but it is unaligned.\n "
3345+ << String (source_field) << " .samplerHeapOffset (" << info.offset << " ) " ;
3346+ if (mapping.source != VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_ARRAY_EXT) {
3347+ ss << " and " << String (source_field) << " .samplerHeapArrayStride (" << info.array_stride << " ) both " ;
3348+ }
3349+ ss << " must be zero or aligned with samplerDescriptorAlignment (" << info.align << " )" ;
3350+
3351+ skip |= LogError (" VUID-VkDescriptorSetAndBindingMappingEXT-source-11254" , module_state.handle (),
3352+ loc.pNext (Struct::VkShaderDescriptorSetAndBindingMappingInfoEXT, Field::pMappings, i)
3353+ .dot (Field::source),
3354+ " %s" , ss.str ().c_str ());
3355+ }
3356+ }
33163357 } else if (IsValueIn (mapping.source ,
33173358 {VK_DESCRIPTOR_MAPPING_SOURCE_PUSH_DATA_EXT, VK_DESCRIPTOR_MAPPING_SOURCE_SHADER_RECORD_DATA_EXT,
33183359 VK_DESCRIPTOR_MAPPING_SOURCE_RESOURCE_HEAP_DATA_EXT})) {
0 commit comments