@@ -1504,6 +1504,7 @@ vvl::DecodedTemplateUpdate::DecodedTemplateUpdate(const vvl::DeviceState &device
15041504 inline_infos.resize (create_info.descriptorUpdateEntryCount ); // Make sure we have one if we need it
15051505 inline_infos_khr.resize (create_info.descriptorUpdateEntryCount );
15061506 inline_infos_nv.resize (create_info.descriptorUpdateEntryCount );
1507+ inline_infos_ptlas.resize (create_info.descriptorUpdateEntryCount );
15071508 desc_writes.reserve (create_info.descriptorUpdateEntryCount ); // emplaced, so reserved without initialization
15081509 VkDescriptorSetLayout effective_dsl = create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET
15091510 ? create_info.descriptorSetLayout
@@ -1594,6 +1595,17 @@ vvl::DecodedTemplateUpdate::DecodedTemplateUpdate(const vvl::DeviceState &device
15941595 write_entry.descriptorCount = inline_info_nv->accelerationStructureCount ;
15951596 break ;
15961597 }
1598+ case VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV: {
1599+ VkWriteDescriptorSetPartitionedAccelerationStructureNV *inline_info_ptlas = &inline_infos_ptlas[i];
1600+ inline_info_ptlas->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_PARTITIONED_ACCELERATION_STRUCTURE_NV;
1601+ inline_info_ptlas->pNext = nullptr ;
1602+ inline_info_ptlas->accelerationStructureCount = descriptor_update_entry.descriptorCount ;
1603+ inline_info_ptlas->pAccelerationStructures = reinterpret_cast <const VkDeviceAddress *>(update_entry);
1604+ write_entry.pNext = inline_info_ptlas;
1605+ // descriptorCount must match the accelerationStructureCount
1606+ write_entry.descriptorCount = inline_info_ptlas->accelerationStructureCount ;
1607+ break ;
1608+ }
15971609 default :
15981610 assert (false );
15991611 break ;
@@ -1603,7 +1615,8 @@ vvl::DecodedTemplateUpdate::DecodedTemplateUpdate(const vvl::DeviceState &device
16031615 // If acceleration structure, we only create a single VkWriteDescriptorSet and map the actually AS into
16041616 // VkWriteDescriptorSetAccelerationStructureKHR
16051617 if (descriptor_update_entry.descriptorType == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR ||
1606- descriptor_update_entry.descriptorType == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV) {
1618+ descriptor_update_entry.descriptorType == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV ||
1619+ descriptor_update_entry.descriptorType == VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV) {
16071620 break ;
16081621 }
16091622 }
@@ -5475,8 +5488,7 @@ bool CoreChecks::PreCallValidateWriteResourceDescriptorsEXT(VkDevice device, uin
54755488 skip |=
54765489 ValidateDeviceAddressRange (address_range.address , address_range.size , false , data_loc.dot (Field::pAddressRange),
54775490 LogObjectList (device), buffer_usage, usage_vuid);
5478- } else if (resource.type == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR ||
5479- resource.type == VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV) {
5491+ } else if (resource.type == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) {
54805492 // TODO - not sure what this covers that VUID-VkResourceDescriptorInfoEXT-type-11484 doesn't
54815493 if (auto as_array = GetAccelerationStructuresByAddress (address_range.address ); as_array.empty ()) {
54825494 std::stringstream ss;
@@ -5496,6 +5508,13 @@ bool CoreChecks::PreCallValidateWriteResourceDescriptorsEXT(VkDevice device, uin
54965508 skip |= LogError (" VUID-VkResourceDescriptorInfoEXT-type-11483" , device,
54975509 data_loc.dot (Field::pAddressRange).dot (Field::address), " %s" , ss.str ().c_str ());
54985510 }
5511+ } else if (resource.type == VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV) {
5512+ // PTLAS uses buffer addresses directly, not VkAccelerationStructureKHR objects
5513+ // Validate that the address points to a buffer with ACCELERATION_STRUCTURE_STORAGE_BIT
5514+ skip |= ValidateDeviceAddressRange (address_range.address , address_range.size , false ,
5515+ data_loc.dot (Field::pAddressRange), LogObjectList (device),
5516+ VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR,
5517+ " VUID-VkResourceDescriptorInfoEXT-type-11483" );
54995518 } else if (resource.type == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV) {
55005519 if (address_range.size != 0 ) {
55015520 skip |= LogError (" VUID-VkResourceDescriptorInfoEXT-type-11468" , device,
0 commit comments