Jelajahi Sumber

Ignore default val for cbuffer. (#907)

Xiang Li 7 tahun lalu
induk
melakukan
64eb31cc51

+ 8 - 0
tools/clang/lib/AST/ExprConstant.cpp

@@ -8576,6 +8576,14 @@ static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E) {
         return true;
     if (E->getStmtClass() == Stmt::InitListExprClass && !E->getType()->isScalarType())
       return false;
+    if (E->getStmtClass() == Stmt::DeclRefExprClass) {
+      const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
+      const ValueDecl *VD = DRE->getDecl();
+      // External variable is in cbuffer, cannot use as immediate.
+      if (VD->hasExternalFormalLinkage() &&
+          !isa<EnumConstantDecl>(VD))
+        return false;
+    }
   }
   // HLSL Change Ends.
   QualType T = E->getType();

+ 14 - 0
tools/clang/test/CodeGenHLSL/quick-test/cbuffer_default_val.hlsl

@@ -0,0 +1,14 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// Make sure default val for cbuffer element is ignored.
+
+// CHECK-NOT: float 5.000000e-01
+// CHECK: cbufferLoad
+// CHECK: Sqrt
+
+float t = 0.5;
+
+float main() : SV_TARGET
+{
+  return sqrt(t);
+}