Browse Source

Cast i32 col idx into i8. (#170)

Xiang Li 8 years ago
parent
commit
238c2221e2

+ 4 - 0
lib/HLSL/DxilGenerationPass.cpp

@@ -838,6 +838,10 @@ static Value *replaceLdWithLdInput(Function *loadInput,
     if (colIdx == nullptr) {
     if (colIdx == nullptr) {
       DXASSERT(cols == 1, "only support scalar here");
       DXASSERT(cols == 1, "only support scalar here");
       colIdx = Builder.getInt8(0);
       colIdx = Builder.getInt8(0);
+    } else {
+      if (colIdx->getType() == Builder.getInt32Ty()) {
+        colIdx = Builder.CreateTrunc(colIdx, Builder.getInt8Ty());
+      }
     }
     }
 
 
     if (isa<ConstantInt>(colIdx)) {
     if (isa<ConstantInt>(colIdx)) {

+ 11 - 0
tools/clang/test/CodeGenHLSL/i32colIdx.hlsl

@@ -0,0 +1,11 @@
+// RUN: %dxc -E main -T ps_6_0 %s
+
+struct Input
+{
+    float2 v : TEXCOORD0;
+};
+
+float4 main(Input input) : SV_Target
+{
+    return input.v[0];
+}

+ 5 - 0
tools/clang/unittests/HLSL/CompilerTest.cpp

@@ -365,6 +365,7 @@ public:
   TEST_METHOD(CodeGenGatherOffset)
   TEST_METHOD(CodeGenGatherOffset)
   TEST_METHOD(CodeGenGepZeroIdx)
   TEST_METHOD(CodeGenGepZeroIdx)
   TEST_METHOD(CodeGenGloballyCoherent)
   TEST_METHOD(CodeGenGloballyCoherent)
+  TEST_METHOD(CodeGenI32ColIdx)
   TEST_METHOD(CodeGenIcb1)
   TEST_METHOD(CodeGenIcb1)
   TEST_METHOD(CodeGenIf1)
   TEST_METHOD(CodeGenIf1)
   TEST_METHOD(CodeGenIf2)
   TEST_METHOD(CodeGenIf2)
@@ -2244,6 +2245,10 @@ TEST_F(CompilerTest, CodeGenGloballyCoherent) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\globallycoherent.hlsl");
   CodeGenTestCheck(L"..\\CodeGenHLSL\\globallycoherent.hlsl");
 }
 }
 
 
+TEST_F(CompilerTest, CodeGenI32ColIdx) {
+  CodeGenTest(L"..\\CodeGenHLSL\\i32colIdx.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenIcb1) {
 TEST_F(CompilerTest, CodeGenIcb1) {
   CodeGenTest(L"..\\CodeGenHLSL\\icb1.hlsl");
   CodeGenTest(L"..\\CodeGenHLSL\\icb1.hlsl");
 }
 }