aboutsummaryrefslogtreecommitdiff
path: root/layers/draw_state.cpp
diff options
context:
space:
mode:
authorChris Forbes <chrisforbes@google.com>2016-02-26 16:53:51 +1300
committerChris Forbes <chrisforbes@google.com>2016-03-04 08:57:28 +1300
commita12668211bea9da0a7a1059bb300e24855f91fd7 (patch)
tree41e763c8a8045519fa9d842f178433d2368550f4 /layers/draw_state.cpp
parent17a2e20421f3fd50675459f615b21e26de4d6462 (diff)
downloadusermoji-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.cpp51
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;