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}
 			{
 			}