Collect Offset,MatrixStride,ArrayStride decorations
These decorations are used for all explicit layout storage classes --
Uniform, StorageBuffer, PushConstant.
Bug: b/120799499
Change-Id: Ida7ee6e2a5145d09792acf39b6e33d039431578b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/26489
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 163b20f..9790712 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -812,6 +812,18 @@
case spv::DecorationBufferBlock:
BufferBlock = true;
break;
+ case spv::DecorationOffset:
+ HasOffset = true;
+ Offset = static_cast<int32_t>(arg);
+ break;
+ case spv::DecorationArrayStride:
+ HasArrayStride = true;
+ ArrayStride = static_cast<int32_t>(arg);
+ break;
+ case spv::DecorationMatrixStride:
+ HasMatrixStride = true;
+ MatrixStride = static_cast<int32_t>(arg);
+ break;
default:
// Intentionally partial, there are many decorations we just don't care about.
break;
@@ -851,6 +863,24 @@
Binding = src.Binding;
}
+ if (src.HasOffset)
+ {
+ HasOffset = true;
+ Offset = src.Offset;
+ }
+
+ if (src.HasArrayStride)
+ {
+ HasArrayStride = true;
+ ArrayStride = src.ArrayStride;
+ }
+
+ if (src.HasMatrixStride)
+ {
+ HasMatrixStride = true;
+ MatrixStride = src.MatrixStride;
+ }
+
Flat |= src.Flat;
NoPerspective |= src.NoPerspective;
Centroid |= src.Centroid;
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index e4d13e2..1c507c6 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -292,6 +292,9 @@
int32_t DescriptorSet;
int32_t Binding;
spv::BuiltIn BuiltIn;
+ int32_t Offset;
+ int32_t ArrayStride;
+ int32_t MatrixStride;
bool HasLocation : 1;
bool HasComponent : 1;
bool HasDescriptorSet : 1;
@@ -302,14 +305,19 @@
bool NoPerspective : 1;
bool Block : 1;
bool BufferBlock : 1;
+ bool HasOffset : 1;
+ bool HasArrayStride : 1;
+ bool HasMatrixStride : 1;
Decorations()
: Location{-1}, Component{0}, DescriptorSet{-1}, Binding{-1},
BuiltIn{static_cast<spv::BuiltIn>(-1)},
+ Offset{-1}, ArrayStride{-1}, MatrixStride{-1},
HasLocation{false}, HasComponent{false},
HasDescriptorSet{false}, HasBinding{false},
HasBuiltIn{false}, Flat{false}, Centroid{false},
- NoPerspective{false}, Block{false}, BufferBlock{false}
+ NoPerspective{false}, Block{false}, BufferBlock{false},
+ HasOffset{false}, HasArrayStride{false}, HasMatrixStride{false}
{
}