Browse Source

Collect resource property for temp arg resource like call(conde?sampler0:sampler1). (#3458)

Xiang Li 4 years ago
parent
commit
11d32dc581

+ 6 - 0
tools/clang/lib/CodeGen/CGCall.cpp

@@ -2895,6 +2895,12 @@ void CodeGenFunction::EmitCallArgs(CallArgList &Args,
     for (int I = ArgTypes.size() - 1; I >= 0; --I) {
       CallExpr::const_arg_iterator Arg = ArgBeg + I;
       EmitCallArg(Args, *Arg, ArgTypes[I]);
+      // HLSL Change begin.
+      RValue CallArg = Args.back().RV;
+      if (CallArg.isAggregate())
+        CGM.getHLSLRuntime().MarkCallArgumentTemp(*this, CallArg.getAggregateAddr(),
+                                                  ArgTypes[I]);
+      // HLSL Change end.
       EmitNonNullArgCheck(Args.back().RV, ArgTypes[I], Arg->getExprLoc(),
                           CalleeDecl, ParamsToSkip + I);
     }

+ 8 - 0
tools/clang/lib/CodeGen/CGHLSLMS.cpp

@@ -292,6 +292,8 @@ public:
                           ArrayRef<const Attr *> Attrs) override;
   void MarkRetTemp(CodeGenFunction &CGF, llvm::Value *V,
                   clang::QualType QaulTy) override;
+  void MarkCallArgumentTemp(CodeGenFunction &CGF, llvm::Value *V,
+                  clang::QualType QaulTy) override;
   void FinishAutoVar(CodeGenFunction &CGF, const VarDecl &D, llvm::Value *V) override;
   void MarkIfStmt(CodeGenFunction &CGF, BasicBlock *endIfBB) override;
   void MarkSwitchStmt(CodeGenFunction &CGF, SwitchInst *switchInst,
@@ -2378,6 +2380,12 @@ void CGMSHLSLRuntime::MarkRetTemp(CodeGenFunction &CGF, Value *V,
   AddValToPropertyMap(V, QualTy);
 }
 
+void CGMSHLSLRuntime::MarkCallArgumentTemp(CodeGenFunction &CGF, llvm::Value *V,
+                                           clang::QualType QualTy) {
+  // Save object properties for call arg temp.
+  AddValToPropertyMap(V, QualTy);
+}
+
 void CGMSHLSLRuntime::FinishAutoVar(CodeGenFunction &CGF, const VarDecl &D,
                                     llvm::Value *V) {
   if (D.hasAttr<HLSLPreciseAttr>()) {

+ 2 - 0
tools/clang/lib/CodeGen/CGHLSLRuntime.h

@@ -83,6 +83,8 @@ public:
       llvm::SmallVector<LValue, 8> &lifetimeCleanupList) = 0;
   virtual void MarkRetTemp(CodeGenFunction &CGF, llvm::Value *V,
                           clang::QualType QaulTy) = 0;
+  virtual void MarkCallArgumentTemp(CodeGenFunction &CGF, llvm::Value *V,
+                  clang::QualType QaulTy) = 0;
   virtual llvm::Value *EmitHLSLMatrixOperationCall(CodeGenFunction &CGF, const clang::Expr *E, llvm::Type *RetType,
       llvm::ArrayRef<llvm::Value*> paramList) = 0;
   virtual void EmitHLSLDiscard(CodeGenFunction &CGF) = 0;

+ 15 - 0
tools/clang/test/HLSLFileCheck/hlsl/operators/select/sel_sampler.hlsl

@@ -0,0 +1,15 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// Make sure cond ? s0 : s1 as temp works.
+// CHECK:= call %dx.types.ResRet.f32 @dx.op.sample.f32
+bool getCond() { return true;}
+
+SamplerState s0;
+SamplerState s1;
+
+Texture2D<float4> tex;
+
+float4 main(float2 uv : UV) : SV_Target {
+  bool cond = getCond();
+  return tex.Sample(cond ? s0 : s1, uv);
+}