Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vulkaninfo: Support 2-call structs in codegen for pNext chains #1003

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 44 additions & 16 deletions scripts/vulkaninfo_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,7 @@
{'extends': 'VkPhysicalDeviceProperties2',
'type': EXTENSION_TYPE_BOTH,
'holder_type': 'VkPhysicalDeviceProperties2',
'print_iterator': True,
'exclude': ['VkPhysicalDeviceHostImageCopyPropertiesEXT', 'VkPhysicalDeviceLayeredApiPropertiesListKHR']}),
'print_iterator': True}),
('phys_device_mem_props2',
{'extends': 'VkPhysicalDeviceMemoryProperties2',
'type': EXTENSION_TYPE_DEVICE,
Expand All @@ -131,7 +130,9 @@
'type': EXTENSION_TYPE_BOTH,
'holder_type': 'VkSurfaceCapabilities2KHR',
'print_iterator': True,
'exclude': ['VkSurfacePresentScalingCapabilitiesEXT', 'VkSurfacePresentModeCompatibilityEXT']}),
'exclude': [# VK_EXT_surface_maintenance1 is difficult to code-gen
'VkSurfacePresentScalingCapabilitiesEXT', 'VkSurfacePresentModeCompatibilityEXT'
]}),
('format_properties2',
{'extends': 'VkFormatProperties2',
'type': EXTENSION_TYPE_DEVICE,
Expand Down Expand Up @@ -318,7 +319,7 @@ def endFile(self):
out += PrintBitMaskToString(bitmask, flag.name, self)

for s in (x for x in self.all_structures if x.name in types_to_gen and x.name not in STRUCT_BLACKLIST):
out += PrintStructure(s, types_to_gen)
out += PrintStructure(s)

for key, value in EXTENSION_CATEGORIES.items():
out += PrintChainStruct(key, self.extension_sets[key], self.all_structures, value, self.extTypes, self.aliases, self.vulkan_versions)
Expand Down Expand Up @@ -600,7 +601,7 @@ def PrintBitMaskToString(bitmask, name, generator):
return out


def PrintStructure(struct, types_to_gen):
def PrintStructure(struct):
if len(struct.members) == 0:
return ''
out = ''
Expand Down Expand Up @@ -655,21 +656,12 @@ def PrintStructure(struct, types_to_gen):
out += f' for (uint32_t i = 0; i < {v.arrayLength}; i++) {{ p.PrintElement(obj.{v.name}[i]); }}\n'
out += ' }\n'
else: # dynamic array length based on other member
out += f' if (obj.{v.arrayLength} == 0) {{\n'
out += f' if (obj.{v.arrayLength} == 0 || obj.{v.name} == nullptr) {{\n'
out += f' p.PrintKeyString("{v.name}", "NULL");\n'
out += ' } else {\n'
out += f' ArrayWrapper arr(p,"{v.name}", obj.{v.arrayLength});\n'
out += f' for (uint32_t i = 0; i < obj.{v.arrayLength}; i++) {{\n'
if v.typeID in types_to_gen:
out += f' if (obj.{v.name} != nullptr) {{\n'
out += ' p.SetElementIndex(i);\n'
out += ' if (p.Type() == OutputType::json)\n'
out += f' p.PrintString(std::string("VK_") + {v.typeID}String(obj.{v.name}[i]));\n'
out += ' else\n'
out += f' p.PrintString({v.typeID}String(obj.{v.name}[i]));\n'
out += ' }\n'
else:
out += f' p.PrintElement(obj.{v.name}[i]);\n'
out += f' Dump{v.typeID}(p, std::to_string(i), obj.{v.name}[i]);\n'
out += ' }\n'
out += ' }\n'
elif v.typeID == 'VkBool32':
Expand Down Expand Up @@ -750,6 +742,10 @@ def PrintChainStruct(listName, structures, all_structures, chain_details, extTyp
# members which don't exist.
if s.name in ['VkPhysicalDeviceShaderIntegerDotProductFeatures', 'VkPhysicalDeviceHostImageCopyFeaturesEXT']:
out += f' char {s.name}_padding[64];\n'
if s.hasLengthmember:
for member in s.members:
if member.lengthMember:
out += f' std::vector<{member.typeID}> {s.name}_{member.name};\n'
out += AddGuardFooter(s)
out += ' void initialize_chain('
if chain_details.get('type') in [EXTENSION_TYPE_INSTANCE, EXTENSION_TYPE_BOTH]:
Expand Down Expand Up @@ -919,6 +915,32 @@ def PrintChainStruct(listName, structures, all_structures, chain_details, extTyp
out += ' }\n'
out += '}\n'

should_print_twocall_func = False
for s in structs_to_print:
if not s.hasLengthmember:
continue
if s.name in STRUCT_BLACKLIST:
continue
should_print_twocall_func = True

if not should_print_twocall_func:
return out

out += '\n'
out += f'void prepare_{listName}_twocall_chain_vectors(std::unique_ptr<{listName}_chain>& chain) {{\n'
for s in structs_to_print:
if not s.hasLengthmember:
continue
if s.name in STRUCT_BLACKLIST:
continue
out += AddGuardHeader(s)
for member in s.members:
if member.lengthMember:
out += f' chain->{s.name}_{member.name}.resize(chain->{s.name[2:]}.{member.arrayLength});\n'
out += f' chain->{s.name[2:]}.{member.name} = chain->{s.name}_{member.name}.data();\n'
out += AddGuardFooter(s)
out += '}\n'

return out


Expand Down Expand Up @@ -1112,12 +1134,18 @@ def __init__(self, name, rootNode, constants, extTypes):
self.guard = None
self.sTypeName = None
self.extendsStruct = rootNode.get('structextends')
self.hasLengthmember = False

for node in rootNode.findall('member'):
if node.get('values') is not None:
self.sTypeName = node.get('values')
self.members.append(VulkanVariable(node, constants))

for member in self.members:
if member.lengthMember:
self.hasLengthmember = True
break

for k, elem in extTypes.items():
if k == self.name:
for e in elem:
Expand Down
99 changes: 75 additions & 24 deletions vulkaninfo/generated/vulkaninfo.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,22 @@ void DumpVkImageTiling(Printer &p, std::string name, VkImageTiling value) {
else
p.PrintKeyString(name, VkImageTilingString(value));
}
std::string VkPhysicalDeviceLayeredApiKHRString(VkPhysicalDeviceLayeredApiKHR value) {
switch (value) {
case (VK_PHYSICAL_DEVICE_LAYERED_API_VULKAN_KHR): return "PHYSICAL_DEVICE_LAYERED_API_VULKAN_KHR";
case (VK_PHYSICAL_DEVICE_LAYERED_API_D3D12_KHR): return "PHYSICAL_DEVICE_LAYERED_API_D3D12_KHR";
case (VK_PHYSICAL_DEVICE_LAYERED_API_METAL_KHR): return "PHYSICAL_DEVICE_LAYERED_API_METAL_KHR";
case (VK_PHYSICAL_DEVICE_LAYERED_API_OPENGL_KHR): return "PHYSICAL_DEVICE_LAYERED_API_OPENGL_KHR";
case (VK_PHYSICAL_DEVICE_LAYERED_API_OPENGLES_KHR): return "PHYSICAL_DEVICE_LAYERED_API_OPENGLES_KHR";
default: return std::string("UNKNOWN_VkPhysicalDeviceLayeredApiKHR_value") + std::to_string(value);
}
}
void DumpVkPhysicalDeviceLayeredApiKHR(Printer &p, std::string name, VkPhysicalDeviceLayeredApiKHR value) {
if (p.Type() == OutputType::json)
p.PrintKeyString(name, std::string("VK_") + VkPhysicalDeviceLayeredApiKHRString(value));
else
p.PrintKeyString(name, VkPhysicalDeviceLayeredApiKHRString(value));
}
std::string VkPhysicalDeviceTypeString(VkPhysicalDeviceType value) {
switch (value) {
case (VK_PHYSICAL_DEVICE_TYPE_OTHER): return "PHYSICAL_DEVICE_TYPE_OTHER";
Expand Down Expand Up @@ -1989,33 +2005,21 @@ void DumpVkPhysicalDeviceHostImageCopyPropertiesEXT(Printer &p, std::string name
ObjectWrapper object{p, name};
p.SetMinKeyWidth(35);
p.PrintKeyValue("copySrcLayoutCount", obj.copySrcLayoutCount);
if (obj.copySrcLayoutCount == 0) {
if (obj.copySrcLayoutCount == 0 || obj.pCopySrcLayouts == nullptr) {
p.PrintKeyString("pCopySrcLayouts", "NULL");
} else {
ArrayWrapper arr(p,"pCopySrcLayouts", obj.copySrcLayoutCount);
for (uint32_t i = 0; i < obj.copySrcLayoutCount; i++) {
if (obj.pCopySrcLayouts != nullptr) {
p.SetElementIndex(i);
if (p.Type() == OutputType::json)
p.PrintString(std::string("VK_") + VkImageLayoutString(obj.pCopySrcLayouts[i]));
else
p.PrintString(VkImageLayoutString(obj.pCopySrcLayouts[i]));
}
DumpVkImageLayout(p, std::to_string(i), obj.pCopySrcLayouts[i]);
}
}
p.PrintKeyValue("copyDstLayoutCount", obj.copyDstLayoutCount);
if (obj.copyDstLayoutCount == 0) {
if (obj.copyDstLayoutCount == 0 || obj.pCopyDstLayouts == nullptr) {
p.PrintKeyString("pCopyDstLayouts", "NULL");
} else {
ArrayWrapper arr(p,"pCopyDstLayouts", obj.copyDstLayoutCount);
for (uint32_t i = 0; i < obj.copyDstLayoutCount; i++) {
if (obj.pCopyDstLayouts != nullptr) {
p.SetElementIndex(i);
if (p.Type() == OutputType::json)
p.PrintString(std::string("VK_") + VkImageLayoutString(obj.pCopyDstLayouts[i]));
else
p.PrintString(VkImageLayoutString(obj.pCopyDstLayouts[i]));
}
DumpVkImageLayout(p, std::to_string(i), obj.pCopyDstLayouts[i]);
}
}
p.PrintKeyValue("optimalTilingLayoutUUID", obj.optimalTilingLayoutUUID);
Expand Down Expand Up @@ -2093,6 +2097,27 @@ void DumpVkPhysicalDeviceInlineUniformBlockProperties(Printer &p, std::string na
p.PrintKeyValue("maxDescriptorSetInlineUniformBlocks", obj.maxDescriptorSetInlineUniformBlocks);
p.PrintKeyValue("maxDescriptorSetUpdateAfterBindInlineUniformBlocks", obj.maxDescriptorSetUpdateAfterBindInlineUniformBlocks);
}
void DumpVkPhysicalDeviceLayeredApiPropertiesKHR(Printer &p, std::string name, const VkPhysicalDeviceLayeredApiPropertiesKHR &obj) {
ObjectWrapper object{p, name};
p.SetMinKeyWidth(15);
p.PrintKeyValue("vendorID", obj.vendorID);
p.PrintKeyValue("deviceID", obj.deviceID);
DumpVkPhysicalDeviceLayeredApiKHR(p, "layeredAPI", obj.layeredAPI);
p.PrintKeyString("deviceName", obj.deviceName);
}
void DumpVkPhysicalDeviceLayeredApiPropertiesListKHR(Printer &p, std::string name, const VkPhysicalDeviceLayeredApiPropertiesListKHR &obj) {
ObjectWrapper object{p, name};
p.SetMinKeyWidth(29);
p.PrintKeyValue("layeredApiCount", obj.layeredApiCount);
if (obj.layeredApiCount == 0 || obj.pLayeredApis == nullptr) {
p.PrintKeyString("pLayeredApis", "NULL");
} else {
ArrayWrapper arr(p,"pLayeredApis", obj.layeredApiCount);
for (uint32_t i = 0; i < obj.layeredApiCount; i++) {
DumpVkPhysicalDeviceLayeredApiPropertiesKHR(p, std::to_string(i), obj.pLayeredApis[i]);
}
}
}
void DumpVkPhysicalDeviceLegacyDitheringFeaturesEXT(Printer &p, std::string name, const VkPhysicalDeviceLegacyDitheringFeaturesEXT &obj) {
ObjectWrapper object{p, name};
p.SetMinKeyWidth(15);
Expand Down Expand Up @@ -3341,18 +3366,12 @@ void DumpVkSurfacePresentModeCompatibilityEXT(Printer &p, std::string name, cons
ObjectWrapper object{p, name};
p.SetMinKeyWidth(31);
p.PrintKeyValue("presentModeCount", obj.presentModeCount);
if (obj.presentModeCount == 0) {
if (obj.presentModeCount == 0 || obj.pPresentModes == nullptr) {
p.PrintKeyString("pPresentModes", "NULL");
} else {
ArrayWrapper arr(p,"pPresentModes", obj.presentModeCount);
for (uint32_t i = 0; i < obj.presentModeCount; i++) {
if (obj.pPresentModes != nullptr) {
p.SetElementIndex(i);
if (p.Type() == OutputType::json)
p.PrintString(std::string("VK_") + VkPresentModeKHRString(obj.pPresentModes[i]));
else
p.PrintString(VkPresentModeKHRString(obj.pPresentModes[i]));
}
DumpVkPresentModeKHR(p, std::to_string(i), obj.pPresentModes[i]);
}
}
}
Expand Down Expand Up @@ -3396,8 +3415,13 @@ struct phys_device_props2_chain {
VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR PhysicalDeviceFragmentShaderBarycentricPropertiesKHR{};
VkPhysicalDeviceFragmentShadingRatePropertiesKHR PhysicalDeviceFragmentShadingRatePropertiesKHR{};
VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT{};
VkPhysicalDeviceHostImageCopyPropertiesEXT PhysicalDeviceHostImageCopyPropertiesEXT{};
std::vector<VkImageLayout> VkPhysicalDeviceHostImageCopyPropertiesEXT_pCopySrcLayouts;
std::vector<VkImageLayout> VkPhysicalDeviceHostImageCopyPropertiesEXT_pCopyDstLayouts;
VkPhysicalDeviceIDProperties PhysicalDeviceIDProperties{};
VkPhysicalDeviceInlineUniformBlockProperties PhysicalDeviceInlineUniformBlockProperties{};
VkPhysicalDeviceLayeredApiPropertiesListKHR PhysicalDeviceLayeredApiPropertiesListKHR{};
std::vector<VkPhysicalDeviceLayeredApiPropertiesKHR> VkPhysicalDeviceLayeredApiPropertiesListKHR_pLayeredApis;
VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT PhysicalDeviceLegacyVertexAttributesPropertiesEXT{};
VkPhysicalDeviceLineRasterizationPropertiesKHR PhysicalDeviceLineRasterizationPropertiesKHR{};
VkPhysicalDeviceMaintenance3Properties PhysicalDeviceMaintenance3Properties{};
Expand Down Expand Up @@ -3460,8 +3484,10 @@ struct phys_device_props2_chain {
PhysicalDeviceFragmentShaderBarycentricPropertiesKHR.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR;
PhysicalDeviceFragmentShadingRatePropertiesKHR.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR;
PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT;
PhysicalDeviceHostImageCopyPropertiesEXT.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT;
PhysicalDeviceIDProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
PhysicalDeviceInlineUniformBlockProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES;
PhysicalDeviceLayeredApiPropertiesListKHR.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_LIST_KHR;
PhysicalDeviceLegacyVertexAttributesPropertiesEXT.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT;
PhysicalDeviceLineRasterizationPropertiesKHR.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR;
PhysicalDeviceMaintenance3Properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES;
Expand Down Expand Up @@ -3548,6 +3574,8 @@ struct phys_device_props2_chain {
chain_members.push_back(reinterpret_cast<VkBaseOutStructure*>(&PhysicalDeviceFragmentShadingRatePropertiesKHR));
if (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME))
chain_members.push_back(reinterpret_cast<VkBaseOutStructure*>(&PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT));
if (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME))
chain_members.push_back(reinterpret_cast<VkBaseOutStructure*>(&PhysicalDeviceHostImageCopyPropertiesEXT));
if ((inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)
|| inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME)
|| inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME))
Expand All @@ -3556,6 +3584,8 @@ struct phys_device_props2_chain {
if ((gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME))
&& gpu.api_version < VK_API_VERSION_1_3)
chain_members.push_back(reinterpret_cast<VkBaseOutStructure*>(&PhysicalDeviceInlineUniformBlockProperties));
if (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_MAINTENANCE_7_EXTENSION_NAME))
chain_members.push_back(reinterpret_cast<VkBaseOutStructure*>(&PhysicalDeviceLayeredApiPropertiesListKHR));
if (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME))
chain_members.push_back(reinterpret_cast<VkBaseOutStructure*>(&PhysicalDeviceLegacyVertexAttributesPropertiesEXT));
if (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME)
Expand Down Expand Up @@ -3789,6 +3819,12 @@ void chain_iterator_phys_device_props2(Printer &p, AppInstance &inst, AppGpu &gp
DumpVkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT(p, "VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT", *props);
p.AddNewline();
}
if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT &&
(gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME))) {
VkPhysicalDeviceHostImageCopyPropertiesEXT* props = (VkPhysicalDeviceHostImageCopyPropertiesEXT*)structure;
DumpVkPhysicalDeviceHostImageCopyPropertiesEXT(p, "VkPhysicalDeviceHostImageCopyPropertiesEXT", *props);
p.AddNewline();
}
if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES &&
((inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME) || inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME) || inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME)) &&
gpu.api_version < VK_API_VERSION_1_1)) {
Expand All @@ -3803,6 +3839,12 @@ void chain_iterator_phys_device_props2(Printer &p, AppInstance &inst, AppGpu &gp
DumpVkPhysicalDeviceInlineUniformBlockProperties(p, gpu.api_version >= VK_API_VERSION_1_3 ?"VkPhysicalDeviceInlineUniformBlockProperties":"VkPhysicalDeviceInlineUniformBlockPropertiesEXT", *props);
p.AddNewline();
}
if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_LIST_KHR &&
(gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_MAINTENANCE_7_EXTENSION_NAME))) {
VkPhysicalDeviceLayeredApiPropertiesListKHR* props = (VkPhysicalDeviceLayeredApiPropertiesListKHR*)structure;
DumpVkPhysicalDeviceLayeredApiPropertiesListKHR(p, "VkPhysicalDeviceLayeredApiPropertiesListKHR", *props);
p.AddNewline();
}
if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT &&
(gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME))) {
VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT* props = (VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT*)structure;
Expand Down Expand Up @@ -4051,6 +4093,15 @@ void chain_iterator_phys_device_props2(Printer &p, AppInstance &inst, AppGpu &gp
place = structure->pNext;
}
}

void prepare_phys_device_props2_twocall_chain_vectors(std::unique_ptr<phys_device_props2_chain>& chain) {
chain->VkPhysicalDeviceHostImageCopyPropertiesEXT_pCopySrcLayouts.resize(chain->PhysicalDeviceHostImageCopyPropertiesEXT.copySrcLayoutCount);
chain->PhysicalDeviceHostImageCopyPropertiesEXT.pCopySrcLayouts = chain->VkPhysicalDeviceHostImageCopyPropertiesEXT_pCopySrcLayouts.data();
chain->VkPhysicalDeviceHostImageCopyPropertiesEXT_pCopyDstLayouts.resize(chain->PhysicalDeviceHostImageCopyPropertiesEXT.copyDstLayoutCount);
chain->PhysicalDeviceHostImageCopyPropertiesEXT.pCopyDstLayouts = chain->VkPhysicalDeviceHostImageCopyPropertiesEXT_pCopyDstLayouts.data();
chain->VkPhysicalDeviceLayeredApiPropertiesListKHR_pLayeredApis.resize(chain->PhysicalDeviceLayeredApiPropertiesListKHR.layeredApiCount);
chain->PhysicalDeviceLayeredApiPropertiesListKHR.pLayeredApis = chain->VkPhysicalDeviceLayeredApiPropertiesListKHR_pLayeredApis.data();
}
struct phys_device_mem_props2_chain {
phys_device_mem_props2_chain() = default;
phys_device_mem_props2_chain(const phys_device_mem_props2_chain &) = delete;
Expand Down
Loading
Loading