Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/util/d3d12_builders.h
4214 views
1
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
#pragma once
5
6
#include "common/types.h"
7
#include "common/windows_headers.h"
8
9
#include "gpu_device.h"
10
11
#include <array>
12
#include <d3d12.h>
13
#include <string_view>
14
#include <wrl/client.h>
15
16
class Error;
17
18
namespace D3D12 {
19
class RootSignatureBuilder
20
{
21
public:
22
enum : u32
23
{
24
MAX_PARAMETERS = 16,
25
MAX_DESCRIPTOR_RANGES = 16
26
};
27
28
RootSignatureBuilder();
29
30
void Clear();
31
32
Microsoft::WRL::ComPtr<ID3D12RootSignature> Create(Error* error, bool clear);
33
34
void SetInputAssemblerFlag();
35
36
u32 Add32BitConstants(u32 shader_reg, u32 num_values, D3D12_SHADER_VISIBILITY visibility);
37
u32 AddCBVParameter(u32 shader_reg, D3D12_SHADER_VISIBILITY visibility);
38
u32 AddSRVParameter(u32 shader_reg, D3D12_SHADER_VISIBILITY visibility);
39
u32 AddDescriptorTable(D3D12_DESCRIPTOR_RANGE_TYPE rt, u32 start_shader_reg, u32 num_shader_regs,
40
D3D12_SHADER_VISIBILITY visibility);
41
42
private:
43
D3D12_ROOT_SIGNATURE_DESC m_desc{};
44
std::array<D3D12_ROOT_PARAMETER, MAX_PARAMETERS> m_params{};
45
std::array<D3D12_DESCRIPTOR_RANGE, MAX_DESCRIPTOR_RANGES> m_descriptor_ranges{};
46
u32 m_num_descriptor_ranges = 0;
47
};
48
49
class GraphicsPipelineBuilder
50
{
51
public:
52
enum : u32
53
{
54
MAX_VERTEX_ATTRIBUTES = 16,
55
};
56
57
GraphicsPipelineBuilder();
58
59
~GraphicsPipelineBuilder() = default;
60
61
ALWAYS_INLINE const D3D12_GRAPHICS_PIPELINE_STATE_DESC* GetDesc() const { return &m_desc; }
62
63
void Clear();
64
65
Microsoft::WRL::ComPtr<ID3D12PipelineState> Create(ID3D12Device* device, Error* error, bool clear);
66
67
void SetRootSignature(ID3D12RootSignature* rs);
68
69
void SetVertexShader(const void* data, u32 data_size);
70
void SetGeometryShader(const void* data, u32 data_size);
71
void SetPixelShader(const void* data, u32 data_size);
72
73
void SetVertexShader(const ID3DBlob* blob);
74
void SetGeometryShader(const ID3DBlob* blob);
75
void SetPixelShader(const ID3DBlob* blob);
76
77
void AddVertexAttribute(const char* semantic_name, u32 semantic_index, DXGI_FORMAT format, u32 buffer, u32 offset);
78
79
void SetPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE type);
80
81
void SetRasterizationState(D3D12_FILL_MODE polygon_mode, D3D12_CULL_MODE cull_mode, bool front_face_ccw);
82
83
void SetMultisamples(u32 multisamples);
84
85
void SetDepthState(bool depth_test, bool depth_write, D3D12_COMPARISON_FUNC compare_op);
86
void SetStencilState(bool stencil_test, u8 read_mask, u8 write_mask, const D3D12_DEPTH_STENCILOP_DESC& front,
87
const D3D12_DEPTH_STENCILOP_DESC& back);
88
void SetNoStencilState();
89
90
void SetBlendState(u32 rt, bool blend_enable, D3D12_BLEND src_factor, D3D12_BLEND dst_factor, D3D12_BLEND_OP op,
91
D3D12_BLEND alpha_src_factor, D3D12_BLEND alpha_dst_factor, D3D12_BLEND_OP alpha_op,
92
u8 write_mask = D3D12_COLOR_WRITE_ENABLE_ALL);
93
94
void ClearRenderTargets();
95
96
void SetRenderTarget(u32 rt, DXGI_FORMAT format);
97
98
void ClearDepthStencilFormat();
99
100
void SetDepthStencilFormat(DXGI_FORMAT format);
101
102
private:
103
D3D12_GRAPHICS_PIPELINE_STATE_DESC m_desc;
104
std::array<D3D12_INPUT_ELEMENT_DESC, MAX_VERTEX_ATTRIBUTES> m_input_elements;
105
};
106
107
class ComputePipelineBuilder
108
{
109
public:
110
ComputePipelineBuilder();
111
~ComputePipelineBuilder() = default;
112
113
ALWAYS_INLINE const D3D12_COMPUTE_PIPELINE_STATE_DESC* GetDesc() const { return &m_desc; }
114
115
void Clear();
116
117
Microsoft::WRL::ComPtr<ID3D12PipelineState> Create(ID3D12Device* device, Error* error, bool clear);
118
119
void SetRootSignature(ID3D12RootSignature* rs);
120
121
void SetShader(const void* data, u32 data_size);
122
123
private:
124
D3D12_COMPUTE_PIPELINE_STATE_DESC m_desc;
125
};
126
127
#ifdef ENABLE_GPU_OBJECT_NAMES
128
void SetObjectName(ID3D12Object* object, std::string_view name);
129
#else
130
inline void SetObjectName(ID3D12Object* object, std::string_view name)
131
{
132
}
133
#endif
134
} // namespace D3D12
135
136