36#include "common/probe_sim.hlsli"
37#include "common/probe_world.hlsli"
54 static_assert(
sizeof(
ProbeCommand) == PROBE_COMMAND_BYTES);
60 return uint64_t{command.
payload[0]} | (uint64_t{command.
payload[1]} << 32);
69 const std::array<int64_t, 3>& origin,
70 const std::array<int32_t, 3>& direction,
71 uint32_t impulseMillinewtonSeconds);
80 [[nodiscard]] uint32_t
PokeX()
const {
return place & 0xFFu; }
81 [[nodiscard]] uint32_t
PokeY()
const {
return (
place >> 8) & 0xFFu; }
82 [[nodiscard]] uint32_t
PokeZ()
const {
return (
place >> 16) & 0xFFu; }
120 std::vector<gpu::GraphTraceRecord>
trace;
208 [[nodiscard]]
static std::expected<ProbeSim, std::string>
Create(ID3D12Device5* device,
209 D3D12_COMMAND_LIST_TYPE listType,
223 return unit == 0 ? tick : tick + 1;
268 if (savePoint.tick != UINT64_MAX && savePoint.tick > tick)
269 savePoint.tick = UINT64_MAX;
279 ComPtr<ID3D12GraphicsCommandList10>
list;
314 std::span<const reaction::RxCell> initialWorld);
316 [[nodiscard]]
bool CreateFrameSlots(ID3D12Device5* device, D3D12_COMMAND_LIST_TYPE listType);
317 [[nodiscard]] std::expected<void, std::string>
CreatePhysics(ID3D12Device5* device);
323 void RecordEnqueue(ID3D12GraphicsCommandList10* list, uint32_t commandCount)
const;
324 void TrackCommands(std::span<const ProbeCommand> commands, uint64_t nextApplyTick);
327 void BindRootArguments(ID3D12GraphicsCommandList10* list, ID3D12Resource* input)
const;
328 void BindRootViews(ID3D12GraphicsCommandList10* list, ID3D12Resource* input)
const;
329 void RecordUnit(ID3D12GraphicsCommandList10* list, ID3D12Resource* input, uint64_t tick, uint32_t unit,
334 void RecordConduct(ID3D12GraphicsCommandList10* list, ID3D12Resource* input, uint64_t tick);
335 void RecordPhysics(ID3D12GraphicsCommandList10* list, ID3D12Resource* input, uint64_t tick);
338 D3D12_RESOURCE_STATES after)
const;
339 void RecordExtract(ID3D12GraphicsCommandList10* list, uint64_t tick, uint32_t target)
const;
343 void RecordReadbacks(ID3D12GraphicsCommandList10* list, uint32_t slot,
bool hasHash)
const;
361 [[nodiscard]] std::vector<StateRegion>
StateRegions(uint64_t tick)
const;
363 void RecordSave(ID3D12GraphicsCommandList10* list, uint32_t index, uint64_t tick);
364 void RecordRestore(ID3D12GraphicsCommandList10* list, uint32_t index);
375 ComPtr<ID3D12PipelineState>
419 std::array<FrameSlot, FRAME_SLOT_COUNT>
m_slots;
459 void Advance(uint64_t tick, std::span<const ProbeCommand> commands,
463 [[nodiscard]] std::span<const reaction::RxCell>
State(uint64_t tick)
const;
466 [[nodiscard]] std::span<const reaction::HcThermalCache>
Caches(uint64_t tick)
const;
500 std::span<const reaction::RxCell> cells);
504 std::span<const reaction::RxCell> cells);
507 [[nodiscard]] uint64_t
ProbeStateHash(std::span<const reaction::RxCell> cells);
510 [[nodiscard]] uint64_t
ProbeEnergySum(std::span<const reaction::RxCell> cells);
514 std::span<const reaction::RxCell> cells, std::span<const reaction::HcThermalCache> caches,
515 const std::array<uint32_t, PROBE_VIEW_SPECIES_COUNT>& viewSpecies);
std::vector< uint64_t > m_changedMarks
ProbeReference(const BakedReactionTable &table, std::span< const reaction::RxCell > initialWorld={})
uint64_t SourceEnergy() const
std::span< const uint8_t > BlockFlags() const
std::vector< uint8_t > m_blockFlags
std::span< const reaction::RxCell > State(uint64_t tick) const
uint32_t m_scheduledBlocks
std::vector< reaction::RxCell > m_cells
std::span< const uint64_t > ChangedMarks() const
const BakedReactionTable * m_table
std::vector< reaction::HcThermalCache > m_caches
std::span< const reaction::HcThermalCache > Caches(uint64_t tick) const
void Advance(uint64_t tick, std::span< const ProbeCommand > commands, const BakedReactionTable *newTable=nullptr)
uint32_t ScheduledBlocks() const
std::vector< uint8_t > m_scheduled
uint32_t WokenBlocks() const
void RecordReadbacks(ID3D12GraphicsCommandList10 *list, uint32_t slot, bool hasHash) const
uint32_t BusyUnitCount() const
ComPtr< ID3D12PipelineState > m_enqueuePipeline
bool CreateFrameSlots(ID3D12Device5 *device, D3D12_COMMAND_LIST_TYPE listType)
void BindRootViews(ID3D12GraphicsCommandList10 *list, ID3D12Resource *input) const
void RecordExtract(ID3D12GraphicsCommandList10 *list, uint64_t tick, uint32_t target) const
gpu::ReadbackRing m_events
void WriteInput(FrameSlot &frame, const ProbeFrameInput &input) const
std::expected< void, std::string > CreatePhysics(ID3D12Device5 *device)
ComPtr< ID3D12PipelineState > m_applyPipeline
void ResetCommandMirror()
std::array< ComPtr< ID3D12Resource >, 2 > m_activeLists
std::vector< StateRegion > StateRegions(uint64_t tick) const
std::array< ComPtr< ID3D12Resource >, PROBE_EXTRACTION_COUNT > m_extractions
uint32_t SavePointCount() const
bool ValidateCommands(const ProbeFrameInput &input) const
ComPtr< ID3D12PipelineState > m_hashCellsPipeline
bool CreateConductGraph(ID3D12Device5 *device)
ID3D12Resource * Extraction(uint32_t target) const
void RecordInitialization(ID3D12GraphicsCommandList10 *list)
void DiscardSavePointsAfter(uint64_t tick)
const gpu::GraphTraceFilter & TraceFilter() const
uint64_t SavePointBytes() const
ComPtr< ID3D12PipelineState > m_flushEventsPipeline
std::vector< SavePoint > m_savePoints
uint32_t m_queuedCommandCount
bool CreatePipelines(ID3D12Device5 *device)
void SetTraceFilter(const gpu::GraphTraceFilter &filter)
ComPtr< ID3D12Resource > m_busySink
const gpu::GraphStatsLayout & ConductStatsLayout() const
ComPtr< ID3D12PipelineState > m_refreshTablePipeline
bool CreateWorld(ID3D12Device5 *device, const BakedReactionTable &table, std::span< const reaction::RxCell > initialWorld)
gpu::DebugRing m_debugRing
ComPtr< ID3D12Resource > m_zeroQueueHeader
std::array< FrameSlot, FRAME_SLOT_COUNT > m_slots
std::array< ComPtr< ID3D12Resource >, 7 > m_initialUploads
uint32_t PhysicsUnitCount() const
void TrackCommands(std::span< const ProbeCommand > commands, uint64_t nextApplyTick)
ComPtr< ID3D12PipelineState > m_extractPipeline
gpu::GraphTrace m_graphTrace
std::vector< ProbeTickHash > ReadHashes(const FrameSlot &frame) const
bool ValidateInput(uint32_t slot, const ProbeFrameInput &input) const
ComPtr< ID3D12PipelineState > m_busyPipeline
std::unique_ptr< GpuPhysics > m_physics
void RecordPhysics(ID3D12GraphicsCommandList10 *list, ID3D12Resource *input, uint64_t tick)
ID3D12Resource * Cells() const
ComPtr< ID3D12RootSignature > m_rootSignature
void RecordSave(ID3D12GraphicsCommandList10 *list, uint32_t index, uint64_t tick)
std::vector< QueuedTick > m_queuedTicks
ComPtr< ID3D12Resource > m_hashes
uint32_t HashUnit() const
bool ValidateSavePoints(const ProbeFrameInput &input) const
bool ValidateTableSwap(const ProbeFrameInput &input) const
ComPtr< ID3D12Resource > m_blockSchedule
uint64_t ConductBackingMemoryBytes() const
ComPtr< ID3D12QueryHeap > m_timestamps
std::array< uint32_t, PROBE_VIEW_SPECIES_COUNT > m_viewSpecies
ProbeCommand m_lastEnqueued
ComPtr< ID3D12Resource > m_commandQueue
ProbeSim(const ProbeSimOptions &options, gpu::ReadbackRing &&events, gpu::DebugRing &&debugRing, gpu::WorkGraphStats &&graphStats, gpu::GraphTrace &&graphTrace)
void RecordExtractAndHook(ID3D12GraphicsCommandList10 *list, uint64_t tick, const ProbeFrameInput &input)
ComPtr< ID3D12Resource > m_tickEvents
gpu::WorkGraphStats m_graphStats
uint32_t m_conductEntrypoint
bool CreateBuffers(ID3D12Device5 *device)
void RecordActiveListStates(ID3D12GraphicsCommandList10 *list, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after) const
ComPtr< ID3D12PipelineState > m_wakeDuePipeline
bool RecordTableSwap(ID3D12GraphicsCommandList10 *list, FrameSlot &frame, const BakedReactionTable &table)
uint32_t UnitsPerTick() const
bool m_physicsInitialized
ProbeSimOptions m_options
std::array< ComPtr< ID3D12Resource >, 4 > m_reactionTable
static constexpr uint32_t MAX_UNITS_PER_FRAME
static std::expected< ProbeSim, std::string > Create(ID3D12Device5 *device, D3D12_COMMAND_LIST_TYPE listType, const BakedReactionTable &table, const ProbeSimOptions &options={})
uint64_t SavePointTick(uint32_t index) const
static uint64_t NextApplyTick(uint64_t tick, uint32_t unit)
const GpuPhysics * Physics() const
void RecordRestore(ID3D12GraphicsCommandList10 *list, uint32_t index)
void RecordConduct(ID3D12GraphicsCommandList10 *list, ID3D12Resource *input, uint64_t tick)
ComPtr< ID3D12Resource > m_cells
void RecordEnqueue(ID3D12GraphicsCommandList10 *list, uint32_t commandCount) const
std::unique_ptr< gpu::WorkGraph > m_conductGraph
void BindRootArguments(ID3D12GraphicsCommandList10 *list, ID3D12Resource *input) const
uint32_t FreeCommandSlots() const
ProbeFrameReadback ReadFrame(uint32_t slot)
static constexpr uint32_t FRAME_SLOT_COUNT
ComPtr< ID3D12Resource > m_thermal
void RecordUnit(ID3D12GraphicsCommandList10 *list, ID3D12Resource *input, uint64_t tick, uint32_t unit, bool tableSwapped)
bool CreateSavePoints(ID3D12Device5 *device, uint32_t count)
bool m_conductInitialized
ID3D12CommandList * RecordFrame(uint32_t slot, const ProbeFrameInput &input)
void RecordPhysicsInitialization(ID3D12GraphicsCommandList10 *list, ID3D12Resource *input)
constexpr uint32_t NO_SAVE_POINT
std::vector< uint64_t > ProbeInitialBlockWakes(const BakedReactionTable &table, std::span< const reaction::RxCell > cells)
std::vector< uint32_t > ProbeInitialScheduleWords(const BakedReactionTable &table, std::span< const reaction::RxCell > cells)
uint64_t ProbeStateHash(std::span< const reaction::RxCell > cells)
ProbeCommand MakeTableCommand(uint64_t targetTick, uint32_t sequence, uint64_t version)
std::array< uint32_t, PROBE_VIEW_SPECIES_COUNT > ProbeViewSpecies(const BakedReactionTable &table)
uint64_t TableCommandVersion(const ProbeCommand &command)
uint64_t ProbeExtractionHash(std::span< const uint32_t > words)
std::vector< uint32_t > MakeProbeExtractionCells(std::span< const reaction::RxCell > cells, std::span< const reaction::HcThermalCache > caches, const std::array< uint32_t, PROBE_VIEW_SPECIES_COUNT > &viewSpecies)
std::vector< reaction::RxCell > MakeProbeInitialWorld(const BakedReactionTable &table)
uint64_t ProbeEnergySum(std::span< const reaction::RxCell > cells)
ProbeCommand MakePokeCommand(uint64_t targetTick, uint32_t sequence, uint32_t x, uint32_t y, uint32_t z)
ProbeCommand MakePushCommand(uint64_t targetTick, uint32_t sequence, const std::array< int64_t, 3 > &origin, const std::array< int32_t, 3 > &direction, uint32_t impulseMillinewtonSeconds)
std::array< uint32_t, COMMAND_PAYLOAD_WORDS > payload
friend bool operator==(const ProbeEvent &, const ProbeEvent &)=default
std::vector< ProbeTickHash > hashes
gpu::GraphStatsSnapshot graphStats
std::vector< gpu::GraphTraceRecord > trace
std::vector< uint64_t > unitGpuTicks
uint32_t droppedEventCount
uint64_t gpuBeginTimestamp
uint32_t droppedTraceCount
uint32_t graphFindingCount
std::vector< ProbeEvent > events
uint32_t debugAssertCount
physics::PxParameters physicsParameters
const PhysicsScene * physicsScene
std::span< const reaction::RxCell > initialWorld
GpuPhysicsOptions physicsOptions
gpu::GraphTraceFilter trace
std::vector< ComPtr< ID3D12Resource > > keepAlive
ComPtr< ID3D12Resource > input
ComPtr< ID3D12CommandAllocator > allocator
ComPtr< ID3D12Resource > hashReadback
ComPtr< ID3D12GraphicsCommandList10 > list
ComPtr< ID3D12Resource > timestampReadback
std::vector< ComPtr< ID3D12Resource > > buffers
ID3D12Resource * resource
const BakedReactionTable * table
uint64_t WorldHash() const