diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2019-01-10 11:49:33 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2019-01-10 14:52:56 +0300 |
commit | d92de00cc182a436f4c0340247bde088eee2c921 (patch) | |
tree | 77d3c8a91119dff83d714d905f86a6c563ffc054 /reference/opt/shaders/vulkan | |
parent | a57b93f6b73a1aa9aaaeb893029f4dce74c907ba (diff) |
Rewrite how IDs are iterated over.
This is a fairly fundamental change on how IDs are handled.
It serves many purposes:
- Improve performance. We only need to iterate over IDs which are
relevant at any one time.
- Makes sure we iterate through IDs in SPIR-V module declaration order
rather than ID space. IDs don't have to be monotonically increasing,
which was an assumption SPIRV-Cross used to have. It has apparently
never been a problem until now.
- Support LUTs of structs. We do this by interleaving declaration of
constants and struct types in SPIR-V module order.
To support this, the ParsedIR interface needed to change slightly.
Before setting any ID with variant_set<T> we let ParsedIR know
that an ID with a specific type has been added. The surface for change
should be minimal.
ParsedIR will maintain a per-type list of IDs which the cross-compiler
will need to consider for later.
Instead of looping over ir.ids[] (which can be extremely large), we loop
over types now, using:
ir.for_each_typed_id<SPIRVariable>([&](uint32_t id, SPIRVariable &var) {
handle_variable(var);
});
Now we make sure that we're never looking at irrelevant types.
Diffstat (limited to 'reference/opt/shaders/vulkan')
-rw-r--r-- | reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp | 19 | ||||
-rw-r--r-- | reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk | 7 |
2 files changed, 14 insertions, 12 deletions
diff --git a/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp b/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp index 9344a7a2..33647a42 100644 --- a/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp +++ b/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp @@ -9,15 +9,6 @@ const int a = SPIRV_CROSS_CONSTANT_ID_0; #define SPIRV_CROSS_CONSTANT_ID_1 200 #endif const int b = SPIRV_CROSS_CONSTANT_ID_1; -#ifndef SPIRV_CROSS_CONSTANT_ID_2 -#define SPIRV_CROSS_CONSTANT_ID_2 300 -#endif -const int c = SPIRV_CROSS_CONSTANT_ID_2; -const int _18 = (c + 50); -#ifndef SPIRV_CROSS_CONSTANT_ID_3 -#define SPIRV_CROSS_CONSTANT_ID_3 400 -#endif -const int e = SPIRV_CROSS_CONSTANT_ID_3; struct A { @@ -31,6 +22,16 @@ struct B int member1[a]; }; +#ifndef SPIRV_CROSS_CONSTANT_ID_2 +#define SPIRV_CROSS_CONSTANT_ID_2 300 +#endif +const int c = SPIRV_CROSS_CONSTANT_ID_2; +const int _18 = (c + 50); +#ifndef SPIRV_CROSS_CONSTANT_ID_3 +#define SPIRV_CROSS_CONSTANT_ID_3 400 +#endif +const int e = SPIRV_CROSS_CONSTANT_ID_3; + layout(binding = 0, std430) buffer SSBO { A member_a; diff --git a/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk b/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk index d9a2822f..cd68e93d 100644 --- a/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk +++ b/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk @@ -3,9 +3,6 @@ layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; layout(constant_id = 0) const int a = 100; layout(constant_id = 1) const int b = 200; -layout(constant_id = 2) const int c = 300; -const int _18 = (c + 50); -layout(constant_id = 3) const int e = 400; struct A { @@ -19,6 +16,10 @@ struct B int member1[a]; }; +layout(constant_id = 2) const int c = 300; +const int _18 = (c + 50); +layout(constant_id = 3) const int e = 400; + layout(set = 1, binding = 0, std430) buffer SSBO { A member_a; |