浏览代码

Take care resource in cbuffer when not_use_legacy_cbuf_load. (#2543)

Xiang Li 5 年之前
父节点
当前提交
0d24872386
共有 2 个文件被更改,包括 62 次插入30 次删除
  1. 43 30
      lib/HLSL/HLOperationLower.cpp
  2. 19 0
      tools/clang/test/HLSLFileCheck/hlsl/objects/Cbuffer/resource-in-cb.hlsl

+ 43 - 30
lib/HLSL/HLOperationLower.cpp

@@ -5529,7 +5529,8 @@ Value *TranslateConstBufMatLd(Type *matType, Value *handle, Value *offset,
 void TranslateCBGep(GetElementPtrInst *GEP, Value *handle, Value *baseOffset,
                     hlsl::OP *hlslOP, IRBuilder<> &Builder,
                     DxilFieldAnnotation *prevFieldAnnotation,
-                    const DataLayout &DL, DxilTypeSystem &dxilTypeSys);
+                    const DataLayout &DL, DxilTypeSystem &dxilTypeSys,
+                    HLObjectOperationLowerHelper *pObjHelper);
 
 Value *GenerateVecEltFromGEP(Value *ldData, GetElementPtrInst *GEP,
                              IRBuilder<> &Builder, bool bInsertLdNextToGEP) {
@@ -5568,10 +5569,33 @@ Value *GenerateVecEltFromGEP(Value *ldData, GetElementPtrInst *GEP,
   }
 }
 
+void TranslateResourceInCB(LoadInst *LI,
+                           HLObjectOperationLowerHelper *pObjHelper,
+                           GlobalVariable *CbGV) {
+  if (LI->user_empty()) {
+    LI->eraseFromParent();
+    return;
+  }
+
+  GetElementPtrInst *Ptr = cast<GetElementPtrInst>(LI->getPointerOperand());
+  CallInst *CI = cast<CallInst>(LI->user_back());
+  MDNode *MD = HLModule::GetDxilResourceAttrib(CI->getCalledFunction());
+
+  Value *ResPtr = pObjHelper->GetOrCreateResourceForCbPtr(Ptr, CbGV, MD);
+
+  // Lower Ptr to GV base Ptr.
+  Value *GvPtr = pObjHelper->LowerCbResourcePtr(Ptr, ResPtr);
+  IRBuilder<> Builder(LI);
+  Value *GvLd = Builder.CreateLoad(GvPtr);
+  LI->replaceAllUsesWith(GvLd);
+  LI->eraseFromParent();
+}
+
 void TranslateCBAddressUser(Instruction *user, Value *handle, Value *baseOffset,
                             hlsl::OP *hlslOP,
                             DxilFieldAnnotation *prevFieldAnnotation,
-                            DxilTypeSystem &dxilTypeSys, const DataLayout &DL) {
+                            DxilTypeSystem &dxilTypeSys, const DataLayout &DL,
+                            HLObjectOperationLowerHelper *pObjHelper) {
   IRBuilder<> Builder(user);
   if (CallInst *CI = dyn_cast<CallInst>(user)) {
     HLOpcodeGroup group = GetHLOpcodeGroupByName(CI->getCalledFunction());
@@ -5673,6 +5697,14 @@ void TranslateCBAddressUser(Instruction *user, Value *handle, Value *baseOffset,
   } else if (LoadInst *ldInst = dyn_cast<LoadInst>(user)) {
     Type *Ty = ldInst->getType();
     Type *EltTy = Ty->getScalarType();
+    // Resource inside cbuffer is lowered after GenerateDxilOperations.
+    if (dxilutil::IsHLSLObjectType(Ty)) {
+      CallInst *CI = cast<CallInst>(handle);
+      GlobalVariable *CbGV = cast<GlobalVariable>(
+          CI->getArgOperand(HLOperandIndex::kCreateHandleResourceOpIdx));
+      TranslateResourceInCB(ldInst, pObjHelper, CbGV);
+      return;
+    }
     DXASSERT(!Ty->isAggregateType(), "should be flat in previous pass");
 
     unsigned EltByteSize = GetEltTypeByteSizeForConstBuf(EltTy, DL);
@@ -5699,7 +5731,7 @@ void TranslateCBAddressUser(Instruction *user, Value *handle, Value *baseOffset,
     // Must be GEP here
     GetElementPtrInst *GEP = cast<GetElementPtrInst>(user);
     TranslateCBGep(GEP, handle, baseOffset, hlslOP, Builder,
-                   prevFieldAnnotation, DL, dxilTypeSys);
+                   prevFieldAnnotation, DL, dxilTypeSys, pObjHelper);
     GEP->eraseFromParent();
   }
 }
@@ -5707,7 +5739,8 @@ void TranslateCBAddressUser(Instruction *user, Value *handle, Value *baseOffset,
 void TranslateCBGep(GetElementPtrInst *GEP, Value *handle, Value *baseOffset,
                     hlsl::OP *hlslOP, IRBuilder<> &Builder,
                     DxilFieldAnnotation *prevFieldAnnotation,
-                    const DataLayout &DL, DxilTypeSystem &dxilTypeSys) {
+                    const DataLayout &DL, DxilTypeSystem &dxilTypeSys,
+                    HLObjectOperationLowerHelper *pObjHelper) {
   SmallVector<Value *, 8> Indices(GEP->idx_begin(), GEP->idx_end());
 
   Value *offset = baseOffset;
@@ -5813,19 +5846,21 @@ void TranslateCBGep(GetElementPtrInst *GEP, Value *handle, Value *baseOffset,
     Instruction *user = cast<Instruction>(*(U++));
 
     TranslateCBAddressUser(user, handle, offset, hlslOP, fieldAnnotation,
-                           dxilTypeSys, DL);
+                           dxilTypeSys, DL, pObjHelper);
   }
 }
 
 void TranslateCBOperations(Value *handle, Value *ptr, Value *offset, OP *hlslOP,
-                           DxilTypeSystem &dxilTypeSys, const DataLayout &DL) {
+                           DxilTypeSystem &dxilTypeSys, const DataLayout &DL,
+                           HLObjectOperationLowerHelper *pObjHelper) {
   auto User = ptr->user_begin();
   auto UserE = ptr->user_end();
   for (; User != UserE;) {
     // Must be Instruction.
     Instruction *I = cast<Instruction>(*(User++));
     TranslateCBAddressUser(I, handle, offset, hlslOP,
-                           /*prevFieldAnnotation*/ nullptr, dxilTypeSys, DL);
+                           /*prevFieldAnnotation*/ nullptr, dxilTypeSys, DL,
+                           pObjHelper);
   }
 }
 
@@ -5971,28 +6006,6 @@ void TranslateCBGepLegacy(GetElementPtrInst *GEP, Value *handle,
                           const DataLayout &DL, DxilTypeSystem &dxilTypeSys,
                           HLObjectOperationLowerHelper *pObjHelper);
 
-void TranslateResourceInCB(LoadInst *LI,
-                           HLObjectOperationLowerHelper *pObjHelper,
-                           GlobalVariable *CbGV) {
-  if (LI->user_empty()) {
-    LI->eraseFromParent();
-    return;
-  }
-
-  GetElementPtrInst *Ptr = cast<GetElementPtrInst>(LI->getPointerOperand());
-  CallInst *CI = cast<CallInst>(LI->user_back());
-  MDNode *MD = HLModule::GetDxilResourceAttrib(CI->getCalledFunction());
-
-  Value *ResPtr = pObjHelper->GetOrCreateResourceForCbPtr(Ptr, CbGV, MD);
-
-  // Lower Ptr to GV base Ptr.
-  Value *GvPtr = pObjHelper->LowerCbResourcePtr(Ptr, ResPtr);
-  IRBuilder<> Builder(LI);
-  Value *GvLd = Builder.CreateLoad(GvPtr);
-  LI->replaceAllUsesWith(GvLd);
-  LI->eraseFromParent();
-}
-
 void TranslateCBAddressUserLegacy(Instruction *user, Value *handle,
                                   Value *legacyIdx, unsigned channelOffset,
                                   hlsl::OP *hlslOP,
@@ -7407,7 +7420,7 @@ void TranslateHLSubscript(CallInst *CI, HLSubscriptOpcode opcode,
     else {
       TranslateCBOperations(handle, CI, /*offset*/ hlslOP->GetU32Const(0),
                             hlslOP, helper.dxilTypeSys,
-                            CI->getModule()->getDataLayout());
+                            CI->getModule()->getDataLayout(), pObjHelper);
     }
     Translated = true;
     return;

+ 19 - 0
tools/clang/test/HLSLFileCheck/hlsl/objects/Cbuffer/resource-in-cb.hlsl

@@ -0,0 +1,19 @@
+// RUN: %dxc -E main -T ps_6_0 -not_use_legacy_cbuf_load %s  | FileCheck %s
+
+// CHECK: Tex1
+
+SamplerState Samp;
+cbuffer CB
+{
+  Texture2D Tex1;
+  // Texture3D Tex2;
+  // RWTexture2D<float4> RWTex1;
+  // RWTexture3D<float4> RWTex2;
+  // SamplerState Samp;
+  float4 foo;
+};
+
+float4 main(int4 a : A, float4 coord : TEXCOORD) : SV_TARGET
+{
+  return Tex1.Sample(Samp, coord.xy) * foo;
+}