|
@@ -20,8 +20,18 @@ Framework::DX12ShaderSignature::~DX12ShaderSignature()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void Framework::DX12ShaderSignature::addRegisterUsage(
|
|
|
|
|
|
|
+void Framework::DX12ShaderSignature::addRegisterUsageLinkedToShaderBindingTable(
|
|
|
DX12ShaderRegister registerType, int registerIndex, int spaceIndex)
|
|
DX12ShaderRegister registerType, int registerIndex, int spaceIndex)
|
|
|
|
|
+{
|
|
|
|
|
+ addRegisterUsageLinkedToDescriptorHeap(
|
|
|
|
|
+ -1, registerType, registerIndex, spaceIndex);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void Framework::DX12ShaderSignature::addRegisterUsageLinkedToDescriptorHeap(
|
|
|
|
|
+ int descriptorHeapIndex,
|
|
|
|
|
+ DX12ShaderRegister registerType,
|
|
|
|
|
+ int registerIndex,
|
|
|
|
|
+ int spaceIndex)
|
|
|
{
|
|
{
|
|
|
// register usages sould be sorted by registerType -> spaceIndex ->
|
|
// register usages sould be sorted by registerType -> spaceIndex ->
|
|
|
// registerIndex
|
|
// registerIndex
|
|
@@ -55,11 +65,20 @@ void Framework::DX12ShaderSignature::addRegisterUsage(
|
|
|
}
|
|
}
|
|
|
if (found)
|
|
if (found)
|
|
|
{
|
|
{
|
|
|
- it.addBefore({registerType, registerIndex, spaceIndex});
|
|
|
|
|
|
|
+ if (it.val().registerIndex == registerIndex)
|
|
|
|
|
+ {
|
|
|
|
|
+ Logging::error()
|
|
|
|
|
+ << "Duplicate register usage in root signature: "
|
|
|
|
|
+ << registerType << " " << registerIndex << " " << spaceIndex;
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ it.addBefore(
|
|
|
|
|
+ {registerType, registerIndex, spaceIndex, descriptorHeapIndex});
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- registerUsages.add({registerType, registerIndex, spaceIndex});
|
|
|
|
|
|
|
+ registerUsages.add(
|
|
|
|
|
+ {registerType, registerIndex, spaceIndex, descriptorHeapIndex});
|
|
|
}
|
|
}
|
|
|
changed = 1;
|
|
changed = 1;
|
|
|
}
|
|
}
|
|
@@ -77,56 +96,88 @@ void Framework::DX12ShaderSignature::createSignature(ID3D12Device5* zDevice,
|
|
|
signature->Release();
|
|
signature->Release();
|
|
|
signature = 0;
|
|
signature = 0;
|
|
|
}
|
|
}
|
|
|
- D3D12_ROOT_PARAMETER descriptorTable;
|
|
|
|
|
- descriptorTable.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
|
|
|
|
|
- descriptorTable.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
|
|
|
|
|
- descriptorTable.DescriptorTable.NumDescriptorRanges
|
|
|
|
|
- = registerUsages.getEntryCount();
|
|
|
|
|
|
|
+ D3D12_ROOT_PARAMETER* descriptorTable
|
|
|
|
|
+ = new D3D12_ROOT_PARAMETER[registerUsages.getEntryCount()];
|
|
|
D3D12_DESCRIPTOR_RANGE* descriptorRanges
|
|
D3D12_DESCRIPTOR_RANGE* descriptorRanges
|
|
|
= new D3D12_DESCRIPTOR_RANGE[registerUsages.getEntryCount()];
|
|
= new D3D12_DESCRIPTOR_RANGE[registerUsages.getEntryCount()];
|
|
|
- int index = 0;
|
|
|
|
|
ArrayIterator<DX12ShaderRegisterUsage> it = registerUsages.begin();
|
|
ArrayIterator<DX12ShaderRegisterUsage> it = registerUsages.begin();
|
|
|
|
|
+ int index = 0;
|
|
|
while (it)
|
|
while (it)
|
|
|
{
|
|
{
|
|
|
const auto& usage = it.val();
|
|
const auto& usage = it.val();
|
|
|
- D3D12_DESCRIPTOR_RANGE* range = &descriptorRanges[index];
|
|
|
|
|
- switch (usage.registerType)
|
|
|
|
|
|
|
+ if (usage.descriptorHeapIndex >= 0)
|
|
|
{
|
|
{
|
|
|
- case DX12_SHADER_REGISTER_B_CONST_BUFFER:
|
|
|
|
|
- range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
|
|
|
|
|
- break;
|
|
|
|
|
- case DX12_SHADER_REGISTER_T_SHADER_RESOURCE:
|
|
|
|
|
- range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
|
|
|
|
|
- break;
|
|
|
|
|
- case DX12_SHADER_REGISTER_U_UNORDERED_ACCESS:
|
|
|
|
|
- range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- Logging::error() << "Unknown register type for root signature: "
|
|
|
|
|
- << usage.registerType;
|
|
|
|
|
- range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
|
|
|
|
|
|
|
+ descriptorTable[index].ParameterType
|
|
|
|
|
+ = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
|
|
|
|
|
+ descriptorTable[index].ShaderVisibility
|
|
|
|
|
+ = D3D12_SHADER_VISIBILITY_ALL;
|
|
|
|
|
+ descriptorTable[index].DescriptorTable.NumDescriptorRanges
|
|
|
|
|
+ = registerUsages.getEntryCount();
|
|
|
|
|
+ D3D12_DESCRIPTOR_RANGE* range = &descriptorRanges[index];
|
|
|
|
|
+ switch (usage.registerType)
|
|
|
|
|
+ {
|
|
|
|
|
+ case DX12_SHADER_REGISTER_B_CONST_BUFFER:
|
|
|
|
|
+ range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case DX12_SHADER_REGISTER_T_SHADER_RESOURCE:
|
|
|
|
|
+ range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case DX12_SHADER_REGISTER_U_UNORDERED_ACCESS:
|
|
|
|
|
+ range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ Logging::error() << "Unknown register type for root signature: "
|
|
|
|
|
+ << usage.registerType;
|
|
|
|
|
+ range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
|
|
|
|
|
+ }
|
|
|
|
|
+ ArrayIterator<DX12ShaderRegisterUsage> next = it.next();
|
|
|
|
|
+ int size = 1;
|
|
|
|
|
+ while (next && next.val().registerType == usage.registerType
|
|
|
|
|
+ && next.val().spaceIndex == usage.spaceIndex
|
|
|
|
|
+ && next.val().registerIndex == usage.registerIndex + size
|
|
|
|
|
+ && next.val().descriptorHeapIndex
|
|
|
|
|
+ == usage.descriptorHeapIndex + size)
|
|
|
|
|
+ {
|
|
|
|
|
+ ++size;
|
|
|
|
|
+ it = next;
|
|
|
|
|
+ ++next;
|
|
|
|
|
+ }
|
|
|
|
|
+ range->NumDescriptors = size;
|
|
|
|
|
+ range->BaseShaderRegister = usage.registerIndex;
|
|
|
|
|
+ range->RegisterSpace = usage.spaceIndex;
|
|
|
|
|
+ range->OffsetInDescriptorsFromTableStart
|
|
|
|
|
+ = usage.descriptorHeapIndex;
|
|
|
|
|
+ descriptorTable[index].DescriptorTable.pDescriptorRanges = range;
|
|
|
}
|
|
}
|
|
|
- ArrayIterator<DX12ShaderRegisterUsage> next = it.next();
|
|
|
|
|
- int size = 1;
|
|
|
|
|
- while (next && next.val().registerType == usage.registerType
|
|
|
|
|
- && next.val().spaceIndex == usage.spaceIndex
|
|
|
|
|
- && next.val().registerIndex == usage.registerIndex + size)
|
|
|
|
|
|
|
+ else
|
|
|
{
|
|
{
|
|
|
- ++size;
|
|
|
|
|
- it = next;
|
|
|
|
|
- ++next;
|
|
|
|
|
|
|
+ switch (usage.registerType)
|
|
|
|
|
+ {
|
|
|
|
|
+ case DX12_SHADER_REGISTER_B_CONST_BUFFER:
|
|
|
|
|
+ descriptorTable[index].ParameterType
|
|
|
|
|
+ = D3D12_ROOT_PARAMETER_TYPE_CBV;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case DX12_SHADER_REGISTER_T_SHADER_RESOURCE:
|
|
|
|
|
+ descriptorTable[index].ParameterType
|
|
|
|
|
+ = D3D12_ROOT_PARAMETER_TYPE_SRV;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case DX12_SHADER_REGISTER_U_UNORDERED_ACCESS:
|
|
|
|
|
+ descriptorTable[index].ParameterType
|
|
|
|
|
+ = D3D12_ROOT_PARAMETER_TYPE_UAV;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ descriptorTable[index].ShaderVisibility
|
|
|
|
|
+ = D3D12_SHADER_VISIBILITY_ALL;
|
|
|
|
|
+ descriptorTable[index].Descriptor.ShaderRegister
|
|
|
|
|
+ = usage.registerIndex;
|
|
|
|
|
+ descriptorTable[index].Descriptor.RegisterSpace = usage.spaceIndex;
|
|
|
}
|
|
}
|
|
|
- range->NumDescriptors = size;
|
|
|
|
|
- range->BaseShaderRegister = usage.registerIndex;
|
|
|
|
|
- range->RegisterSpace = usage.spaceIndex;
|
|
|
|
|
- range->OffsetInDescriptorsFromTableStart = index;
|
|
|
|
|
++it;
|
|
++it;
|
|
|
- index++;
|
|
|
|
|
|
|
+ ++index;
|
|
|
}
|
|
}
|
|
|
- descriptorTable.DescriptorTable.pDescriptorRanges = descriptorRanges;
|
|
|
|
|
D3D12_ROOT_SIGNATURE_DESC rootDesc = {};
|
|
D3D12_ROOT_SIGNATURE_DESC rootDesc = {};
|
|
|
- rootDesc.NumParameters = 1;
|
|
|
|
|
- rootDesc.pParameters = &descriptorTable;
|
|
|
|
|
|
|
+ rootDesc.NumParameters = index;
|
|
|
|
|
+ rootDesc.pParameters = descriptorTable;
|
|
|
rootDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_LOCAL_ROOT_SIGNATURE;
|
|
rootDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_LOCAL_ROOT_SIGNATURE;
|
|
|
ID3DBlob* pSigBlob = 0;
|
|
ID3DBlob* pSigBlob = 0;
|
|
|
ID3DBlob* pErrorBlob = 0;
|
|
ID3DBlob* pErrorBlob = 0;
|
|
@@ -159,16 +210,11 @@ ID3D12RootSignature* Framework::DX12ShaderSignature::zSignature() const
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const Array<DX12ShaderRegisterUsage>&
|
|
const Array<DX12ShaderRegisterUsage>&
|
|
|
-Framework::DX12ShaderSignature::getRegisterUsagesOrder() const
|
|
|
|
|
|
|
+Framework::DX12ShaderSignature::getRegisterUsages() const
|
|
|
{
|
|
{
|
|
|
return registerUsages;
|
|
return registerUsages;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-ShaderHeap* Framework::DX12ShaderSignature::createShaderHeap()
|
|
|
|
|
-{
|
|
|
|
|
- return new ShaderHeap(dynamic_cast<DX12ShaderSignature*>(getThis()));
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
Framework::DX12ShaderFunction::DX12ShaderFunction(
|
|
Framework::DX12ShaderFunction::DX12ShaderFunction(
|
|
|
const Text& functionName, DX12ShaderSignature* signature)
|
|
const Text& functionName, DX12ShaderSignature* signature)
|
|
|
: ReferenceCounter(),
|
|
: ReferenceCounter(),
|
|
@@ -832,16 +878,26 @@ ID3D12StateObject* Framework::DX12Pipeline::zPipelineState() const
|
|
|
return pipelineState;
|
|
return pipelineState;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-Framework::ShaderHeap::ShaderHeap(DX12ShaderSignature* signature)
|
|
|
|
|
|
|
+DX12ShaderBindingTable* Framework::DX12Pipeline::createShaderBindingTable()
|
|
|
|
|
+{
|
|
|
|
|
+ return new DX12ShaderBindingTable(dynamic_cast<DX12Pipeline*>(getThis()));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+DX12GlobalDescriptorHeap* Framework::DX12Pipeline::createGlobalDescriptorHeap()
|
|
|
|
|
+{
|
|
|
|
|
+ return new DX12GlobalDescriptorHeap(dynamic_cast<DX12Pipeline*>(getThis()));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Framework::DX12GlobalDescriptorHeap::DX12GlobalDescriptorHeap(
|
|
|
|
|
+ DX12Pipeline* pipeline)
|
|
|
: ReferenceCounter(),
|
|
: ReferenceCounter(),
|
|
|
- signature(signature),
|
|
|
|
|
descriptorHeap(0),
|
|
descriptorHeap(0),
|
|
|
lastDescriptorHeapSize(0)
|
|
lastDescriptorHeapSize(0)
|
|
|
{}
|
|
{}
|
|
|
|
|
|
|
|
-Framework::ShaderHeap::~ShaderHeap()
|
|
|
|
|
|
|
+Framework::DX12GlobalDescriptorHeap::~DX12GlobalDescriptorHeap()
|
|
|
{
|
|
{
|
|
|
- signature->release();
|
|
|
|
|
|
|
+ pipeline->release();
|
|
|
if (descriptorHeap)
|
|
if (descriptorHeap)
|
|
|
{
|
|
{
|
|
|
descriptorHeap->Release();
|
|
descriptorHeap->Release();
|
|
@@ -853,182 +909,202 @@ Framework::ShaderHeap::~ShaderHeap()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void Framework::ShaderHeap::setRegisterInput(DX12ShaderRegister registerType,
|
|
|
|
|
- int registerIndex,
|
|
|
|
|
- int spaceIndex,
|
|
|
|
|
- ReferenceCounter* inputResource)
|
|
|
|
|
|
|
+void Framework::DX12GlobalDescriptorHeap::addInput(
|
|
|
|
|
+ DX12ShaderRegister type, ReferenceCounter* inputResource)
|
|
|
{
|
|
{
|
|
|
- for (DX12ShaderRegisterInput* input : registerInputs)
|
|
|
|
|
|
|
+ bool found = 0;
|
|
|
|
|
+ for (DX12Shader* shader : pipeline->getShaders())
|
|
|
{
|
|
{
|
|
|
- if (input->registerIndex == registerIndex
|
|
|
|
|
- && input->spaceIndex == spaceIndex
|
|
|
|
|
- && input->registerType == registerType)
|
|
|
|
|
|
|
+ for (DX12ShaderFunction* function : shader->getFunctions())
|
|
|
{
|
|
{
|
|
|
- input->inputResource->release();
|
|
|
|
|
- input->inputResource = inputResource->getThis();
|
|
|
|
|
- return;
|
|
|
|
|
|
|
+ for (const DX12ShaderRegisterUsage& usage :
|
|
|
|
|
+ function->zSignature()->getRegisterUsages())
|
|
|
|
|
+ {
|
|
|
|
|
+ if (usage.descriptorHeapIndex == registerInputs.getEntryCount())
|
|
|
|
|
+ {
|
|
|
|
|
+ if (usage.registerType != type)
|
|
|
|
|
+ {
|
|
|
|
|
+ Logging::error()
|
|
|
|
|
+ << "Register type mismatch for register index "
|
|
|
|
|
+ << usage.registerIndex << ", space index "
|
|
|
|
|
+ << usage.spaceIndex << ". Expected register type: "
|
|
|
|
|
+ << usage.registerType
|
|
|
|
|
+ << ", given register type: " << type
|
|
|
|
|
+ << ". The register type is specified in the "
|
|
|
|
|
+ "signature of shader function '"
|
|
|
|
|
+ << function->getFunctionName() << "'";
|
|
|
|
|
+ throw std::logic_error(
|
|
|
|
|
+ "Register type mismatch for shader input");
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ found = 1;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (found)
|
|
|
|
|
+ {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- bool found = 0;
|
|
|
|
|
- for (const DX12ShaderRegisterUsage& usage :
|
|
|
|
|
- signature->getRegisterUsagesOrder())
|
|
|
|
|
- {
|
|
|
|
|
- if (usage.registerIndex == registerIndex
|
|
|
|
|
- && usage.spaceIndex == spaceIndex
|
|
|
|
|
- && usage.registerType == registerType)
|
|
|
|
|
|
|
+ if (found)
|
|
|
{
|
|
{
|
|
|
- found = 1;
|
|
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if (found)
|
|
|
|
|
- {
|
|
|
|
|
- registerInputs.add(new DX12ShaderRegisterInput{
|
|
|
|
|
- registerType, registerIndex, spaceIndex, inputResource->getThis()});
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- Logging::error() << "Register type " << registerType
|
|
|
|
|
- << ", register index " << registerIndex
|
|
|
|
|
- << ", space index " << spaceIndex
|
|
|
|
|
- << " is not used in the shader signature. The given "
|
|
|
|
|
- "input will be ignored.";
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ registerInputs.add(
|
|
|
|
|
+ new DX12ShaderRegisterInput{type, inputResource->getThis()});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void Framework::ShaderHeap::setRegisterInput(
|
|
|
|
|
- Texture* zTexture, int registerIndex, int spaceIndex)
|
|
|
|
|
|
|
+void Framework::DX12GlobalDescriptorHeap::addTextureInput(
|
|
|
|
|
+ DX12ShaderRegister type, Texture* zTexture)
|
|
|
{
|
|
{
|
|
|
- setRegisterInput(DX12_SHADER_REGISTER_U_UNORDERED_ACCESS,
|
|
|
|
|
- registerIndex,
|
|
|
|
|
- spaceIndex,
|
|
|
|
|
- zTexture);
|
|
|
|
|
|
|
+ addInput(type, zTexture);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void Framework::ShaderHeap::setRegisterInput(
|
|
|
|
|
- DXBuffer* zBuffer, int registerIndex, int spaceIndex)
|
|
|
|
|
|
|
+void Framework::DX12GlobalDescriptorHeap::addBufferInput(
|
|
|
|
|
+ DX12ShaderRegister type, DXBuffer* zBuffer)
|
|
|
{
|
|
{
|
|
|
- setRegisterInput(DX12_SHADER_REGISTER_B_CONST_BUFFER,
|
|
|
|
|
- registerIndex,
|
|
|
|
|
- spaceIndex,
|
|
|
|
|
- zBuffer);
|
|
|
|
|
|
|
+ addInput(type, zBuffer);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void Framework::ShaderHeap::setRegisterInput(
|
|
|
|
|
- DX12TLAS* zTLAS, int registerIndex, int spaceIndex)
|
|
|
|
|
|
|
+void Framework::DX12GlobalDescriptorHeap::addTLASInput(
|
|
|
|
|
+ DX12ShaderRegister type, DX12TLAS* zTLAS)
|
|
|
{
|
|
{
|
|
|
- setRegisterInput(DX12_SHADER_REGISTER_T_SHADER_RESOURCE,
|
|
|
|
|
- registerIndex,
|
|
|
|
|
- spaceIndex,
|
|
|
|
|
- zTLAS);
|
|
|
|
|
|
|
+ addInput(type, zTLAS);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void Framework::ShaderHeap::updateDescriptorHeap(ID3D12Device5* zDevice)
|
|
|
|
|
|
|
+void Framework::DX12GlobalDescriptorHeap::updateDescriptorHeap(
|
|
|
|
|
+ ID3D12Device5* zDevice)
|
|
|
{
|
|
{
|
|
|
- const Array<DX12ShaderRegisterUsage>& registerUsages
|
|
|
|
|
- = signature->getRegisterUsagesOrder();
|
|
|
|
|
if (!descriptorHeap
|
|
if (!descriptorHeap
|
|
|
- || lastDescriptorHeapSize
|
|
|
|
|
- != signature->getRegisterUsagesOrder().getEntryCount())
|
|
|
|
|
|
|
+ || lastDescriptorHeapSize != registerInputs.getEntryCount())
|
|
|
{
|
|
{
|
|
|
if (descriptorHeap)
|
|
if (descriptorHeap)
|
|
|
{
|
|
{
|
|
|
descriptorHeap->Release();
|
|
descriptorHeap->Release();
|
|
|
}
|
|
}
|
|
|
D3D12_DESCRIPTOR_HEAP_DESC desc = {};
|
|
D3D12_DESCRIPTOR_HEAP_DESC desc = {};
|
|
|
- desc.NumDescriptors = registerUsages.getEntryCount();
|
|
|
|
|
|
|
+ desc.NumDescriptors = registerInputs.getEntryCount();
|
|
|
desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
|
desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
|
|
desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
|
desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
|
|
desc.NodeMask = 0;
|
|
desc.NodeMask = 0;
|
|
|
|
|
|
|
|
HRESULT r = zDevice->CreateDescriptorHeap(
|
|
HRESULT r = zDevice->CreateDescriptorHeap(
|
|
|
&desc, __uuidof(ID3D12DescriptorHeap), (void**)&descriptorHeap);
|
|
&desc, __uuidof(ID3D12DescriptorHeap), (void**)&descriptorHeap);
|
|
|
- lastDescriptorHeapSize = registerUsages.getEntryCount();
|
|
|
|
|
|
|
+ lastDescriptorHeapSize = registerInputs.getEntryCount();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
D3D12_CPU_DESCRIPTOR_HANDLE descriptorHeapHandle
|
|
D3D12_CPU_DESCRIPTOR_HANDLE descriptorHeapHandle
|
|
|
= descriptorHeap->GetCPUDescriptorHandleForHeapStart();
|
|
= descriptorHeap->GetCPUDescriptorHandleForHeapStart();
|
|
|
- ArrayIterator<DX12ShaderRegisterUsage> it = registerUsages.begin();
|
|
|
|
|
- while (it)
|
|
|
|
|
|
|
+ for (const DX12ShaderRegisterInput* input : registerInputs)
|
|
|
{
|
|
{
|
|
|
- const DX12ShaderRegisterUsage& usage = it.val();
|
|
|
|
|
- ArrayIterator<DX12ShaderRegisterInput*> inputIt
|
|
|
|
|
- = registerInputs.begin();
|
|
|
|
|
- bool found = 0;
|
|
|
|
|
- while (inputIt)
|
|
|
|
|
|
|
+ DX12TLAS* zTLAS = dynamic_cast<DX12TLAS*>(input->inputResource);
|
|
|
|
|
+ DX12Texture* zTexture
|
|
|
|
|
+ = dynamic_cast<DX12Texture*>(input->inputResource);
|
|
|
|
|
+ DX12Buffer* zBuffer = dynamic_cast<DX12Buffer*>(input->inputResource);
|
|
|
|
|
+ switch (input->registerType)
|
|
|
{
|
|
{
|
|
|
- if (inputIt->registerType == usage.registerType
|
|
|
|
|
- && inputIt->registerIndex == usage.registerIndex
|
|
|
|
|
- && inputIt->spaceIndex == usage.spaceIndex)
|
|
|
|
|
|
|
+ case DX12_SHADER_REGISTER_B_CONST_BUFFER:
|
|
|
|
|
+ D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {};
|
|
|
|
|
+ if (!zBuffer)
|
|
|
{
|
|
{
|
|
|
- switch (inputIt->registerType)
|
|
|
|
|
- {
|
|
|
|
|
- case DX12_SHADER_REGISTER_B_CONST_BUFFER:
|
|
|
|
|
- D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {};
|
|
|
|
|
- DX12Buffer* buffer
|
|
|
|
|
- = dynamic_cast<DX12Buffer*>(inputIt->inputResource);
|
|
|
|
|
- cbvDesc.BufferLocation
|
|
|
|
|
- = buffer->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
- cbvDesc.SizeInBytes = buffer->getElementCount()
|
|
|
|
|
- * buffer->getElementLength();
|
|
|
|
|
- zDevice->CreateConstantBufferView(
|
|
|
|
|
- &cbvDesc, descriptorHeapHandle);
|
|
|
|
|
- break;
|
|
|
|
|
- case DX12_SHADER_REGISTER_T_SHADER_RESOURCE:
|
|
|
|
|
- D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
|
|
|
|
- srvDesc.Format = DXGI_FORMAT_UNKNOWN;
|
|
|
|
|
- srvDesc.ViewDimension
|
|
|
|
|
- = D3D12_SRV_DIMENSION_RAYTRACING_ACCELERATION_STRUCTURE;
|
|
|
|
|
- srvDesc.Shader4ComponentMapping
|
|
|
|
|
- = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
|
|
|
|
- srvDesc.RaytracingAccelerationStructure.Location
|
|
|
|
|
- = dynamic_cast<DX12TLAS*>(inputIt->inputResource)
|
|
|
|
|
- ->zResultBuffer()
|
|
|
|
|
- ->zBuffer()
|
|
|
|
|
- ->GetGPUVirtualAddress();
|
|
|
|
|
- zDevice->CreateShaderResourceView(
|
|
|
|
|
- 0, &srvDesc, descriptorHeapHandle);
|
|
|
|
|
- break;
|
|
|
|
|
- case DX12_SHADER_REGISTER_U_UNORDERED_ACCESS:
|
|
|
|
|
- D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {};
|
|
|
|
|
- uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
|
|
|
|
|
- uavDesc.Format = DXGI_FORMAT_UNKNOWN;
|
|
|
|
|
- uavDesc.Texture2D.MipSlice = 0;
|
|
|
|
|
- uavDesc.Texture2D.PlaneSlice = 0;
|
|
|
|
|
- zDevice->CreateUnorderedAccessView(
|
|
|
|
|
- dynamic_cast<DX12Texture*>(inputIt->inputResource)
|
|
|
|
|
- ->zResource(),
|
|
|
|
|
- 0,
|
|
|
|
|
- &uavDesc,
|
|
|
|
|
- descriptorHeapHandle);
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- Logging::error()
|
|
|
|
|
- << "Unknown register type for descriptor heap: "
|
|
|
|
|
- << inputIt->registerType;
|
|
|
|
|
- }
|
|
|
|
|
- found = 1;
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ Logging::error()
|
|
|
|
|
+ << "Expected a buffer resource for register type "
|
|
|
|
|
+ << input->registerType;
|
|
|
|
|
+ throw std::logic_error(
|
|
|
|
|
+ "Expected a buffer resource for register type "
|
|
|
|
|
+ + std::to_string(input->registerType));
|
|
|
}
|
|
}
|
|
|
- ++inputIt;
|
|
|
|
|
- }
|
|
|
|
|
- if (!found)
|
|
|
|
|
- {
|
|
|
|
|
- Logging::error()
|
|
|
|
|
- << "No input resource found for register type "
|
|
|
|
|
- << usage.registerType << ", register index "
|
|
|
|
|
- << usage.registerIndex << ", space index " << usage.spaceIndex
|
|
|
|
|
- << ". This will result in an uninitialized descriptor in the "
|
|
|
|
|
- "descriptor heap. Access to the register in the shader "
|
|
|
|
|
- "might lead to undefined behaviour.";
|
|
|
|
|
|
|
+ cbvDesc.BufferLocation = zBuffer->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
+ cbvDesc.SizeInBytes
|
|
|
|
|
+ = zBuffer->getElementCount() * zBuffer->getElementLength();
|
|
|
|
|
+ zDevice->CreateConstantBufferView(&cbvDesc, descriptorHeapHandle);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case DX12_SHADER_REGISTER_T_SHADER_RESOURCE:
|
|
|
|
|
+ D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
|
|
|
|
+ srvDesc.Format = DXGI_FORMAT_UNKNOWN;
|
|
|
|
|
+ if (zTLAS)
|
|
|
|
|
+ {
|
|
|
|
|
+ srvDesc.ViewDimension
|
|
|
|
|
+ = D3D12_SRV_DIMENSION_RAYTRACING_ACCELERATION_STRUCTURE;
|
|
|
|
|
+ srvDesc.RaytracingAccelerationStructure.Location
|
|
|
|
|
+ = zTLAS->zResultBuffer()->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (zTexture)
|
|
|
|
|
+ {
|
|
|
|
|
+ srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
|
|
|
|
|
+ srvDesc.Texture2D.MipLevels = 0;
|
|
|
|
|
+ srvDesc.Texture2D.MostDetailedMip = 0;
|
|
|
|
|
+ srvDesc.Texture2D.PlaneSlice = 0;
|
|
|
|
|
+ srvDesc.Texture2D.ResourceMinLODClamp = 0.0f;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (zBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
|
|
|
|
|
+ srvDesc.Buffer.FirstElement = 0;
|
|
|
|
|
+ srvDesc.Buffer.NumElements = zBuffer->getElementCount();
|
|
|
|
|
+ srvDesc.Buffer.StructureByteStride
|
|
|
|
|
+ = zBuffer->getElementLength();
|
|
|
|
|
+ srvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
|
|
|
|
|
+ }
|
|
|
|
|
+ srvDesc.Shader4ComponentMapping
|
|
|
|
|
+ = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
|
|
|
|
+ zDevice->CreateShaderResourceView(
|
|
|
|
|
+ zTexture ? zTexture->zResource()
|
|
|
|
|
+ : (zBuffer ? zBuffer->zBuffer() : 0),
|
|
|
|
|
+ &srvDesc,
|
|
|
|
|
+ descriptorHeapHandle);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case DX12_SHADER_REGISTER_U_UNORDERED_ACCESS:
|
|
|
|
|
+ D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {};
|
|
|
|
|
+ if (zTexture)
|
|
|
|
|
+ {
|
|
|
|
|
+ uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
|
|
|
|
|
+ uavDesc.Format = DXGI_FORMAT_UNKNOWN;
|
|
|
|
|
+ uavDesc.Texture2D.MipSlice = 0;
|
|
|
|
|
+ uavDesc.Texture2D.PlaneSlice = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (zBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
|
|
|
|
|
+ uavDesc.Buffer.FirstElement = 0;
|
|
|
|
|
+ uavDesc.Buffer.NumElements = zBuffer->getElementCount();
|
|
|
|
|
+ uavDesc.Buffer.StructureByteStride
|
|
|
|
|
+ = zBuffer->getElementLength();
|
|
|
|
|
+ uavDesc.Buffer.CounterOffsetInBytes = 0;
|
|
|
|
|
+ uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ Logging::error() << "Expected a texture or buffer resource for "
|
|
|
|
|
+ "register type "
|
|
|
|
|
+ << input->registerType;
|
|
|
|
|
+ throw std::logic_error(
|
|
|
|
|
+ "Expected a texture or buffer resource for register type "
|
|
|
|
|
+ + std::to_string(input->registerType));
|
|
|
|
|
+ }
|
|
|
|
|
+ zDevice->CreateUnorderedAccessView(
|
|
|
|
|
+ zTexture ? zTexture->zResource() : zBuffer->zBuffer(),
|
|
|
|
|
+ 0,
|
|
|
|
|
+ &uavDesc,
|
|
|
|
|
+ descriptorHeapHandle);
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
descriptorHeapHandle.ptr += zDevice->GetDescriptorHandleIncrementSize(
|
|
descriptorHeapHandle.ptr += zDevice->GetDescriptorHandleIncrementSize(
|
|
|
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
|
|
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
|
|
|
- ++it;
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-ID3D12DescriptorHeap* Framework::ShaderHeap::zDescriptorHeap() const
|
|
|
|
|
|
|
+ID3D12DescriptorHeap*
|
|
|
|
|
+Framework::DX12GlobalDescriptorHeap::zDescriptorHeap() const
|
|
|
{
|
|
{
|
|
|
return descriptorHeap;
|
|
return descriptorHeap;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+Framework::DX12ShaderBindingTable::DX12ShaderBindingTable(
|
|
|
|
|
+ DX12Pipeline* pipeline)
|
|
|
|
|
+ : ReferenceCounter(),
|
|
|
|
|
+ pipeline(pipeline)
|
|
|
|
|
+{}
|