scripts: Complete struct_size_helper source gen
This file will now output a complete vk_struct_size_helper.c file.
Change-Id: Ic87fd7d3c9a95daa666e8e4da63a21d31e8bfb86
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index a6cf81d..7ef8f8e 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -310,16 +310,19 @@
struct_size_helper_header += '// Function Prototypes\n'
struct_size_helper_header += self.GenerateStructSizeHeader()
return struct_size_helper_header
-
+ #
+ # Helper function for declaring a counter variable only once
+ def DeclareCounter(self, string_var, declare_flag):
+ if declare_flag == False:
+ string_var += ' uint32_t i = 0;\n'
+ declare_flag = True
+ return string_var, declare_flag
#
# struct_size_helper source -- create bodies of struct size helper functions
def GenerateStructSizeSource(self):
outstring = ''
for item in self.structMembers:
-
- if item.name == 'VkBindSparseInfo':
- stop = 'here'
-
+ outstring += '\n'
lower_case_name = item.name.lower()
if item.ifdef_protect != None:
outstring += '#ifdef %s\n' % item.ifdef_protect
@@ -327,6 +330,32 @@
outstring += ' size_t struct_size = 0;\n'
outstring += ' if (struct_ptr) {\n'
outstring += ' struct_size = sizeof(%s);\n' % item.name
+ counter_declared = False
+ for member in item.members:
+ vulkan_type = next((i for i, v in enumerate(self.structMembers) if v[0] == member.type), None)
+ if member.ispointer == True:
+ if vulkan_type is not None:
+ # If this is another Vulkan structure call generated size function
+ if member.len is not None:
+ outstring, counter_declared = self.DeclareCounter(outstring, counter_declared)
+ outstring += ' for (i = 0; i < pStruct->%s; i++) {\n' % member.len
+ outstring += ' struct_size += vk_size_%s(&struct_ptr->%s[i]);\n' % (member.type.lower(), member.name)
+ outstring += ' }\n'
+ else:
+ outstring += ' struct_size += vk_size_%s(struct_ptr->%s);\n' % (member.type.lower(), member.name)
+ else:
+ if member.type == 'char':
+ # Deal with sizes of character strings
+ if member.len is not None:
+ outstring, counter_declared = self.DeclareCounter(outstring, counter_declared)
+ outstring += ' for (i = 0; i < pStruct->%s; i++) {\n' % member.len
+ outstring += ' struct_size += (sizeof(char*) + (sizeof(char) * (1 + strlen(pStruct->%s[i]))));\n' % (member.name)
+ outstring += ' }\n'
+ else:
+ outstring += ' struct_size += (struct_ptr->%s != NULL) ? sizeof(char)*(1+strlen(struct_ptr->%s)) : 0;\n' % (member.name, member.name)
+ else:
+ if member.len is not None:
+ outstring += ' struct_size += struct_ptr->%s * sizeof(%s);\n' % (member.len, member.name)
outstring += ' }\n'
outstring += ' return struct_size\n'
outstring += '}\n'
@@ -347,17 +376,14 @@
struct_size_helper_source += '// Function Definitions\n'
struct_size_helper_source += self.GenerateStructSizeSource()
return struct_size_helper_source
-
-
-
-
#
# Create a helper file and return it as a string
def OutputDestFile(self):
- out_file_entries = ''
if self.helper_file_type == 'enum_string_header':
return self.GenerateEnumStringHelperHeader()
elif self.helper_file_type == 'struct_size_header':
return self.GenerateStructSizeHelperHeader()
elif self.helper_file_type == 'struct_size_source':
return self.GenerateStructSizeHelperSource()
+ else:
+ return 'Bad Helper Generator Option %s' % self.helper_file_type
\ No newline at end of file