aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2016-05-23 16:02:29 -0600
committerJon Ashburn <jon@lunarg.com>2016-05-25 10:19:25 -0600
commit72db2cf8ed223058623943abb345225cd80f3e89 (patch)
treee3bb66ba32cfc45a3112e0ab282f70916e4c6101
parent14977c3af7d0ba12db17832196b3edc8663c5ba5 (diff)
downloadusermoji-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.cpp2
-rwxr-xr-xvk_helper.py45
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)