Skip to content

Commit

Permalink
vulkaninfo: Support 2-call structs in codegen for pNext chains
Browse files Browse the repository at this point in the history
There are now multiple structs in pNext chains which require calling once to
get the size, allocating memory, then calling again to get the data. The
codegen now handles such functions, although not very cleanly.
  • Loading branch information
charles-lunarg committed Jul 1, 2024
1 parent 35eb0bf commit f83f349
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 73 deletions.
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

0 comments on commit f83f349

Please sign in to comment.