Переглянути джерело

Support component float to bool cast. (#142)

Xiang Li 8 роки тому
батько
коміт
a38ada07d0

+ 2 - 0
tools/clang/lib/CodeGen/CGExprScalar.cpp

@@ -1818,6 +1818,8 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
   }
   case CK_HLSLCC_IntegralToBoolean:
     return EmitIntToBoolConversion(Visit(E));
+  case CK_HLSLCC_FloatingToBoolean:
+    return EmitFloatToBoolConversion(Visit(E));
   // HLSL Change Ends
   }
 

+ 16 - 0
tools/clang/test/CodeGenHLSL/float_to_bool.hlsl

@@ -0,0 +1,16 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// CHECK: fcmp fast une
+// CHECK: fcmp fast une
+
+float test(bool2 x, float b) {
+    if (x.x)
+        return b;
+    else
+        return x.y;
+}
+
+float main(float2 a : A, float b : B) : SV_Target
+{
+  return test(a, b);
+}

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

@@ -344,6 +344,7 @@ public:
   TEST_METHOD(CodeGenEval)
   TEST_METHOD(CodeGenEvalPos)
   TEST_METHOD(CodeGenExternRes)
+  TEST_METHOD(CodeGenFloatToBool)
   TEST_METHOD(CodeGenFirstbitHi)
   TEST_METHOD(CodeGenFirstbitLo)
   TEST_METHOD(CodeGenFloatMaxtessfactor)
@@ -2092,6 +2093,10 @@ TEST_F(CompilerTest, CodeGenExternRes) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\extern_res.hlsl");
 }
 
+TEST_F(CompilerTest, CodeGenFloatToBool) {
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\float_to_bool.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenFirstbitHi) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\firstbitHi.hlsl");
 }