diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-05-23 16:02:29 -0600 |
|---|---|---|
| committer | Jon Ashburn <jon@lunarg.com> | 2016-05-25 10:19:25 -0600 |
| commit | 72db2cf8ed223058623943abb345225cd80f3e89 (patch) | |
| tree | e3bb66ba32cfc45a3112e0ab282f70916e4c6101 | |
| parent | 14977c3af7d0ba12db17832196b3edc8663c5ba5 (diff) | |
| download | usermoji-72db2cf8ed223058623943abb345225cd80f3e89.tar.xz | |
layers: Handle static arrays in codegen
Update safe_struct codegen to handle the case of a static array
in a struct. This removes exceptions for VkDebugMarkerMarkerInfoEXT
and VkPipelineColorBlendStateCreateInfo so they can be treated
as all other structs.
| -rw-r--r-- | layers/core_validation.cpp | 2 | ||||
| -rwxr-xr-x | vk_helper.py | 45 |
2 files changed, 29 insertions, 18 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e0d04c29..73a318e1 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2696,7 +2696,7 @@ static bool validatePipelineDrawtimeState(layer_data const *my_data, const GLOBA VkSampleCountFlagBits subpass_num_samples = VkSampleCountFlagBits(0); uint32_t i; - const VkPipelineColorBlendStateCreateInfo *color_blend_state = pPipeline->graphicsPipelineCI.pColorBlendState; + const safe_VkPipelineColorBlendStateCreateInfo *color_blend_state = pPipeline->graphicsPipelineCI.pColorBlendState; if ((color_blend_state != NULL) && (pCB->activeSubpass == pPipeline->graphicsPipelineCI.subpass) && (color_blend_state->attachmentCount != subpass_desc->colorAttachmentCount)) { skip_call |= diff --git a/vk_helper.py b/vk_helper.py index ab99f638..a405d571 100755 --- a/vk_helper.py +++ b/vk_helper.py @@ -1563,7 +1563,7 @@ class StructWrapperGen: # If struct has sType or ptr members, generate safe type def _hasSafeStruct(self, s): - exceptions = ['VkPhysicalDeviceFeatures', 'VkPipelineColorBlendStateCreateInfo', 'VkDebugMarkerMarkerInfoEXT'] + exceptions = ['VkPhysicalDeviceFeatures'] if s in exceptions: return False if 'sType' == self.struct_dict[s][0]['name']: @@ -1713,23 +1713,34 @@ class StructWrapperGen: destruct_txt += ' if (%s)\n' % (m_name) destruct_txt += ' delete[] %s;\n' % (m_name) elif self.struct_dict[s][m]['array']: - # Init array ptr to NULL - init_list += '\n\t%s(NULL),' % (m_name) - init_func_txt += ' %s = NULL;\n' % (m_name) - array_element = 'pInStruct->%s[i]' % (m_name) - if is_type(self.struct_dict[s][m]['type'], 'struct') and self._hasSafeStruct(self.struct_dict[s][m]['type']): - array_element = '%s(&pInStruct->%s[i])' % (self._getSafeStructName(self.struct_dict[s][m]['type']), m_name) - construct_txt += ' if (%s && pInStruct->%s) {\n' % (self.struct_dict[s][m]['array_size'], m_name) - construct_txt += ' %s = new %s[%s];\n' % (m_name, m_type, self.struct_dict[s][m]['array_size']) - destruct_txt += ' if (%s)\n' % (m_name) - destruct_txt += ' delete[] %s;\n' % (m_name) - construct_txt += ' for (uint32_t i=0; i<%s; ++i) {\n' % (self.struct_dict[s][m]['array_size']) - if 'safe_' in m_type: - construct_txt += ' %s[i].initialize(&pInStruct->%s[i]);\n' % (m_name, m_name) + if not self.struct_dict[s][m]['dyn_array']: + # Handle static array case + array_init_str = '' + for i in range(int(self.struct_dict[s][m]['array_size'])): + array_init_str += 'pInStruct->%s[%d], ' % (m_name, i) + array_init_str = array_init_str.strip().rstrip(',') + init_list += '\n\t%s{%s},' % (m_name, array_init_str) + init_func_txt += ' for (uint32_t i=0; i<%s; ++i) {\n' % (self.struct_dict[s][m]['array_size']) + init_func_txt += ' %s[i] = pInStruct->%s[i];\n' % (m_name, m_name) + init_func_txt += ' }\n' else: - construct_txt += ' %s[i] = %s;\n' % (m_name, array_element) - construct_txt += ' }\n' - construct_txt += ' }\n' + # Init array ptr to NULL + init_list += '\n\t%s(NULL),' % (m_name) + init_func_txt += ' %s = NULL;\n' % (m_name) + array_element = 'pInStruct->%s[i]' % (m_name) + if is_type(self.struct_dict[s][m]['type'], 'struct') and self._hasSafeStruct(self.struct_dict[s][m]['type']): + array_element = '%s(&pInStruct->%s[i])' % (self._getSafeStructName(self.struct_dict[s][m]['type']), m_name) + construct_txt += ' if (%s && pInStruct->%s) {\n' % (self.struct_dict[s][m]['array_size'], m_name) + construct_txt += ' %s = new %s[%s];\n' % (m_name, m_type, self.struct_dict[s][m]['array_size']) + destruct_txt += ' if (%s)\n' % (m_name) + destruct_txt += ' delete[] %s;\n' % (m_name) + construct_txt += ' for (uint32_t i=0; i<%s; ++i) {\n' % (self.struct_dict[s][m]['array_size']) + if 'safe_' in m_type: + construct_txt += ' %s[i].initialize(&pInStruct->%s[i]);\n' % (m_name, m_name) + else: + construct_txt += ' %s[i] = %s;\n' % (m_name, array_element) + construct_txt += ' }\n' + construct_txt += ' }\n' elif self.struct_dict[s][m]['ptr']: construct_txt += ' if (pInStruct->%s)\n' % (m_name) construct_txt += ' %s = new %s(pInStruct->%s);\n' % (m_name, m_type, m_name) |
