Browse Source

Use correct channel for gather with offset. (#648)

Xiang Li 8 years ago
parent
commit
58b7f88864
2 changed files with 15 additions and 3 deletions
  1. 3 3
      lib/HLSL/HLOperationLower.cpp
  2. 12 0
      tools/clang/test/CodeGenHLSL/gatherOffset.hlsl

+ 3 - 3
lib/HLSL/HLOperationLower.cpp

@@ -2787,17 +2787,17 @@ void GenerateDxilGather(CallInst *CI, Function *F,
 
     helper.UpdateOffsetInGatherArgs(gatherArgs, /*sampleIdx*/ 1);
     CallInst *callY = Builder.CreateCall(F, gatherArgs);
-    elt = Builder.CreateExtractValue(callY, (uint64_t)0);
+    elt = Builder.CreateExtractValue(callY, (uint64_t)1);
     retVal = Builder.CreateInsertElement(retVal, elt, 1);
 
     helper.UpdateOffsetInGatherArgs(gatherArgs, /*sampleIdx*/ 2);
     CallInst *callZ = Builder.CreateCall(F, gatherArgs);
-    elt = Builder.CreateExtractValue(callZ, (uint64_t)0);
+    elt = Builder.CreateExtractValue(callZ, (uint64_t)2);
     retVal = Builder.CreateInsertElement(retVal, elt, 2);
 
     helper.UpdateOffsetInGatherArgs(gatherArgs, /*sampleIdx*/ 3);
     CallInst *callW = Builder.CreateCall(F, gatherArgs);
-    elt = Builder.CreateExtractValue(callW, (uint64_t)0);
+    elt = Builder.CreateExtractValue(callW, (uint64_t)3);
     retVal = Builder.CreateInsertElement(retVal, elt, 3);
     // Replace ret val.
     CI->replaceAllUsesWith(retVal);

+ 12 - 0
tools/clang/test/CodeGenHLSL/gatherOffset.hlsl

@@ -1,17 +1,29 @@
 // RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
 
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 0
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 1
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 2
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 3
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 0
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 1
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 2
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 3
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 0
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 1
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 2
 // CHECK: dx.op.textureGather.f32(i32 73
+// CHECK: extractvalue {{.*}}, 3
 
 
 SamplerState samp1;