Jelajahi Sumber

Set resource ID in DxilLinkJob::AddResourceToDM. (#442)

Xiang Li 8 tahun lalu
induk
melakukan
57b583d1b1
2 mengubah file dengan 13 tambahan dan 0 penghapusan
  1. 7 0
      lib/HLSL/DxilLinker.cpp
  2. 6 0
      tools/clang/test/CodeGenHLSL/lib_resource2.hlsl

+ 7 - 0
lib/HLSL/DxilLinker.cpp

@@ -353,6 +353,7 @@ void DxilLinkJob::AddResourceToDM(DxilModule &DM) {
     DxilResourceBase *res = it.second.first;
     GlobalVariable *GV = it.second.second;
     unsigned ID = 0;
+    DxilResourceBase *basePtr = nullptr;
     switch (res->GetClass()) {
     case DXIL::ResourceClass::UAV: {
       std::unique_ptr<DxilResource> pUAV = llvm::make_unique<DxilResource>();
@@ -360,6 +361,7 @@ void DxilLinkJob::AddResourceToDM(DxilModule &DM) {
       // Copy the content.
       *ptr = *(static_cast<DxilResource *>(res));
       ID = DM.AddUAV(std::move(pUAV));
+      basePtr = &DM.GetUAV(ID);
     } break;
     case DXIL::ResourceClass::SRV: {
       std::unique_ptr<DxilResource> pSRV = llvm::make_unique<DxilResource>();
@@ -367,6 +369,7 @@ void DxilLinkJob::AddResourceToDM(DxilModule &DM) {
       // Copy the content.
       *ptr = *(static_cast<DxilResource *>(res));
       ID = DM.AddSRV(std::move(pSRV));
+      basePtr = &DM.GetSRV(ID);
     } break;
     case DXIL::ResourceClass::CBuffer: {
       std::unique_ptr<DxilCBuffer> pCBuf = llvm::make_unique<DxilCBuffer>();
@@ -374,6 +377,7 @@ void DxilLinkJob::AddResourceToDM(DxilModule &DM) {
       // Copy the content.
       *ptr = *(static_cast<DxilCBuffer *>(res));
       ID = DM.AddCBuffer(std::move(pCBuf));
+      basePtr = &DM.GetCBuffer(ID);
     } break;
     case DXIL::ResourceClass::Sampler: {
       std::unique_ptr<DxilSampler> pSampler = llvm::make_unique<DxilSampler>();
@@ -381,12 +385,15 @@ void DxilLinkJob::AddResourceToDM(DxilModule &DM) {
       // Copy the content.
       *ptr = *(static_cast<DxilSampler *>(res));
       ID = DM.AddSampler(std::move(pSampler));
+      basePtr = &DM.GetSampler(ID);
     }
     default:
       DXASSERT(res->GetClass() == DXIL::ResourceClass::Sampler,
                "else invalid resource");
       break;
     }
+    // Update ID.
+    basePtr->SetID(ID);
     Constant *rangeID = ConstantInt::get(GV->getType()->getElementType(), ID);
     for (User *U : GV->users()) {
       LoadInst *LI = cast<LoadInst>(U);

+ 6 - 0
tools/clang/test/CodeGenHLSL/lib_resource2.hlsl

@@ -1,5 +1,11 @@
 // Check resource link with lib_cs_entry.hlsl
 
+RWStructuredBuffer<float2x2> unusedBuf;
+
+void UsedResFn(float2x2  m, uint gidx) {
+  unusedBuf[gidx] = m;
+}
+
 RWStructuredBuffer<float2x2> fA;
 
 void StoreOutputMat(float2x2  m, uint gidx) {