From a509e890a55eade6b10a36563f35219b61bf2707 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Sat, 14 Apr 2018 11:04:53 -0700 Subject: Moved primitive topology from draw attribs to pipeline state desc --- .../src/DeviceContextD3D12Impl.cpp | 6 ++-- .../src/PipelineStateD3D12Impl.cpp | 42 +++++++++++----------- 2 files changed, 23 insertions(+), 25 deletions(-) (limited to 'Graphics/GraphicsEngineD3D12') diff --git a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp index 513f2907..f2c7d805 100644 --- a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp @@ -135,6 +135,9 @@ namespace Diligent auto &GraphicsCtx = pCmdCtx->AsGraphicsContext(); GraphicsCtx.SetPipelineState(pd3d12PSO); + auto D3D12Topology = TopologyToD3D12Topology(PSODesc.GraphicsPipeline.PrimitiveTopology); + GraphicsCtx.SetPrimitiveTopology(D3D12Topology); + if(CommitStates) { GraphicsCtx.SetStencilRef(m_StencilRef); @@ -330,9 +333,6 @@ namespace Diligent auto *pPipelineStateD3D12 = ValidatedCast(m_pPipelineState.RawPtr()); - auto D3D12Topology = TopologyToD3D12Topology( DrawAttribs.Topology ); - GraphCtx.SetPrimitiveTopology(D3D12Topology); - if(m_bCommittedD3D12VBsUpToDate) TransitionD3D12VertexBuffers(GraphCtx); else diff --git a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp index de4648c4..2964f29a 100644 --- a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp @@ -22,6 +22,7 @@ */ #include "pch.h" +#include #include "PipelineStateD3D12Impl.h" #include "ShaderD3D12Impl.h" #include "D3D12TypeConversions.h" @@ -35,32 +36,28 @@ namespace Diligent { -D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType_To_D3D12_PRIMITIVE_TOPOLOGY_TYPE( PRIMITIVE_TOPOLOGY_TYPE TopologyType ) +class PrimitiveTopology_To_D3D12_PRIMITIVE_TOPOLOGY_TYPE { - static bool bIsInit = false; - static D3D12_PRIMITIVE_TOPOLOGY_TYPE D3D12TopologyType[PRIMITIVE_TOPOLOGY_TYPE_NUM_TYPES] = {}; - if( !bIsInit ) +public: + PrimitiveTopology_To_D3D12_PRIMITIVE_TOPOLOGY_TYPE() { - D3D12TopologyType[ PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED; - D3D12TopologyType[ PRIMITIVE_TOPOLOGY_TYPE_POINT ] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT; - D3D12TopologyType[ PRIMITIVE_TOPOLOGY_TYPE_LINE ] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE; - D3D12TopologyType[ PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE ] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; - D3D12TopologyType[ PRIMITIVE_TOPOLOGY_TYPE_PATCH ] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH; - - bIsInit = true; - } - - if( TopologyType >= PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED && TopologyType < PRIMITIVE_TOPOLOGY_TYPE_NUM_TYPES ) - { - auto d3d12TopType = D3D12TopologyType[TopologyType]; - return d3d12TopType; + m_Map[PRIMITIVE_TOPOLOGY_UNDEFINED] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED; + m_Map[PRIMITIVE_TOPOLOGY_TRIANGLE_LIST] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + m_Map[PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + m_Map[PRIMITIVE_TOPOLOGY_POINT_LIST] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT; + m_Map[PRIMITIVE_TOPOLOGY_LINE_LIST] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE; + for(int t = static_cast(PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST); t < static_cast(PRIMITIVE_TOPOLOGY_NUM_TOPOLOGIES); ++t) + m_Map[t] = D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH; } - else + + D3D12_PRIMITIVE_TOPOLOGY_TYPE operator[](PRIMITIVE_TOPOLOGY Topology)const { - UNEXPECTED( "Incorrect topology type operation (", TopologyType, ")" ); - return static_cast(0); + return m_Map[static_cast(Topology)]; } -} + +private: + std::array m_Map; +}; void PipelineStateD3D12Impl::ParseShaderResourceLayout(IShader *pShader) { @@ -177,7 +174,8 @@ PipelineStateD3D12Impl :: PipelineStateD3D12Impl(IReferenceCounters *pRefCounter } d3d12PSODesc.IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED; - d3d12PSODesc.PrimitiveTopologyType = PrimitiveTopologyType_To_D3D12_PRIMITIVE_TOPOLOGY_TYPE(GraphicsPipeline.PrimitiveTopologyType); + static const PrimitiveTopology_To_D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimTopologyToD3D12TopologyType; + d3d12PSODesc.PrimitiveTopologyType = PrimTopologyToD3D12TopologyType[GraphicsPipeline.PrimitiveTopology]; d3d12PSODesc.NumRenderTargets = GraphicsPipeline.NumRenderTargets; for (Uint32 rt = 0; rt < GraphicsPipeline.NumRenderTargets; ++rt) -- cgit v1.2.3