summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-04-14 18:04:53 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-04-14 18:04:53 +0000
commita509e890a55eade6b10a36563f35219b61bf2707 (patch)
tree33da45d394e57b9afbeae90e78bcedbafdd320c3 /Graphics/GraphicsEngineD3D12
parentImplemented input vertex layout conversion in Vulkan (diff)
downloadDiligentCore-a509e890a55eade6b10a36563f35219b61bf2707.tar.gz
DiligentCore-a509e890a55eade6b10a36563f35219b61bf2707.zip
Moved primitive topology from draw attribs to pipeline state desc
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
-rw-r--r--Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp6
-rw-r--r--Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp42
2 files changed, 23 insertions, 25 deletions
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<PipelineStateD3D12Impl>(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 <array>
#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<int>(PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST); t < static_cast<int>(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<D3D12_PRIMITIVE_TOPOLOGY_TYPE>(0);
+ return m_Map[static_cast<int>(Topology)];
}
-}
+
+private:
+ std::array<D3D12_PRIMITIVE_TOPOLOGY_TYPE, PRIMITIVE_TOPOLOGY_NUM_TOPOLOGIES> 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)