diff options
| author | Chris Forbes <chrisforbes@google.com> | 2016-02-26 16:53:51 +1300 |
|---|---|---|
| committer | Chris Forbes <chrisforbes@google.com> | 2016-03-04 08:57:28 +1300 |
| commit | a12668211bea9da0a7a1059bb300e24855f91fd7 (patch) | |
| tree | 41e763c8a8045519fa9d842f178433d2368550f4 /layers/draw_state.cpp | |
| parent | 17a2e20421f3fd50675459f615b21e26de4d6462 (diff) | |
| download | usermoji-a12668211bea9da0a7a1059bb300e24855f91fd7.tar.xz | |
layers: extract helper for getting to block/struct type
Signed-off-by: Chris Forbes <chrisforbes@google.com>
Diffstat (limited to 'layers/draw_state.cpp')
| -rw-r--r-- | layers/draw_state.cpp | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index e11b75c8..7be62c69 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -642,6 +642,28 @@ struct interface_var { }; +static spirv_inst_iter +get_struct_type(shader_module const *src, spirv_inst_iter def, bool is_array_of_verts) +{ + while (true) { + + if (def.opcode() == spv::OpTypePointer) { + def = src->get_def(def.word(3)); + } + else if (def.opcode() == spv::OpTypeArray && is_array_of_verts) { + def = src->get_def(def.word(2)); + is_array_of_verts = false; + } + else if (def.opcode() == spv::OpTypeStruct) { + return def; + } + else { + return src->end(); + } + } +} + + static void collect_interface_block_members(layer_data *my_data, VkDevice dev, shader_module const *src, @@ -652,31 +674,10 @@ collect_interface_block_members(layer_data *my_data, VkDevice dev, uint32_t type_id) { /* Walk down the type_id presented, trying to determine whether it's actually an interface block. */ - auto type = src->get_def(type_id); - - while (true) { - - if (type.opcode() == spv::OpTypePointer) { - type = src->get_def(type.word(3)); - } - else if (type.opcode() == spv::OpTypeArray && is_array_of_verts) { - type = src->get_def(type.word(2)); - is_array_of_verts = false; - } - else if (type.opcode() == spv::OpTypeStruct) { - if (blocks.find(type.word(1)) == blocks.end()) { - /* This isn't an interface block. */ - return; - } - else { - /* We have found the correct type. Walk its members. */ - break; - } - } - else { - /* not an interface block */ - return; - } + auto type = get_struct_type(src, src->get_def(type_id), is_array_of_verts); + if (type == src->end() || blocks.find(type.word(1)) == blocks.end()) { + /* this isn't an interface block. */ + return; } std::unordered_map<unsigned, unsigned> member_components; |
