HLSL: implemented c register handling
Adjusted a test not to use c register for
a structured buffer, they are supposed to
use t registers
Added comments with hints for what are the
register types are used for.
diff --git a/Test/hlsl.structbuffer.frag b/Test/hlsl.structbuffer.frag
index 4eb6912..dd522a6 100644
--- a/Test/hlsl.structbuffer.frag
+++ b/Test/hlsl.structbuffer.frag
@@ -5,7 +5,7 @@
bool test2;
}; // stride = 20
-StructuredBuffer<sb_t> sbuf : register(c10);
+StructuredBuffer<sb_t> sbuf : register(t10);
StructuredBuffer<float> sbuf2;
float4 main(uint pos : FOO) : SV_Target0
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index ac29432..6ce182d 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -6066,13 +6066,22 @@
}
}
- // TODO: learn what all these really mean and how they interact with regNumber and subComponent
+ // more information about register types see
+ // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-variable-register
const std::vector<std::string>& resourceInfo = intermediate.getResourceSetBinding();
switch (std::tolower(desc[0])) {
- case 'b':
- case 't':
case 'c':
+ // c register is the register slot in the global const buffer
+ // each slot is a vector of 4 32 bit components
+ qualifier.layoutOffset = regNumber * 4 * 4;
+ break;
+ // const buffer register slot
+ case 'b':
+ // textrues and structured buffers
+ case 't':
+ // samplers
case 's':
+ // uav resources
case 'u':
// if nothing else has set the binding, do so now
// (other mechanisms override this one)