2
0
Эх сурвалжийг харах

Lower ObjectToWorld and WorldToObject.

Xiang Li 7 жил өмнө
parent
commit
1c8218861a

+ 9 - 1
lib/HLSL/HLOperationLower.cpp

@@ -4356,7 +4356,15 @@ Value *TranslateNoArgMatrixOperation(CallInst *CI, IntrinsicOp IOP, OP::OpCode o
                          HLOperationLowerHelper &helper,
                          HLObjectOperationLowerHelper *pObjHelper,
                          bool &Translated) {
-  return nullptr;
+  hlsl::OP *hlslOP = &helper.hlslOP;
+  VectorType *Ty = cast<VectorType>(CI->getType());
+  uint32_t rVals[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2};
+  Constant *rows = ConstantDataVector::get(CI->getContext(), rVals);
+  uint8_t cVals[] = {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3};
+  Constant *cols = ConstantDataVector::get(CI->getContext(), cVals);
+  Value *retVal =
+      TrivialDxilOperation(opcode, {nullptr, rows, cols}, Ty, CI, hlslOP);
+  return retVal;
 }
 
 } // namespace

+ 34 - 0
tools/clang/test/CodeGenHLSL/quick-test/ray_trace8.hlsl

@@ -0,0 +1,34 @@
+// RUN: %dxc -T lib_6_2 %s | FileCheck %s
+
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 0, i8 0)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 0, i8 1)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 0, i8 2)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 0, i8 3)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 1, i8 0)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 1, i8 1)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 1, i8 2)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 1, i8 3)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 2, i8 0)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 2, i8 1)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 2, i8 2)
+// CHECK: call float @dx.op.objectToWorld.f32(i32 151, i32 2, i8 3)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 0, i8 0)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 0, i8 1)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 0, i8 2)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 0, i8 3)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 1, i8 0)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 1, i8 1)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 1, i8 2)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 1, i8 3)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 2, i8 0)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 2, i8 1)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 2, i8 2)
+// CHECK: call float @dx.op.worldToObject.f32(i32 152, i32 2, i8 3)
+
+float3x4 emit(uint shader)  {
+  float3x4 o2w = ObjectToWorld();
+  float3x4 w2o = WorldToObject();
+
+
+   return o2w + w2o;
+}