summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-11-06 01:31:31 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-11-06 01:31:31 +0000
commit569fb5a399cdb1cb39fb10d8db1fd78ab56f6c9e (patch)
treea40a058f9e9fe805be88d6625681c4e93880c0e0 /Graphics/GraphicsEngineD3D12
parentAdded support for local root signature & shader record. (diff)
downloadDiligentCore-569fb5a399cdb1cb39fb10d8db1fd78ab56f6c9e.tar.gz
DiligentCore-569fb5a399cdb1cb39fb10d8db1fd78ab56f6c9e.zip
A number of minor updates/fixes
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
-rw-r--r--Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp20
-rw-r--r--Graphics/GraphicsEngineD3D12/include/RootSignature.hpp2
-rw-r--r--Graphics/GraphicsEngineD3D12/interface/ShaderBindingTableD3D12.h4
-rw-r--r--Graphics/GraphicsEngineD3D12/src/CommandContext.cpp4
-rw-r--r--Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp8
-rw-r--r--Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp11
-rw-r--r--Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp22
-rw-r--r--Graphics/GraphicsEngineD3D12/src/RootSignature.cpp6
-rw-r--r--Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp2
-rw-r--r--Graphics/GraphicsEngineD3D12/src/TopLevelASD3D12Impl.cpp2
10 files changed, 47 insertions, 34 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
index 619368fd..ad48b876 100644
--- a/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
+++ b/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
@@ -175,14 +175,20 @@ public:
ID3D12Device2* GetD3D12Device2();
ID3D12Device5* GetD3D12Device5();
- ShaderVersion GetMaxShaderModel() const;
- D3D_FEATURE_LEVEL GetD3DFeatureLevel() const;
+ struct Properties
+ {
+ const Uint32 ShaderGroupHandleSize = D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES;
+ const Uint32 MaxShaderRecordStride = D3D12_RAYTRACING_MAX_SHADER_RECORD_STRIDE;
+ const Uint32 ShaderGroupBaseAlignment = D3D12_RAYTRACING_SHADER_TABLE_BYTE_ALIGNMENT;
+ const Uint32 MaxDrawMeshTasksCount = 64000;
- static Uint32 GetShaderGroupHandleSize() { return D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES; }
- static Uint32 GetMaxShaderRecordStride() { return D3D12_RAYTRACING_MAX_SHADER_RECORD_STRIDE; }
- static Uint32 GetShaderGroupBaseAlignment() { return D3D12_RAYTRACING_SHADER_TABLE_BYTE_ALIGNMENT; }
+ ShaderVersion MaxShaderVersion;
+ };
- static Uint32 GetMaxDrawMeshTasksCount() { return 64000; }
+ const Properties& GetProperties() const
+ {
+ return m_Properties;
+ }
private:
template <typename PSOCreateInfoType>
@@ -217,7 +223,7 @@ private:
QueryManagerD3D12 m_QueryMgr;
- D3D_SHADER_MODEL m_MaxShaderModel = D3D_SHADER_MODEL_5_1;
+ Properties m_Properties;
std::unique_ptr<IDXCompiler> m_pDxCompiler;
};
diff --git a/Graphics/GraphicsEngineD3D12/include/RootSignature.hpp b/Graphics/GraphicsEngineD3D12/include/RootSignature.hpp
index 331c62e5..d74a7b0c 100644
--- a/Graphics/GraphicsEngineD3D12/include/RootSignature.hpp
+++ b/Graphics/GraphicsEngineD3D12/include/RootSignature.hpp
@@ -603,7 +603,7 @@ private:
const char* m_pName = nullptr;
Uint32 m_BindPoint = InvalidBindPoint;
const Uint32 m_ShaderRecordSize = 0;
- CComPtr<ID3D12RootSignature> m_LocalRootSignature;
+ CComPtr<ID3D12RootSignature> m_pd3d12RootSignature;
};
} // namespace Diligent
diff --git a/Graphics/GraphicsEngineD3D12/interface/ShaderBindingTableD3D12.h b/Graphics/GraphicsEngineD3D12/interface/ShaderBindingTableD3D12.h
index 18ebd984..827df3b7 100644
--- a/Graphics/GraphicsEngineD3D12/interface/ShaderBindingTableD3D12.h
+++ b/Graphics/GraphicsEngineD3D12/interface/ShaderBindingTableD3D12.h
@@ -47,12 +47,16 @@ static const INTERFACE_ID IID_ShaderBindingTableD3D12 =
IShaderBindingTableD3D12Methods ShaderBindingTableD3D12
// clang-format off
+#if DILIGENT_CPP_INTERFACE // Empty structs are not allwed in C
+
/// Exposes Direct3D12-specific functionality of a shader binding table object.
DILIGENT_BEGIN_INTERFACE(IShaderBindingTableD3D12, IShaderBindingTable)
{
};
DILIGENT_END_INTERFACE
+#endif
+
#include "../../../Primitives/interface/UndefInterfaceHelperMacros.h"
#if DILIGENT_C_INTERFACE
diff --git a/Graphics/GraphicsEngineD3D12/src/CommandContext.cpp b/Graphics/GraphicsEngineD3D12/src/CommandContext.cpp
index 1e301bb2..fdb93efb 100644
--- a/Graphics/GraphicsEngineD3D12/src/CommandContext.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/CommandContext.cpp
@@ -224,8 +224,8 @@ void CommandContext::TransitionResource(const StateTransitionDesc& Barrier)
"RESOURCE_STATE_UNKNOWN to make the engine use current resource state");
}
- // RESOURCE_STATE_UNORDERED_ACCESS and RESOURCE_STATE_BUILD_AS_WRITE converted to D3D12_RESOURCE_STATE_UNORDERED_ACCESS.
- // UAV barrier must be inserted between D3D12_RESOURCE_STATE_UNORDERED_ACCESS resource usage.
+ // RESOURCE_STATE_UNORDERED_ACCESS and RESOURCE_STATE_BUILD_AS_WRITE are converted to D3D12_RESOURCE_STATE_UNORDERED_ACCESS.
+ // UAV barrier must be inserted between D3D12_RESOURCE_STATE_UNORDERED_ACCESS resource usages.
bool RequireUAVBarrier =
(OldState == RESOURCE_STATE_UNORDERED_ACCESS || OldState == RESOURCE_STATE_BUILD_AS_WRITE) &&
(Barrier.NewState == RESOURCE_STATE_UNORDERED_ACCESS || Barrier.NewState == RESOURCE_STATE_BUILD_AS_WRITE);
diff --git a/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp b/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp
index 1f1f621c..12ece1da 100644
--- a/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp
@@ -609,18 +609,18 @@ DXGI_FORMAT ValueTypeToIndexType(VALUE_TYPE IndexType)
D3D12_RAYTRACING_GEOMETRY_FLAGS GeometryFlagsToD3D12RTGeometryFlags(RAYTRACING_GEOMETRY_FLAGS Flags)
{
- static_assert(RAYTRACING_GEOMETRY_FLAGS_LAST == RAYTRACING_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION,
+ static_assert(RAYTRACING_GEOMETRY_FLAGS_LAST == RAYTRACING_GEOMETRY_FLAG_NO_DUPLICATE_ANY_HIT_INVOCATION,
"Please update the switch below to handle the new ray tracing geometry flag");
D3D12_RAYTRACING_GEOMETRY_FLAGS Result = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
- while (Flags != RAYTRACING_GEOMETRY_NONE)
+ while (Flags != RAYTRACING_GEOMETRY_FLAG_NONE)
{
auto FlagBit = static_cast<RAYTRACING_GEOMETRY_FLAGS>(1 << PlatformMisc::GetLSB(Uint32{Flags}));
switch (FlagBit)
{
// clang-format off
- case RAYTRACING_GEOMETRY_OPAQUE: Result |= D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE; break;
- case RAYTRACING_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION: Result |= D3D12_RAYTRACING_GEOMETRY_FLAG_NO_DUPLICATE_ANYHIT_INVOCATION; break;
+ case RAYTRACING_GEOMETRY_FLAG_OPAQUE: Result |= D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE; break;
+ case RAYTRACING_GEOMETRY_FLAG_NO_DUPLICATE_ANY_HIT_INVOCATION: Result |= D3D12_RAYTRACING_GEOMETRY_FLAG_NO_DUPLICATE_ANYHIT_INVOCATION; break;
// clang-format on
default: UNEXPECTED("unknown geometry flag");
}
diff --git a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp
index 99e4156d..125c4d81 100644
--- a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp
@@ -2380,7 +2380,7 @@ void DeviceContextD3D12Impl::BuildBLAS(const BuildBLASAttribs& Attribs)
d3d12AABs.AABBs.StartAddress = pBB->GetGPUAddress() + SrcBoxes.BoxOffset;
d3d12AABs.AABBs.StrideInBytes = SrcBoxes.BoxStride;
- VERIFY_EXPR(d3d12AABs.AABBs.StartAddress % D3D12_RAYTRACING_AABB_BYTE_ALIGNMENT == 0);
+ DEV_CHECK_ERR(d3d12AABs.AABBs.StartAddress % D3D12_RAYTRACING_AABB_BYTE_ALIGNMENT == 0, "AABB start address is not properly aligned");
TransitionOrVerifyBufferState(CmdCtx, *pBB, Attribs.GeometryTransitionMode, RESOURCE_STATE_BUILD_AS_READ, OpName);
}
@@ -2396,7 +2396,8 @@ void DeviceContextD3D12Impl::BuildBLAS(const BuildBLASAttribs& Attribs)
d3d12BuildASDesc.ScratchAccelerationStructureData = pScratchD12->GetGPUAddress() + Attribs.ScratchBufferOffset;
d3d12BuildASDesc.SourceAccelerationStructureData = 0;
- VERIFY_EXPR(d3d12BuildASDesc.ScratchAccelerationStructureData % D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT == 0);
+ DEV_CHECK_ERR(d3d12BuildASDesc.ScratchAccelerationStructureData % D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT == 0,
+ "Scratch data address is not properly aligned");
CmdCtx.AsGraphicsContext4().BuildRaytracingAccelerationStructure(d3d12BuildASDesc, 0, nullptr);
++m_State.NumCommands;
@@ -2463,8 +2464,10 @@ void DeviceContextD3D12Impl::BuildTLAS(const BuildTLASAttribs& Attribs)
d3d12BuildASDesc.ScratchAccelerationStructureData = pScratchD12->GetGPUAddress() + Attribs.ScratchBufferOffset;
d3d12BuildASDesc.SourceAccelerationStructureData = 0;
- VERIFY_EXPR(d3d12BuildASInputs.InstanceDescs % D3D12_RAYTRACING_INSTANCE_DESCS_BYTE_ALIGNMENT == 0);
- VERIFY_EXPR(d3d12BuildASDesc.ScratchAccelerationStructureData % D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT == 0);
+ DEV_CHECK_ERR(d3d12BuildASInputs.InstanceDescs % D3D12_RAYTRACING_INSTANCE_DESCS_BYTE_ALIGNMENT == 0,
+ "Instance data address is not properly aligned");
+ DEV_CHECK_ERR(d3d12BuildASDesc.ScratchAccelerationStructureData % D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT == 0,
+ "Scratch data address is not properly algined");
CmdCtx.AsGraphicsContext4().BuildRaytracingAccelerationStructure(d3d12BuildASDesc, 0, nullptr);
++m_State.NumCommands;
diff --git a/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
index f8f545e7..9ea84f06 100644
--- a/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
@@ -68,12 +68,8 @@ static CComPtr<IDXGIAdapter1> DXGIAdapterFromD3D12Device(ID3D12Device* pd3d12Dev
return nullptr;
}
-ShaderVersion RenderDeviceD3D12Impl::GetMaxShaderModel() const
-{
- return ShaderVersion{static_cast<Uint8>((m_MaxShaderModel >> 4) & 0xF), static_cast<Uint8>(m_MaxShaderModel & 0xF)};
-}
-D3D_FEATURE_LEVEL RenderDeviceD3D12Impl::GetD3DFeatureLevel() const
+static D3D_FEATURE_LEVEL GetD3DFeatureLevel(ID3D12Device* pd3d12Device)
{
D3D_FEATURE_LEVEL FeatureLevels[] =
{
@@ -88,7 +84,7 @@ D3D_FEATURE_LEVEL RenderDeviceD3D12Impl::GetD3DFeatureLevel() const
FeatureLevelsData.pFeatureLevelsRequested = FeatureLevels;
FeatureLevelsData.NumFeatureLevels = _countof(FeatureLevels);
- m_pd3d12Device->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS, &FeatureLevelsData, sizeof(FeatureLevelsData));
+ pd3d12Device->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS, &FeatureLevelsData, sizeof(FeatureLevelsData));
return FeatureLevelsData.MaxSupportedFeatureLevel;
}
@@ -172,7 +168,7 @@ RenderDeviceD3D12Impl::RenderDeviceD3D12Impl(IReferenceCounters* pRefCo
try
{
m_DeviceCaps.DevType = RENDER_DEVICE_TYPE_D3D12;
- auto FeatureLevel = GetD3DFeatureLevel();
+ auto FeatureLevel = GetD3DFeatureLevel(m_pd3d12Device);
switch (FeatureLevel)
{
case D3D_FEATURE_LEVEL_12_0:
@@ -210,10 +206,11 @@ RenderDeviceD3D12Impl::RenderDeviceD3D12Impl(IReferenceCounters* pRefCo
m_DeviceCaps.Features.VertexPipelineUAVWritesAndAtomics = DEVICE_FEATURE_STATE_ENABLED;
// Detect maximum shader model.
+ D3D_SHADER_MODEL MaxShaderModel = D3D_SHADER_MODEL_5_1;
{
// Direct3D12 supports shader model 5.1 on all feature levels.
// https://docs.microsoft.com/en-us/windows/win32/direct3d12/hardware-feature-levels#feature-level-support
- m_MaxShaderModel = D3D_SHADER_MODEL_5_1;
+ MaxShaderModel = D3D_SHADER_MODEL_5_1;
// Header may not have constants for D3D_SHADER_MODEL_6_1 and above.
const D3D_SHADER_MODEL Models[] = //
@@ -231,13 +228,16 @@ RenderDeviceD3D12Impl::RenderDeviceD3D12Impl(IReferenceCounters* pRefCo
D3D12_FEATURE_DATA_SHADER_MODEL ShaderModel = {Model};
if (SUCCEEDED(m_pd3d12Device->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &ShaderModel, sizeof(ShaderModel))))
{
- m_MaxShaderModel = ShaderModel.HighestShaderModel;
+ MaxShaderModel = ShaderModel.HighestShaderModel;
break;
}
}
- LOG_INFO_MESSAGE("Max device shader model: ", (m_MaxShaderModel >> 4) & 0xF, '_', m_MaxShaderModel & 0xF);
+ LOG_INFO_MESSAGE("Max device shader model: ", (MaxShaderModel >> 4) & 0xF, '_', MaxShaderModel & 0xF);
}
+ m_Properties.MaxShaderVersion.Major = static_cast<Uint8>((MaxShaderModel >> 4) & 0xF);
+ m_Properties.MaxShaderVersion.Minor = static_cast<Uint8>(MaxShaderModel & 0xF);
+
// Check if mesh shader is supported.
bool MeshShadersSupported = false;
#ifdef D3D12_H_HAS_MESH_SHADER
@@ -248,7 +248,7 @@ RenderDeviceD3D12Impl::RenderDeviceD3D12Impl(IReferenceCounters* pRefCo
SUCCEEDED(m_pd3d12Device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &FeatureData, sizeof(FeatureData))) &&
FeatureData.MeshShaderTier != D3D12_MESH_SHADER_TIER_NOT_SUPPORTED;
- MeshShadersSupported = (m_MaxShaderModel >= D3D_SHADER_MODEL_6_5 && MeshShadersSupported);
+ MeshShadersSupported = (MaxShaderModel >= D3D_SHADER_MODEL_6_5 && MeshShadersSupported);
}
#else
if (EngineCI.Features.MeshShaders == DEVICE_FEATURE_STATE_ENABLED)
diff --git a/Graphics/GraphicsEngineD3D12/src/RootSignature.cpp b/Graphics/GraphicsEngineD3D12/src/RootSignature.cpp
index 921a6e4c..8a8bfd4d 100644
--- a/Graphics/GraphicsEngineD3D12/src/RootSignature.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/RootSignature.cpp
@@ -1156,10 +1156,10 @@ ID3D12RootSignature* LocalRootSignature::Create(ID3D12Device* pDevice)
auto hr = D3D12SerializeRootSignature(&d3d12RootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, nullptr);
CHECK_D3D_RESULT_THROW(hr, "Failed to serialize root signature");
- hr = pDevice->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&m_LocalRootSignature));
- CHECK_D3D_RESULT_THROW(hr, "Failed to create root signature");
+ hr = pDevice->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&m_pd3d12RootSignature));
+ CHECK_D3D_RESULT_THROW(hr, "Failed to create D3D12 root signature");
- return m_LocalRootSignature;
+ return m_pd3d12RootSignature;
}
} // namespace Diligent
diff --git a/Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp
index a356d73a..52c39f23 100644
--- a/Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp
@@ -59,7 +59,7 @@ static ShaderVersion GetD3D12ShaderModel(RenderDeviceD3D12Impl* pDevice, const S
CompilerSM = ShaderVersion{5, 1};
}
- ShaderVersion DeviceSM = pDevice->GetMaxShaderModel();
+ ShaderVersion DeviceSM = pDevice->GetProperties().MaxShaderVersion;
ShaderVersion MaxSupportedSM = DeviceSM.Major == CompilerSM.Major ?
(DeviceSM.Minor < CompilerSM.Minor ? DeviceSM : CompilerSM) :
diff --git a/Graphics/GraphicsEngineD3D12/src/TopLevelASD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/TopLevelASD3D12Impl.cpp
index 2d087d08..ad26155a 100644
--- a/Graphics/GraphicsEngineD3D12/src/TopLevelASD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/TopLevelASD3D12Impl.cpp
@@ -112,7 +112,7 @@ TopLevelASD3D12Impl::TopLevelASD3D12Impl(IReferenceCounters* pRefCounte
d3d12SRVDesc.RaytracingAccelerationStructure.Location = GetGPUAddress();
pd3d12Device->CreateShaderResourceView(nullptr, &d3d12SRVDesc, m_DescriptorHandle.GetCpuHandle());
- VERIFY_EXPR(GetGPUAddress() % D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT == 0);
+ DEV_CHECK_ERR(GetGPUAddress() % D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT == 0, "GPU virtual address is expect to be at least 256-byte aligned");
SetState(RESOURCE_STATE_BUILD_AS_READ);
}