Skip to content

Commit 12ee999

Browse files
* PSO采用哈希表来维护
1 parent a4c7953 commit 12ee999

File tree

2 files changed

+32
-18
lines changed

2 files changed

+32
-18
lines changed

Chapter 10 Blending/GameApp.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ void GameApp::Startup(void)
4747
m_RootSignature[3].InitAsDescriptorRange(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, D3D12_SHADER_VISIBILITY_PIXEL);
4848
m_RootSignature.Finalize(L"box signature", D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);
4949

50+
// 创建PSO
5051
D3D12_INPUT_ELEMENT_DESC mInputLayout[] =
5152
{
5253
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
@@ -57,22 +58,29 @@ void GameApp::Startup(void)
5758
DXGI_FORMAT ColorFormat = Graphics::g_SceneColorBuffer.GetFormat();
5859
DXGI_FORMAT DepthFormat = Graphics::g_SceneDepthBuffer.GetFormat();
5960

60-
m_PSO.SetRootSignature(m_RootSignature);
61+
// 默认PSO
62+
GraphicsPSO defaultPSO;
63+
defaultPSO.SetRootSignature(m_RootSignature);
64+
defaultPSO.SetRasterizerState(Graphics::RasterizerDefault);
65+
defaultPSO.SetBlendState(Graphics::BlendDisable);
66+
defaultPSO.SetDepthStencilState(Graphics::DepthStateReadWrite);
67+
defaultPSO.SetInputLayout(_countof(mInputLayout), mInputLayout);
68+
defaultPSO.SetPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE);
69+
defaultPSO.SetRenderTargetFormat(ColorFormat, DepthFormat);
70+
defaultPSO.SetVertexShader(g_pdefaultVS, sizeof(g_pdefaultVS));
71+
defaultPSO.SetPixelShader(g_pdefaultPS, sizeof(g_pdefaultPS));
72+
defaultPSO.Finalize();
73+
74+
// 默认PSO
75+
m_mapPSO[E_EPT_DEFAULT] = defaultPSO;
76+
77+
// 仅仅画线的PSO
78+
GraphicsPSO wireFramPSO = defaultPSO;
6179
auto raster = Graphics::RasterizerDefault;
6280
raster.FillMode = D3D12_FILL_MODE_WIREFRAME;
63-
m_PSO.SetRasterizerState(raster);
64-
m_PSO.SetBlendState(Graphics::BlendDisable);
65-
m_PSO.SetDepthStencilState(Graphics::DepthStateReadWrite);
66-
m_PSO.SetInputLayout(_countof(mInputLayout), mInputLayout);
67-
m_PSO.SetPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE);
68-
m_PSO.SetRenderTargetFormat(ColorFormat, DepthFormat);
69-
m_PSO.SetVertexShader(g_pdefaultVS, sizeof(g_pdefaultVS));
70-
m_PSO.SetPixelShader(g_pdefaultPS, sizeof(g_pdefaultPS));
71-
m_PSO.Finalize();
72-
73-
m_PSOEx = m_PSO;
74-
m_PSOEx.SetRasterizerState(Graphics::RasterizerDefault);
75-
m_PSOEx.Finalize();
81+
wireFramPSO.SetRasterizerState(raster);
82+
wireFramPSO.Finalize();
83+
m_mapPSO[E_EPT_WIREFRAME] = wireFramPSO;
7684
}
7785

7886
void GameApp::Cleanup(void)
@@ -210,9 +218,9 @@ void GameApp::RenderScene(void)
210218

211219
// 设置渲染流水线
212220
if (m_bRenderFill)
213-
gfxContext.SetPipelineState(m_PSOEx);
221+
gfxContext.SetPipelineState(m_mapPSO[E_EPT_DEFAULT]);
214222
else
215-
gfxContext.SetPipelineState(m_PSO);
223+
gfxContext.SetPipelineState(m_mapPSO[E_EPT_WIREFRAME]);
216224

217225
// 设置根签名
218226
gfxContext.SetRootSignature(m_RootSignature);

Chapter 10 Blending/GameApp.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "Camera.h"
88
#include "Waves.h"
99
#include "d3dUtil.h"
10+
#include <unordered_map>
1011

1112
class RootSignature;
1213
class StructuredBuffer;
@@ -59,8 +60,13 @@ class GameApp : public GameCore::IGameApp
5960
};
6061

6162
RootSignature m_RootSignature;
62-
GraphicsPSO m_PSO;
63-
GraphicsPSO m_PSOEx;
63+
64+
enum ePSOType
65+
{
66+
E_EPT_DEFAULT = 1,
67+
E_EPT_WIREFRAME = 2
68+
};
69+
std::unordered_map<int, GraphicsPSO> m_mapPSO;
6470

6571
bool m_bRenderShapes = true;
6672
bool m_bRenderFill = true;

0 commit comments

Comments
 (0)