|
@@ -12,6 +12,7 @@
|
|
#include "llvm/Bitcode/ReaderWriter.h"
|
|
#include "llvm/Bitcode/ReaderWriter.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/IR/InstIterator.h"
|
|
#include "llvm/IR/InstIterator.h"
|
|
|
|
+#include "llvm/IR/Operator.h"
|
|
#include "dxc/DxilContainer/DxilContainer.h"
|
|
#include "dxc/DxilContainer/DxilContainer.h"
|
|
#include "dxc/DXIL/DxilModule.h"
|
|
#include "dxc/DXIL/DxilModule.h"
|
|
#include "dxc/DXIL/DxilShaderModel.h"
|
|
#include "dxc/DXIL/DxilShaderModel.h"
|
|
@@ -203,6 +204,7 @@ private:
|
|
|
|
|
|
void AddResourceUseToFunctions(DxilResourceBase &resource, unsigned resIndex);
|
|
void AddResourceUseToFunctions(DxilResourceBase &resource, unsigned resIndex);
|
|
void AddResourceDependencies();
|
|
void AddResourceDependencies();
|
|
|
|
+ void SetCBufferUsage();
|
|
|
|
|
|
public:
|
|
public:
|
|
DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
|
|
DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
|
|
@@ -2324,6 +2326,31 @@ void DxilLibraryReflection::AddResourceDependencies() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void CollectCBufUsageForLib(Value *V, std::vector<unsigned> &cbufUsage) {
|
|
|
|
+ for (auto user : V->users()) {
|
|
|
|
+ Value *V = user;
|
|
|
|
+ if (auto *CI = dyn_cast<CallInst>(V)) {
|
|
|
|
+ if (hlsl::OP::IsDxilOpFuncCallInst(CI, hlsl::OP::OpCode::CreateHandleForLib)) {
|
|
|
|
+ CollectCBufUsage(CI, cbufUsage);
|
|
|
|
+ }
|
|
|
|
+ } else if (isa<GEPOperator>(V) ||
|
|
|
|
+ isa<LoadInst>(V)) {
|
|
|
|
+ CollectCBufUsageForLib(user, cbufUsage);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void DxilLibraryReflection::SetCBufferUsage() {
|
|
|
|
+ unsigned cbSize = std::min(m_CBs.size(), m_pDxilModule->GetCBuffers().size());
|
|
|
|
+
|
|
|
|
+ for (unsigned i=0;i<cbSize;i++) {
|
|
|
|
+ std::vector<unsigned> cbufUsage;
|
|
|
|
+ CollectCBufUsageForLib(m_pDxilModule->GetCBuffer(i).GetGlobalSymbol(), cbufUsage);
|
|
|
|
+ SetCBufVarUsage(*m_CBs[i], cbufUsage);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
// ID3D12LibraryReflection
|
|
// ID3D12LibraryReflection
|
|
|
|
|
|
HRESULT DxilLibraryReflection::Load(IDxcBlob *pBlob,
|
|
HRESULT DxilLibraryReflection::Load(IDxcBlob *pBlob,
|
|
@@ -2332,6 +2359,7 @@ HRESULT DxilLibraryReflection::Load(IDxcBlob *pBlob,
|
|
|
|
|
|
try {
|
|
try {
|
|
AddResourceDependencies();
|
|
AddResourceDependencies();
|
|
|
|
+ SetCBufferUsage();
|
|
return S_OK;
|
|
return S_OK;
|
|
}
|
|
}
|
|
CATCH_CPP_RETURN_HRESULT();
|
|
CATCH_CPP_RETURN_HRESULT();
|