16 ComPtr<ID3D12StateObject>
CreateStateObject(ID3D12Device5* device, ID3D12RootSignature* globalRootSignature,
17 std::span<const std::byte> library,
const std::wstring& name) {
18 CD3DX12_STATE_OBJECT_DESC desc(D3D12_STATE_OBJECT_TYPE_EXECUTABLE);
19 const CD3DX12_SHADER_BYTECODE bytecode(library.data(), library.size());
20 desc.CreateSubobject<CD3DX12_DXIL_LIBRARY_SUBOBJECT>()->SetDXILLibrary(&bytecode);
21 desc.CreateSubobject<CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT>()->SetRootSignature(globalRootSignature);
22 auto* workGraph = desc.CreateSubobject<CD3DX12_WORK_GRAPH_SUBOBJECT>();
23 workGraph->IncludeAllAvailableNodes();
24 workGraph->SetProgramName(name.c_str());
26 ComPtr<ID3D12StateObject> stateObject;
36 ID3D12RootSignature* globalRootSignature,
37 std::span<const std::byte> library,
38 std::wstring_view programName) {
39 const std::wstring name(programName);
41 graph.
m_stateObject = CreateStateObject(device, globalRootSignature, library, name);
43 return std::unexpected(
"ワークグラフの状態オブジェクトを作れない");
45 ComPtr<ID3D12StateObjectProperties1> stateProperties;
47 return std::unexpected(
"状態オブジェクトから Work Graphs のプロパティを取れない(ランタイムが古い)");
53 D3D12_WORK_GRAPH_MEMORY_REQUIREMENTS requirements{};
60 return std::unexpected(
"ワークグラフの裏のメモリを確保できない");
64 requirements.MaxSizeInBytes, requirements.MinSizeInBytes);
70 const std::wstring name(nodeName);
75 D3D12_SET_PROGRAM_DESC desc{.Type = D3D12_PROGRAM_TYPE_WORK_GRAPH};
78 .Flags = initialize ? D3D12_SET_WORK_GRAPH_FLAG_INITIALIZE : D3D12_SET_WORK_GRAPH_FLAG_NONE,
83 list->SetProgram(&desc);
87 uint32_t recordCount, uint64_t recordStrideBytes) {
88 D3D12_DISPATCH_GRAPH_DESC desc{.Mode = D3D12_DISPATCH_MODE_NODE_CPU_INPUT};
90 .EntrypointIndex = entrypointIndex,
91 .NumRecords = recordCount,
93 .RecordStrideInBytes = recordStrideBytes,
96 list->DispatchGraph(&desc);
100 D3D12_DISPATCH_GRAPH_DESC desc{.Mode = D3D12_DISPATCH_MODE_NODE_GPU_INPUT};
101 desc.NodeGPUInput = nodeGpuInput;
102 list->DispatchGraph(&desc);
static std::expected< WorkGraph, std::string > Create(ID3D12Device5 *device, ID3D12RootSignature *globalRootSignature, std::span< const std::byte > library, std::wstring_view programName)
D3D12_PROGRAM_IDENTIFIER m_programIdentifier
static void DispatchFromCpu(ID3D12GraphicsCommandList10 *list, uint32_t entrypointIndex, const void *records, uint32_t recordCount, uint64_t recordStrideBytes)
uint32_t EntrypointIndex(std::wstring_view nodeName) const
void SetProgram(ID3D12GraphicsCommandList10 *list, bool initialize) const
ComPtr< ID3D12Resource > m_backingMemory
static void DispatchFromGpu(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS nodeGpuInput)
ComPtr< ID3D12WorkGraphProperties > m_properties
ComPtr< ID3D12StateObject > m_stateObject
uint64_t m_backingMemoryBytes
#define BICAMERAL_CHECK_HR(channel, expression)
ComPtr< ID3D12StateObject > CreateStateObject(ID3D12Device5 *device, ID3D12RootSignature *globalRootSignature, std::span< const std::byte > library, const std::wstring &name)
ComPtr< ID3D12Resource > CreateBuffer(ID3D12Device *device, uint64_t sizeBytes, BufferKind kind)
void Log(Channel channel, Level level, FormatWithLocation< std::type_identity_t< Args >... > pattern, Args &&... args)
std::string ToUtf8(std::wstring_view text)