diff options
| author | David Pinedo <david@lunarg.com> | 2017-10-05 10:30:02 -0600 |
|---|---|---|
| committer | David Pinedo <david@lunarg.com> | 2017-10-10 15:43:46 -0600 |
| commit | f024068bf033b7084ef08f19626c8a6257192b0b (patch) | |
| tree | f597c4165a57dcac34766fe746e9413b0dc3a55f /scripts | |
| parent | 662c433ebaa3410503290f5d887401a045d3a731 (diff) | |
| download | usermoji-f024068bf033b7084ef08f19626c8a6257192b0b.tar.xz | |
scripts: add get_struct_size helper function
Change-Id: I12494a129ef8be68170dddf4efe6762f4051b116
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/helper_file_generator.py | 87 |
1 files changed, 55 insertions, 32 deletions
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py index 4cdea71b..84b8c7b6 100644 --- a/scripts/helper_file_generator.py +++ b/scripts/helper_file_generator.py @@ -399,6 +399,7 @@ class HelperFileOutputGenerator(OutputGenerator): def GenerateStructSizeHeader(self): outstring = '' outstring += 'size_t get_struct_chain_size(const void* struct_ptr);\n' + outstring += 'size_t get_struct_size(const void* struct_ptr);\n' for item in self.structMembers: lower_case_name = item.name.lower() if item.ifdef_protect != None: @@ -435,13 +436,13 @@ class HelperFileOutputGenerator(OutputGenerator): # # Build the header of the get_struct_chain_size function def GenerateChainSizePreamble(self): - preable = '\nsize_t get_struct_chain_size(const void* struct_ptr) {\n' - preable += ' // Use VkApplicationInfo as struct until actual type is resolved\n' - preable += ' VkApplicationInfo* pNext = (VkApplicationInfo*)struct_ptr;\n' - preable += ' size_t struct_size = 0;\n' - preable += ' while (pNext) {\n' - preable += ' switch (pNext->sType) {\n' - return preable + preamble = '\nsize_t get_struct_chain_size(const void* struct_ptr) {\n' + preamble += ' // Use VkApplicationInfo as struct until actual type is resolved\n' + preamble += ' VkApplicationInfo* pNext = (VkApplicationInfo*)struct_ptr;\n' + preamble += ' size_t struct_size = 0;\n' + preamble += ' while (pNext) {\n' + preamble += ' switch (pNext->sType) {\n' + return preamble # # Build the footer of the get_struct_chain_size function def GenerateChainSizePostamble(self): @@ -452,29 +453,49 @@ class HelperFileOutputGenerator(OutputGenerator): postamble += ' pNext = (VkApplicationInfo*)pNext->pNext;\n' postamble += ' }\n' postamble += ' return struct_size;\n' + postamble += '}\n' + return postamble + # + # Build the header of the get_struct_size function + def GenerateStructSizePreamble(self): + preamble = '\nsize_t get_struct_size(const void* struct_ptr) {\n' + preamble += ' switch (((VkApplicationInfo*)struct_ptr)->sType) {\n' + return preamble + # + # Build the footer of the get_struct_size function + def GenerateStructSizePostamble(self): + postamble = ' default:\n' + postamble += ' assert(0);\n' + postamble += ' return(0);\n' + postamble += ' }\n' postamble += '}' return postamble # # struct_size_helper source -- create bodies of struct size helper functions def GenerateStructSizeSource(self): - # Construct the body of the routine and get_struct_chain_size() simultaneously - struct_size_body = '' + # Construct the bodies of the struct size functions, get_struct_chain_size(), + # and get_struct_size() simultaneously + struct_size_funcs = '' chain_size = self.GenerateChainSizePreamble() + struct_size = self.GenerateStructSizePreamble() for item in self.structMembers: - struct_size_body += '\n' + struct_size_funcs += '\n' lower_case_name = item.name.lower() if item.ifdef_protect != None: - struct_size_body += '#ifdef %s\n' % item.ifdef_protect + struct_size_funcs += '#ifdef %s\n' % item.ifdef_protect + struct_size += '#ifdef %s\n' % item.ifdef_protect chain_size += '#ifdef %s\n' % item.ifdef_protect if item.name in self.structTypes: chain_size += ' case %s: {\n' % self.structTypes[item.name].value chain_size += ' struct_size += vk_size_%s((%s*)pNext);\n' % (item.name.lower(), item.name) chain_size += ' break;\n' chain_size += ' }\n' - struct_size_body += 'size_t vk_size_%s(const %s* struct_ptr) {\n' % (item.name.lower(), item.name) - struct_size_body += ' size_t struct_size = 0;\n' - struct_size_body += ' if (struct_ptr) {\n' - struct_size_body += ' struct_size = sizeof(%s);\n' % item.name + struct_size += ' case %s: \n' % self.structTypes[item.name].value + struct_size += ' return vk_size_%s((%s*)struct_ptr);\n' % (item.name.lower(), item.name) + struct_size_funcs += 'size_t vk_size_%s(const %s* struct_ptr) { \n' % (item.name.lower(), item.name) + struct_size_funcs += ' size_t struct_size = 0;\n' + struct_size_funcs += ' if (struct_ptr) {\n' + struct_size_funcs += ' 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) @@ -482,38 +503,40 @@ class HelperFileOutputGenerator(OutputGenerator): if vulkan_type is not None: # If this is another Vulkan structure call generated size function if member.len is not None: - struct_size_body, counter_declared = self.DeclareCounter(struct_size_body, counter_declared) - struct_size_body += ' for (i = 0; i < struct_ptr->%s; i++) {\n' % member.len - struct_size_body += ' struct_size += vk_size_%s(&struct_ptr->%s[i]);\n' % (member.type.lower(), member.name) - struct_size_body += ' }\n' + struct_size_funcs, counter_declared = self.DeclareCounter(struct_size_funcs, counter_declared) + struct_size_funcs += ' for (i = 0; i < struct_ptr->%s; i++) {\n' % member.len + struct_size_funcs += ' struct_size += vk_size_%s(&struct_ptr->%s[i]);\n' % (member.type.lower(), member.name) + struct_size_funcs += ' }\n' else: - struct_size_body += ' struct_size += vk_size_%s(struct_ptr->%s);\n' % (member.type.lower(), member.name) + struct_size_funcs += ' 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: - struct_size_body, counter_declared = self.DeclareCounter(struct_size_body, counter_declared) - struct_size_body += ' for (i = 0; i < struct_ptr->%s; i++) {\n' % member.len - struct_size_body += ' struct_size += (sizeof(char*) + (sizeof(char) * (1 + strlen(struct_ptr->%s[i]))));\n' % (member.name) - struct_size_body += ' }\n' + struct_size_funcs, counter_declared = self.DeclareCounter(struct_size_funcs, counter_declared) + struct_size_funcs += ' for (i = 0; i < struct_ptr->%s; i++) {\n' % member.len + struct_size_funcs += ' struct_size += (sizeof(char*) + (sizeof(char) * (1 + strlen(struct_ptr->%s[i]))));\n' % (member.name) + struct_size_funcs += ' }\n' else: - struct_size_body += ' struct_size += (struct_ptr->%s != NULL) ? sizeof(char)*(1+strlen(struct_ptr->%s)) : 0;\n' % (member.name, member.name) + struct_size_funcs += ' 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: # Avoid using 'sizeof(void)', which generates compile-time warnings/errors checked_type = member.type if checked_type == 'void': checked_type = 'void*' - struct_size_body += ' struct_size += (struct_ptr->%s ) * sizeof(%s);\n' % (member.len, checked_type) - struct_size_body += ' }\n' - struct_size_body += ' return struct_size;\n' - struct_size_body += '}\n' + struct_size_funcs += ' struct_size += (struct_ptr->%s ) * sizeof(%s);\n' % (member.len, checked_type) + struct_size_funcs += ' }\n' + struct_size_funcs += ' return struct_size;\n' + struct_size_funcs += '}\n' if item.ifdef_protect != None: - struct_size_body += '#endif // %s\n' % item.ifdef_protect + struct_size_funcs += '#endif // %s\n' % item.ifdef_protect + struct_size += '#endif // %s\n' % item.ifdef_protect chain_size += '#endif // %s\n' % item.ifdef_protect chain_size += self.GenerateChainSizePostamble() - struct_size_body += chain_size; - return struct_size_body + struct_size += self.GenerateStructSizePostamble() + return_value = struct_size_funcs + chain_size + struct_size; + return return_value # # Combine struct size helper source file preamble with body text and return def GenerateStructSizeHelperSource(self): |
