From 31cd98c7b23e7e89f7d740a94f8d4fa3dce367db Mon Sep 17 00:00:00 2001
From: "t.jung" <t.jung@gaijin.ru>
Date: Wed, 14 Nov 2018 12:59:18 +0100
Subject: [PATCH] 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.
---
 Test/hlsl.structbuffer.frag |  2 +-
 hlsl/hlslParseHelper.cpp    | 13 +++++++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/Test/hlsl.structbuffer.frag b/Test/hlsl.structbuffer.frag
index 4eb6912bf..dd522a697 100644
--- a/Test/hlsl.structbuffer.frag
+++ b/Test/hlsl.structbuffer.frag
@@ -5,7 +5,7 @@ struct sb_t
     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 ac2943284..6ce182dee 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -6066,13 +6066,22 @@ void HlslParseContext::handleRegister(const TSourceLoc& loc, TQualifier& qualifi
         }
     }
 
-    // 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 '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':
-    case 'c':
+        // samplers
     case 's':
+        // uav resources
     case 'u':
         // if nothing else has set the binding, do so now
         // (other mechanisms override this one)
-- 
GitLab