aboutsummaryrefslogtreecommitdiff
path: root/scripts/helper_file_generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/helper_file_generator.py')
-rw-r--r--scripts/helper_file_generator.py31
1 files changed, 28 insertions, 3 deletions
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index 8a02bb229..cbf279d3d 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -452,6 +452,7 @@ class HelperFileOutputGenerator(OutputGenerator):
safe_struct_helper_header = '\n'
safe_struct_helper_header += '#pragma once\n'
safe_struct_helper_header += '#include <vulkan/vulkan.h>\n'
+ safe_struct_helper_header += '#include <vulkan/vk_layer.h>\n'
safe_struct_helper_header += '\n'
safe_struct_helper_header += 'void *SafePnextCopy(const void *pNext);\n'
safe_struct_helper_header += 'void FreePnextChain(const void *head);\n'
@@ -900,19 +901,43 @@ class HelperFileOutputGenerator(OutputGenerator):
build_pnext_proc += ' return nullptr;\n'
build_pnext_proc += ' } else {\n'
build_pnext_proc += ' VkBaseOutStructure *header = reinterpret_cast<VkBaseOutStructure *>(cur_pnext);\n\n'
- build_pnext_proc += ' switch (header->sType) {\n'
+ build_pnext_proc += ' switch (header->sType) {\n\n'
+ # Add special-case code to copy beloved secret loader structs
+ build_pnext_proc += ' // Special-case Loader Instance Struct passed to/from layer in pNext chain\n'
+ build_pnext_proc += ' case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO: {\n'
+ build_pnext_proc += ' VkLayerInstanceCreateInfo *safe_struct = new VkLayerInstanceCreateInfo;\n'
+ build_pnext_proc += ' memcpy((void *)safe_struct, (void *)cur_pnext, sizeof(VkLayerInstanceCreateInfo));\n'
+ build_pnext_proc += ' safe_struct->pNext = SafePnextCopy(safe_struct->pNext);\n'
+ build_pnext_proc += ' cur_ext_struct = reinterpret_cast<void *>(safe_struct);\n'
+ build_pnext_proc += ' } break;\n\n'
+ build_pnext_proc += ' // Special-case Loader Device Struct passed to/from layer in pNext chain\n'
+ build_pnext_proc += ' case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO: {\n'
+ build_pnext_proc += ' VkLayerDeviceCreateInfo *safe_struct = new VkLayerDeviceCreateInfo;\n'
+ build_pnext_proc += ' memcpy((void *)safe_struct, (void *)cur_pnext, sizeof(VkLayerDeviceCreateInfo));\n'
+ build_pnext_proc += ' safe_struct->pNext = SafePnextCopy(safe_struct->pNext);\n'
+ build_pnext_proc += ' cur_ext_struct = reinterpret_cast<void *>(safe_struct);\n'
+ build_pnext_proc += ' } break;\n\n'
free_pnext_proc = '\n\n'
free_pnext_proc += '// Free a const pNext extension chain\n'
free_pnext_proc += 'void FreePnextChain(const void *head) {\n'
free_pnext_proc += ' FreePnextChain(const_cast<void *>(head));\n'
free_pnext_proc += '}\n\n'
-
free_pnext_proc += '// Free a pNext extension chain\n'
free_pnext_proc += 'void FreePnextChain(void *head) {\n'
free_pnext_proc += ' if (nullptr == head) return;\n'
free_pnext_proc += ' VkBaseOutStructure *header = reinterpret_cast<VkBaseOutStructure *>(head);\n\n'
- free_pnext_proc += ' switch (header->sType) {\n';
+ free_pnext_proc += ' switch (header->sType) {\n\n'
+ free_pnext_proc += ' // Special-case Loader Instance Struct passed to/from layer in pNext chain\n'
+ free_pnext_proc += ' case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO: {\n'
+ free_pnext_proc += ' if (header->pNext) FreePnextChain(header->pNext);\n'
+ free_pnext_proc += ' delete reinterpret_cast<VkLayerInstanceCreateInfo *>(head);\n'
+ free_pnext_proc += ' } break;\n\n'
+ free_pnext_proc += ' // Special-case Loader Device Struct passed to/from layer in pNext chain\n'
+ free_pnext_proc += ' case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO: {\n'
+ free_pnext_proc += ' if (header->pNext) FreePnextChain(header->pNext);\n'
+ free_pnext_proc += ' delete reinterpret_cast<VkLayerDeviceCreateInfo *>(head);\n'
+ free_pnext_proc += ' } break;\n\n'
for item in self.structextends_list: