64 [[nodiscard]]
static std::expected<GpuMultires, std::string>
Create(ID3D12Device5* device,
74 [[nodiscard]]
bool RecordRequests(ID3D12GraphicsCommandList10* list,
75 std::span<const multires::MrRequest> requests);
77 void RecordFoldPages(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t tick);
79 void RecordFoldPages(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t tick,
80 const multires::MrFoldTolerance& tolerance);
84 void RecordQuietRequests(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t tick);
85 void RecordQuietRequests(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t tick,
86 const multires::MrFoldTolerance& tolerance);
89 void RecordExpandPass(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing);
92 void RecordRefineShadow(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing,
93 uint32_t parentSlot, uint32_t firstChildSlot, uint32_t levelCount,
95 void RecordRemoveShadow(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing,
96 uint32_t firstSlot, uint32_t levelCount);
99 void RecordStep(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t worldSeed,
103 [[nodiscard]]
bool RecordStepActive(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing,
105 void RecordPullBack(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing,
106 uint32_t firstShadowSlot, uint32_t levelCount);
110 void SetExternalViews(D3D12_GPU_VIRTUAL_ADDRESS first, D3D12_GPU_VIRTUAL_ADDRESS second);
113 ID3D12PipelineState* pipeline, uint32_t groupCount,
114 const std::array<uint32_t, 4>& external);
129 [[nodiscard]] std::optional<ActivitySeeds>
ReadSeeds()
const;
132 void RecordTimestamp(ID3D12GraphicsCommandList10* list, uint32_t index);
133 [[nodiscard]] std::vector<uint64_t>
ReadTimestamps(uint32_t count)
const;
201 [[nodiscard]] std::expected<void, std::string>
CreatePipelines(ID3D12Device5* device,
203 [[nodiscard]] std::expected<void, std::string>
CreateBuffers(ID3D12Device5* device,
205 void BindRoot(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing)
const;
208 void DispatchGraph(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t entry,
209 const void* record, uint32_t recordBytes);
210 void RecordTreePass(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t pass,
211 uint32_t groupCount);
212 [[nodiscard]] std::array<uint64_t, BufferCount>
BufferSizes()
const;
213 [[nodiscard]] uint64_t
PageCount()
const;
216 void RecordExpandPages(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing);
218 void RecordWake(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t extraFlags);
219 void RecordStepWait(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing);
220 void RecordConductPass(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t pass,
221 uint32_t groupCount);
222 void RecordConduction(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing,
224 void RecordConductSubstep(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing,
226 void RecordSubstepEnd(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing,
228 void RecordConductStage(ID3D12GraphicsCommandList10* list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t pass);
234 [[nodiscard]] std::vector<std::byte>
MakeActivityList(uint32_t list, std::span<const uint32_t> slots)
const;
235 void SetTick(uint64_t worldSeed, uint64_t tick);
RootConstants m_constants
static constexpr uint32_t CONDUCT_PASS_COUNT
std::array< uint32_t, 4 > m_entries
ComPtr< ID3D12RootSignature > m_rootSignature
GpuMultires & operator=(GpuMultires &&other) noexcept
void StampImplicitPhases(bool stamp)
void RecordQuietRequests(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t tick)
ComPtr< ID3D12Resource > m_timestampReadback
bool m_activityGraphInitialized
void BindRoot(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing) const
uint64_t PageCount() const
uint64_t GraphBackingMemoryBytes() const
void SetActivityProgram(ID3D12GraphicsCommandList10 *list)
ComPtr< ID3D12QueryHeap > m_timestamps
bool UseConductionGraph(bool use)
std::unique_ptr< gpu::WorkGraph > m_conductGraph
void SetTick(uint64_t worldSeed, uint64_t tick)
static constexpr uint32_t TREE_PASS_COUNT
uint64_t ConductRecordsOffset() const
void RecordExpandPages(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing)
GpuMultires & operator=(const GpuMultires &)=delete
ComPtr< ID3D12PipelineState > m_wakePipeline
static constexpr uint32_t TABLE_COUNT
std::array< ComPtr< ID3D12Resource >, BufferCount > m_readbacks
bool RecordRequests(ID3D12GraphicsCommandList10 *list, std::span< const multires::MrRequest > requests)
void RecordFoldPages(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t tick, const multires::MrFoldTolerance &tolerance)
void RecordWake(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t extraFlags)
std::unique_ptr< gpu::WorkGraph > m_activityGraph
void RecordFoldPages(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t tick)
void RecordConduction(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, const MultiresStepOptions &options, uint32_t wakeList)
std::array< ComPtr< ID3D12Resource >, TABLE_COUNT > m_tables
void RecordStepWait(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing)
std::vector< uint64_t > ReadTimestamps(uint32_t count) const
void SetGraphProgram(ID3D12GraphicsCommandList10 *list)
void SetExternalViews(D3D12_GPU_VIRTUAL_ADDRESS first, D3D12_GPU_VIRTUAL_ADDRESS second)
ID3D12RootSignature * RootSignature() const
void RecordConductStage(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t pass)
void RecordRefineShadow(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t parentSlot, uint32_t firstChildSlot, uint32_t levelCount, const MultiresPoint &point)
static constexpr uint32_t MAX_TIMESTAMPS
bool Read(MultiresNest &nest) const
std::vector< std::byte > MakeTreeWordsImage(const MultiresNest &nest) const
std::array< uint64_t, BufferCount > BufferSizes() const
void RecordPullBack(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t firstShadowSlot, uint32_t levelCount)
bool m_conductGraphInitialized
void DispatchGraph(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t entry, const void *record, uint32_t recordBytes)
const GpuMultiresImplicit * ImplicitConduction() const
ComPtr< ID3D12Resource > m_activityReadback
ComPtr< ID3D12PipelineState > m_stepExpandedWaitPipeline
std::vector< std::byte > MakeActivityList(uint32_t list, std::span< const uint32_t > slots) const
std::array< ComPtr< ID3D12Resource >, BufferCount > m_uploads
void RecordImplicitConduction(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, const MultiresStepOptions &options)
ComPtr< ID3D12Resource > m_requestUpload
std::array< ComPtr< ID3D12Resource >, BufferCount > m_buffers
std::array< ComPtr< ID3D12Resource >, ACTIVITY_LISTS > m_activity
void RecordConductPass(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t pass, uint32_t groupCount)
uint32_t m_activityCurrent
void RecordExternalDispatch(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, ID3D12PipelineState *pipeline, uint32_t groupCount, const std::array< uint32_t, 4 > &external)
MultiresCapacity m_capacity
ComPtr< ID3D12PipelineState > m_stepWaitPipeline
static constexpr uint32_t ACTIVITY_LISTS
void RecordRemoveShadow(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t firstSlot, uint32_t levelCount)
std::vector< std::byte > MakeGraphInputImage() const
void RecordTimestamp(ID3D12GraphicsCommandList10 *list, uint32_t index)
void RecordQuietRequests(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t tick, const multires::MrFoldTolerance &tolerance)
std::array< uint32_t, 3 > m_activityEntries
void RecordStep(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t worldSeed, uint64_t tick, const MultiresStepOptions &options={})
std::expected< void, std::string > CreateBuffers(ID3D12Device5 *device, const BakedReactionTable &table)
std::expected< void, std::string > CreatePipelines(ID3D12Device5 *device, const GpuMultiresOptions &options)
bool RecordUpload(ID3D12GraphicsCommandList10 *list, const MultiresNest &nest)
ComPtr< ID3D12Resource > m_activityUpload
uint32_t m_timestampCount
void RecordExpandPass(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing)
bool RecordStepActive(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint64_t worldSeed, uint64_t tick, const MultiresStepOptions &options={})
static std::expected< GpuMultires, std::string > Create(ID3D12Device5 *device, const BakedReactionTable &table, const MultiresCapacity &capacity, const GpuMultiresOptions &options={})
std::unique_ptr< GpuMultiresImplicit > m_implicit
void RecordSubstepEnd(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t wakeList)
std::unique_ptr< gpu::WorkGraph > m_graph
void RecordConductSubstep(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, const MultiresStepOptions &options)
std::array< uint32_t, 4 > m_conductEntries
std::optional< ActivitySeeds > ReadSeeds() const
GpuMultires(const GpuMultires &)=delete
void RecordProcessRequests(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing)
void RecordReadback(ID3D12GraphicsCommandList10 *list)
std::expected< void, std::string > EnableImplicitConduction(ID3D12Device5 *device, const GpuMultiresImplicitLimits &limits)
uint32_t BlockCapacity() const
std::expected< void, std::string > CreateConductionGraph(ID3D12Device5 *device)
std::array< ComPtr< ID3D12PipelineState >, TREE_PASS_COUNT > m_treePipelines
uint64_t ActivityBytes() const
uint32_t m_requestUploadCursor
std::array< ComPtr< ID3D12PipelineState >, CONDUCT_PASS_COUNT > m_conductPipelines
std::array< D3D12_GPU_VIRTUAL_ADDRESS, 2 > m_externalViews
static constexpr uint32_t REQUEST_UPLOAD_SLOTS
GpuMultires(GpuMultires &&other) noexcept
void RecordTreePass(ID3D12GraphicsCommandList10 *list, D3D12_GPU_VIRTUAL_ADDRESS debugRing, uint32_t pass, uint32_t groupCount)
MultiresImplicitLimits GpuMultiresImplicitLimits
std::vector< uint32_t > slots
std::array< uint32_t, 4 > external
std::array< uint32_t, 6 > point