Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/directx_headers/include/directx/d3dx12_state_object.h
9906 views
1
//*********************************************************
2
//
3
// Copyright (c) Microsoft Corporation.
4
// Licensed under the MIT License (MIT).
5
//
6
//*********************************************************
7
8
#pragma once
9
10
#ifndef __cplusplus
11
#error D3DX12 requires C++
12
#endif
13
14
#include "d3d12.h"
15
16
//================================================================================================
17
// D3DX12 State Object Creation Helpers
18
//
19
// Helper classes for creating new style state objects out of an arbitrary set of subobjects.
20
// Uses STL
21
//
22
// Start by instantiating CD3DX12_STATE_OBJECT_DESC (see its public methods).
23
// One of its methods is CreateSubobject(), which has a comment showing a couple of options for
24
// defining subobjects using the helper classes for each subobject (CD3DX12_DXIL_LIBRARY_SUBOBJECT
25
// etc.). The subobject helpers each have methods specific to the subobject for configuring its
26
// contents.
27
//
28
//================================================================================================
29
#include <list>
30
#include <memory>
31
#include <string>
32
#include <vector>
33
#ifndef D3DX12_USE_ATL
34
#include <wrl/client.h>
35
#define D3DX12_COM_PTR Microsoft::WRL::ComPtr
36
#define D3DX12_COM_PTR_GET(x) x.Get()
37
#define D3DX12_COM_PTR_ADDRESSOF(x) x.GetAddressOf()
38
#else
39
#include <atlbase.h>
40
#define D3DX12_COM_PTR ATL::CComPtr
41
#define D3DX12_COM_PTR_GET(x) x.p
42
#define D3DX12_COM_PTR_ADDRESSOF(x) &x.p
43
#endif
44
45
//------------------------------------------------------------------------------------------------
46
class CD3DX12_STATE_OBJECT_DESC
47
{
48
public:
49
CD3DX12_STATE_OBJECT_DESC() noexcept
50
{
51
Init(D3D12_STATE_OBJECT_TYPE_COLLECTION);
52
}
53
CD3DX12_STATE_OBJECT_DESC(D3D12_STATE_OBJECT_TYPE Type) noexcept
54
{
55
Init(Type);
56
}
57
void SetStateObjectType(D3D12_STATE_OBJECT_TYPE Type) noexcept { m_Desc.Type = Type; }
58
operator const D3D12_STATE_OBJECT_DESC&()
59
{
60
// Do final preparation work
61
m_RepointedAssociations.clear();
62
m_SubobjectArray.clear();
63
m_SubobjectArray.reserve(m_Desc.NumSubobjects);
64
// Flatten subobjects into an array (each flattened subobject still has a
65
// member that's a pointer to its desc that's not flattened)
66
for (auto Iter = m_SubobjectList.begin();
67
Iter != m_SubobjectList.end(); Iter++)
68
{
69
m_SubobjectArray.push_back(*Iter);
70
// Store new location in array so we can redirect pointers contained in subobjects
71
Iter->pSubobjectArrayLocation = &m_SubobjectArray.back();
72
}
73
// For subobjects with pointer fields, create a new copy of those subobject definitions
74
// with fixed pointers
75
for (UINT i = 0; i < m_Desc.NumSubobjects; i++)
76
{
77
if (m_SubobjectArray[i].Type == D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION)
78
{
79
auto pOriginalSubobjectAssociation =
80
static_cast<const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION*>(m_SubobjectArray[i].pDesc);
81
D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION Repointed = *pOriginalSubobjectAssociation;
82
auto pWrapper =
83
static_cast<const SUBOBJECT_WRAPPER*>(pOriginalSubobjectAssociation->pSubobjectToAssociate);
84
Repointed.pSubobjectToAssociate = pWrapper->pSubobjectArrayLocation;
85
m_RepointedAssociations.push_back(Repointed);
86
m_SubobjectArray[i].pDesc = &m_RepointedAssociations.back();
87
}
88
}
89
// Below: using ugly way to get pointer in case .data() is not defined
90
m_Desc.pSubobjects = m_Desc.NumSubobjects ? &m_SubobjectArray[0] : nullptr;
91
return m_Desc;
92
}
93
operator const D3D12_STATE_OBJECT_DESC*()
94
{
95
// Cast calls the above final preparation work
96
return &static_cast<const D3D12_STATE_OBJECT_DESC&>(*this);
97
}
98
99
// CreateSubobject creates a sububject helper (e.g. CD3DX12_HIT_GROUP_SUBOBJECT)
100
// whose lifetime is owned by this class.
101
// e.g.
102
//
103
// CD3DX12_STATE_OBJECT_DESC Collection1(D3D12_STATE_OBJECT_TYPE_COLLECTION);
104
// auto Lib0 = Collection1.CreateSubobject<CD3DX12_DXIL_LIBRARY_SUBOBJECT>();
105
// Lib0->SetDXILLibrary(&pMyAppDxilLibs[0]);
106
// Lib0->DefineExport(L"rayGenShader0"); // in practice these export listings might be
107
// // data/engine driven
108
// etc.
109
//
110
// Alternatively, users can instantiate sububject helpers explicitly, such as via local
111
// variables instead, passing the state object desc that should point to it into the helper
112
// constructor (or call mySubobjectHelper.AddToStateObject(Collection1)).
113
// In this alternative scenario, the user must keep the subobject alive as long as the state
114
// object it is associated with is alive, else its pointer references will be stale.
115
// e.g.
116
//
117
// CD3DX12_STATE_OBJECT_DESC RaytracingState2(D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE);
118
// CD3DX12_DXIL_LIBRARY_SUBOBJECT LibA(RaytracingState2);
119
// LibA.SetDXILLibrary(&pMyAppDxilLibs[4]); // not manually specifying exports
120
// // - meaning all exports in the libraries
121
// // are exported
122
// etc.
123
124
template<typename T>
125
T* CreateSubobject()
126
{
127
T* pSubobject = new T(*this);
128
m_OwnedSubobjectHelpers.emplace_back(pSubobject);
129
return pSubobject;
130
}
131
132
private:
133
D3D12_STATE_SUBOBJECT* TrackSubobject(D3D12_STATE_SUBOBJECT_TYPE Type, void* pDesc)
134
{
135
SUBOBJECT_WRAPPER Subobject;
136
Subobject.pSubobjectArrayLocation = nullptr;
137
Subobject.Type = Type;
138
Subobject.pDesc = pDesc;
139
m_SubobjectList.push_back(Subobject);
140
m_Desc.NumSubobjects++;
141
return &m_SubobjectList.back();
142
}
143
void Init(D3D12_STATE_OBJECT_TYPE Type) noexcept
144
{
145
SetStateObjectType(Type);
146
m_Desc.pSubobjects = nullptr;
147
m_Desc.NumSubobjects = 0;
148
m_SubobjectList.clear();
149
m_SubobjectArray.clear();
150
m_RepointedAssociations.clear();
151
}
152
typedef struct SUBOBJECT_WRAPPER : public D3D12_STATE_SUBOBJECT
153
{
154
D3D12_STATE_SUBOBJECT* pSubobjectArrayLocation; // new location when flattened into array
155
// for repointing pointers in subobjects
156
} SUBOBJECT_WRAPPER;
157
D3D12_STATE_OBJECT_DESC m_Desc;
158
std::list<SUBOBJECT_WRAPPER> m_SubobjectList; // Pointers to list nodes handed out so
159
// these can be edited live
160
std::vector<D3D12_STATE_SUBOBJECT> m_SubobjectArray; // Built at the end, copying list contents
161
162
std::list<D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION>
163
m_RepointedAssociations; // subobject type that contains pointers to other subobjects,
164
// repointed to flattened array
165
166
class StringContainer
167
{
168
public:
169
LPCWSTR LocalCopy(LPCWSTR string, bool bSingleString = false)
170
{
171
if (string)
172
{
173
if (bSingleString)
174
{
175
m_Strings.clear();
176
m_Strings.push_back(string);
177
}
178
else
179
{
180
m_Strings.push_back(string);
181
}
182
return m_Strings.back().c_str();
183
}
184
else
185
{
186
return nullptr;
187
}
188
}
189
void clear() noexcept { m_Strings.clear(); }
190
private:
191
std::list<std::wstring> m_Strings;
192
};
193
194
class SUBOBJECT_HELPER_BASE
195
{
196
public:
197
SUBOBJECT_HELPER_BASE() noexcept { Init(); }
198
virtual ~SUBOBJECT_HELPER_BASE() = default;
199
virtual D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept = 0;
200
void AddToStateObject(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
201
{
202
m_pSubobject = ContainingStateObject.TrackSubobject(Type(), Data());
203
}
204
protected:
205
virtual void* Data() noexcept = 0;
206
void Init() noexcept { m_pSubobject = nullptr; }
207
D3D12_STATE_SUBOBJECT* m_pSubobject;
208
};
209
210
#if(__cplusplus >= 201103L)
211
std::list<std::unique_ptr<const SUBOBJECT_HELPER_BASE>> m_OwnedSubobjectHelpers;
212
#else
213
class OWNED_HELPER
214
{
215
public:
216
OWNED_HELPER(const SUBOBJECT_HELPER_BASE* pHelper) noexcept { m_pHelper = pHelper; }
217
~OWNED_HELPER() { delete m_pHelper; }
218
const SUBOBJECT_HELPER_BASE* m_pHelper;
219
};
220
221
std::list<OWNED_HELPER> m_OwnedSubobjectHelpers;
222
#endif
223
224
friend class CD3DX12_DXIL_LIBRARY_SUBOBJECT;
225
friend class CD3DX12_EXISTING_COLLECTION_SUBOBJECT;
226
friend class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT;
227
friend class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
228
friend class CD3DX12_HIT_GROUP_SUBOBJECT;
229
friend class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT;
230
friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT;
231
friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT;
232
friend class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT;
233
friend class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT;
234
friend class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT;
235
friend class CD3DX12_NODE_MASK_SUBOBJECT;
236
};
237
238
//------------------------------------------------------------------------------------------------
239
class CD3DX12_DXIL_LIBRARY_SUBOBJECT
240
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
241
{
242
public:
243
CD3DX12_DXIL_LIBRARY_SUBOBJECT() noexcept
244
{
245
Init();
246
}
247
CD3DX12_DXIL_LIBRARY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
248
{
249
Init();
250
AddToStateObject(ContainingStateObject);
251
}
252
void SetDXILLibrary(const D3D12_SHADER_BYTECODE* pCode) noexcept
253
{
254
static const D3D12_SHADER_BYTECODE Default = {};
255
m_Desc.DXILLibrary = pCode ? *pCode : Default;
256
}
257
void DefineExport(
258
LPCWSTR Name,
259
LPCWSTR ExportToRename = nullptr,
260
D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
261
{
262
D3D12_EXPORT_DESC Export;
263
Export.Name = m_Strings.LocalCopy(Name);
264
Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
265
Export.Flags = Flags;
266
m_Exports.push_back(Export);
267
m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
268
m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
269
}
270
template<size_t N>
271
void DefineExports(LPCWSTR(&Exports)[N])
272
{
273
for (UINT i = 0; i < N; i++)
274
{
275
DefineExport(Exports[i]);
276
}
277
}
278
void DefineExports(const LPCWSTR* Exports, UINT N)
279
{
280
for (UINT i = 0; i < N; i++)
281
{
282
DefineExport(Exports[i]);
283
}
284
}
285
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
286
{
287
return D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY;
288
}
289
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
290
operator const D3D12_DXIL_LIBRARY_DESC&() const noexcept { return m_Desc; }
291
private:
292
void Init() noexcept
293
{
294
SUBOBJECT_HELPER_BASE::Init();
295
m_Desc = {};
296
m_Strings.clear();
297
m_Exports.clear();
298
}
299
void* Data() noexcept override { return &m_Desc; }
300
D3D12_DXIL_LIBRARY_DESC m_Desc;
301
CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;
302
std::vector<D3D12_EXPORT_DESC> m_Exports;
303
};
304
305
//------------------------------------------------------------------------------------------------
306
class CD3DX12_EXISTING_COLLECTION_SUBOBJECT
307
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
308
{
309
public:
310
CD3DX12_EXISTING_COLLECTION_SUBOBJECT() noexcept
311
{
312
Init();
313
}
314
CD3DX12_EXISTING_COLLECTION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
315
{
316
Init();
317
AddToStateObject(ContainingStateObject);
318
}
319
void SetExistingCollection(ID3D12StateObject*pExistingCollection) noexcept
320
{
321
m_Desc.pExistingCollection = pExistingCollection;
322
m_CollectionRef = pExistingCollection;
323
}
324
void DefineExport(
325
LPCWSTR Name,
326
LPCWSTR ExportToRename = nullptr,
327
D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
328
{
329
D3D12_EXPORT_DESC Export;
330
Export.Name = m_Strings.LocalCopy(Name);
331
Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
332
Export.Flags = Flags;
333
m_Exports.push_back(Export);
334
m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
335
m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
336
}
337
template<size_t N>
338
void DefineExports(LPCWSTR(&Exports)[N])
339
{
340
for (UINT i = 0; i < N; i++)
341
{
342
DefineExport(Exports[i]);
343
}
344
}
345
void DefineExports(const LPCWSTR* Exports, UINT N)
346
{
347
for (UINT i = 0; i < N; i++)
348
{
349
DefineExport(Exports[i]);
350
}
351
}
352
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
353
{
354
return D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION;
355
}
356
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
357
operator const D3D12_EXISTING_COLLECTION_DESC&() const noexcept { return m_Desc; }
358
private:
359
void Init() noexcept
360
{
361
SUBOBJECT_HELPER_BASE::Init();
362
m_Desc = {};
363
m_CollectionRef = nullptr;
364
m_Strings.clear();
365
m_Exports.clear();
366
}
367
void* Data() noexcept override { return &m_Desc; }
368
D3D12_EXISTING_COLLECTION_DESC m_Desc;
369
D3DX12_COM_PTR<ID3D12StateObject> m_CollectionRef;
370
CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;
371
std::vector<D3D12_EXPORT_DESC> m_Exports;
372
};
373
374
//------------------------------------------------------------------------------------------------
375
class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT
376
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
377
{
378
public:
379
CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT() noexcept
380
{
381
Init();
382
}
383
CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
384
{
385
Init();
386
AddToStateObject(ContainingStateObject);
387
}
388
void SetSubobjectToAssociate(const D3D12_STATE_SUBOBJECT& SubobjectToAssociate) noexcept
389
{
390
m_Desc.pSubobjectToAssociate = &SubobjectToAssociate;
391
}
392
void AddExport(LPCWSTR Export)
393
{
394
m_Desc.NumExports++;
395
m_Exports.push_back(m_Strings.LocalCopy(Export));
396
m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
397
}
398
template<size_t N>
399
void AddExports(LPCWSTR (&Exports)[N])
400
{
401
for (UINT i = 0; i < N; i++)
402
{
403
AddExport(Exports[i]);
404
}
405
}
406
void AddExports(const LPCWSTR* Exports, UINT N)
407
{
408
for (UINT i = 0; i < N; i++)
409
{
410
AddExport(Exports[i]);
411
}
412
}
413
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
414
{
415
return D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
416
}
417
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
418
operator const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }
419
private:
420
void Init() noexcept
421
{
422
SUBOBJECT_HELPER_BASE::Init();
423
m_Desc = {};
424
m_Strings.clear();
425
m_Exports.clear();
426
}
427
void* Data() noexcept override { return &m_Desc; }
428
D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;
429
CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;
430
std::vector<LPCWSTR> m_Exports;
431
};
432
433
//------------------------------------------------------------------------------------------------
434
class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION
435
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
436
{
437
public:
438
CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION() noexcept
439
{
440
Init();
441
}
442
CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
443
{
444
Init();
445
AddToStateObject(ContainingStateObject);
446
}
447
void SetSubobjectNameToAssociate(LPCWSTR SubobjectToAssociate)
448
{
449
m_Desc.SubobjectToAssociate = m_SubobjectName.LocalCopy(SubobjectToAssociate, true);
450
}
451
void AddExport(LPCWSTR Export)
452
{
453
m_Desc.NumExports++;
454
m_Exports.push_back(m_Strings.LocalCopy(Export));
455
m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
456
}
457
template<size_t N>
458
void AddExports(LPCWSTR (&Exports)[N])
459
{
460
for (UINT i = 0; i < N; i++)
461
{
462
AddExport(Exports[i]);
463
}
464
}
465
void AddExports(const LPCWSTR* Exports, UINT N)
466
{
467
for (UINT i = 0; i < N; i++)
468
{
469
AddExport(Exports[i]);
470
}
471
}
472
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
473
{
474
return D3D12_STATE_SUBOBJECT_TYPE_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
475
}
476
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
477
operator const D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }
478
private:
479
void Init() noexcept
480
{
481
SUBOBJECT_HELPER_BASE::Init();
482
m_Desc = {};
483
m_Strings.clear();
484
m_SubobjectName.clear();
485
m_Exports.clear();
486
}
487
void* Data() noexcept override { return &m_Desc; }
488
D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;
489
CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;
490
CD3DX12_STATE_OBJECT_DESC::StringContainer m_SubobjectName;
491
std::vector<LPCWSTR> m_Exports;
492
};
493
494
//------------------------------------------------------------------------------------------------
495
class CD3DX12_HIT_GROUP_SUBOBJECT
496
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
497
{
498
public:
499
CD3DX12_HIT_GROUP_SUBOBJECT() noexcept
500
{
501
Init();
502
}
503
CD3DX12_HIT_GROUP_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
504
{
505
Init();
506
AddToStateObject(ContainingStateObject);
507
}
508
void SetHitGroupExport(LPCWSTR exportName)
509
{
510
m_Desc.HitGroupExport = m_Strings[0].LocalCopy(exportName, true);
511
}
512
void SetHitGroupType(D3D12_HIT_GROUP_TYPE Type) noexcept { m_Desc.Type = Type; }
513
void SetAnyHitShaderImport(LPCWSTR importName)
514
{
515
m_Desc.AnyHitShaderImport = m_Strings[1].LocalCopy(importName, true);
516
}
517
void SetClosestHitShaderImport(LPCWSTR importName)
518
{
519
m_Desc.ClosestHitShaderImport = m_Strings[2].LocalCopy(importName, true);
520
}
521
void SetIntersectionShaderImport(LPCWSTR importName)
522
{
523
m_Desc.IntersectionShaderImport = m_Strings[3].LocalCopy(importName, true);
524
}
525
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
526
{
527
return D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;
528
}
529
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
530
operator const D3D12_HIT_GROUP_DESC&() const noexcept { return m_Desc; }
531
private:
532
void Init() noexcept
533
{
534
SUBOBJECT_HELPER_BASE::Init();
535
m_Desc = {};
536
for (UINT i = 0; i < m_NumStrings; i++)
537
{
538
m_Strings[i].clear();
539
}
540
}
541
void* Data() noexcept override { return &m_Desc; }
542
D3D12_HIT_GROUP_DESC m_Desc;
543
static constexpr UINT m_NumStrings = 4;
544
CD3DX12_STATE_OBJECT_DESC::StringContainer
545
m_Strings[m_NumStrings]; // one string for every entrypoint name
546
};
547
548
//------------------------------------------------------------------------------------------------
549
class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT
550
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
551
{
552
public:
553
CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT() noexcept
554
{
555
Init();
556
}
557
CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
558
{
559
Init();
560
AddToStateObject(ContainingStateObject);
561
}
562
void Config(UINT MaxPayloadSizeInBytes, UINT MaxAttributeSizeInBytes) noexcept
563
{
564
m_Desc.MaxPayloadSizeInBytes = MaxPayloadSizeInBytes;
565
m_Desc.MaxAttributeSizeInBytes = MaxAttributeSizeInBytes;
566
}
567
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
568
{
569
return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG;
570
}
571
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
572
operator const D3D12_RAYTRACING_SHADER_CONFIG&() const noexcept { return m_Desc; }
573
private:
574
void Init() noexcept
575
{
576
SUBOBJECT_HELPER_BASE::Init();
577
m_Desc = {};
578
}
579
void* Data() noexcept override { return &m_Desc; }
580
D3D12_RAYTRACING_SHADER_CONFIG m_Desc;
581
};
582
583
//------------------------------------------------------------------------------------------------
584
class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT
585
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
586
{
587
public:
588
CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT() noexcept
589
{
590
Init();
591
}
592
CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
593
{
594
Init();
595
AddToStateObject(ContainingStateObject);
596
}
597
void Config(UINT MaxTraceRecursionDepth) noexcept
598
{
599
m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;
600
}
601
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
602
{
603
return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG;
604
}
605
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
606
operator const D3D12_RAYTRACING_PIPELINE_CONFIG&() const noexcept { return m_Desc; }
607
private:
608
void Init() noexcept
609
{
610
SUBOBJECT_HELPER_BASE::Init();
611
m_Desc = {};
612
}
613
void* Data() noexcept override { return &m_Desc; }
614
D3D12_RAYTRACING_PIPELINE_CONFIG m_Desc;
615
};
616
617
//------------------------------------------------------------------------------------------------
618
class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT
619
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
620
{
621
public:
622
CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT() noexcept
623
{
624
Init();
625
}
626
CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
627
{
628
Init();
629
AddToStateObject(ContainingStateObject);
630
}
631
void Config(UINT MaxTraceRecursionDepth, D3D12_RAYTRACING_PIPELINE_FLAGS Flags) noexcept
632
{
633
m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;
634
m_Desc.Flags = Flags;
635
}
636
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
637
{
638
return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG1;
639
}
640
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
641
operator const D3D12_RAYTRACING_PIPELINE_CONFIG1&() const noexcept { return m_Desc; }
642
private:
643
void Init() noexcept
644
{
645
SUBOBJECT_HELPER_BASE::Init();
646
m_Desc = {};
647
}
648
void* Data() noexcept override { return &m_Desc; }
649
D3D12_RAYTRACING_PIPELINE_CONFIG1 m_Desc;
650
};
651
652
//------------------------------------------------------------------------------------------------
653
class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT
654
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
655
{
656
public:
657
CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT() noexcept
658
{
659
Init();
660
}
661
CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
662
{
663
Init();
664
AddToStateObject(ContainingStateObject);
665
}
666
void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept
667
{
668
m_pRootSig = pRootSig;
669
}
670
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
671
{
672
return D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE;
673
}
674
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
675
operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }
676
private:
677
void Init() noexcept
678
{
679
SUBOBJECT_HELPER_BASE::Init();
680
m_pRootSig = nullptr;
681
}
682
void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }
683
D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;
684
};
685
686
//------------------------------------------------------------------------------------------------
687
class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT
688
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
689
{
690
public:
691
CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT() noexcept
692
{
693
Init();
694
}
695
CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
696
{
697
Init();
698
AddToStateObject(ContainingStateObject);
699
}
700
void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept
701
{
702
m_pRootSig = pRootSig;
703
}
704
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
705
{
706
return D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE;
707
}
708
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
709
operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }
710
private:
711
void Init() noexcept
712
{
713
SUBOBJECT_HELPER_BASE::Init();
714
m_pRootSig = nullptr;
715
}
716
void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }
717
D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;
718
};
719
720
//------------------------------------------------------------------------------------------------
721
class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT
722
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
723
{
724
public:
725
CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT() noexcept
726
{
727
Init();
728
}
729
CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
730
{
731
Init();
732
AddToStateObject(ContainingStateObject);
733
}
734
void SetFlags(D3D12_STATE_OBJECT_FLAGS Flags) noexcept
735
{
736
m_Desc.Flags = Flags;
737
}
738
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
739
{
740
return D3D12_STATE_SUBOBJECT_TYPE_STATE_OBJECT_CONFIG;
741
}
742
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
743
operator const D3D12_STATE_OBJECT_CONFIG&() const noexcept { return m_Desc; }
744
private:
745
void Init() noexcept
746
{
747
SUBOBJECT_HELPER_BASE::Init();
748
m_Desc = {};
749
}
750
void* Data() noexcept override { return &m_Desc; }
751
D3D12_STATE_OBJECT_CONFIG m_Desc;
752
};
753
754
//------------------------------------------------------------------------------------------------
755
class CD3DX12_NODE_MASK_SUBOBJECT
756
: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
757
{
758
public:
759
CD3DX12_NODE_MASK_SUBOBJECT() noexcept
760
{
761
Init();
762
}
763
CD3DX12_NODE_MASK_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
764
{
765
Init();
766
AddToStateObject(ContainingStateObject);
767
}
768
void SetNodeMask(UINT NodeMask) noexcept
769
{
770
m_Desc.NodeMask = NodeMask;
771
}
772
D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
773
{
774
return D3D12_STATE_SUBOBJECT_TYPE_NODE_MASK;
775
}
776
operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
777
operator const D3D12_NODE_MASK&() const noexcept { return m_Desc; }
778
private:
779
void Init() noexcept
780
{
781
SUBOBJECT_HELPER_BASE::Init();
782
m_Desc = {};
783
}
784
void* Data() noexcept override { return &m_Desc; }
785
D3D12_NODE_MASK m_Desc;
786
};
787
788
#undef D3DX12_COM_PTR
789
#undef D3DX12_COM_PTR_GET
790
#undef D3DX12_COM_PTR_ADDRESSOF
791
792