22 constexpr uint64_t
CELL_BYTES = uint64_t{PROBE_CELL_COUNT} *
sizeof(reaction::RxCell);
23 constexpr uint64_t
THERMAL_BYTES = uint64_t{PROBE_CELL_COUNT} *
sizeof(reaction::HcThermalCache);
26 std::span<ID3D12Resource* const> resources, D3D12_RESOURCE_STATES before,
27 D3D12_RESOURCE_STATES after) {
28 for (ID3D12Resource* resource : resources)
33 void RecordAround(ID3D12GraphicsCommandList10* list, std::span<ID3D12Resource* const> sources,
34 std::span<ID3D12Resource* const> destinations,
bool after) {
35 constexpr D3D12_RESOURCE_STATES COMMON = D3D12_RESOURCE_STATE_COMMON;
36 constexpr D3D12_RESOURCE_STATES SOURCE = D3D12_RESOURCE_STATE_COPY_SOURCE;
37 constexpr D3D12_RESOURCE_STATES DESTINATION = D3D12_RESOURCE_STATE_COPY_DEST;
39 std::vector<D3D12_RESOURCE_BARRIER> barriers;
40 barriers.reserve(sources.size() + destinations.size());
41 AppendTransitions(barriers, sources, after ? SOURCE : COMMON, after ? COMMON : SOURCE);
42 AppendTransitions(barriers, destinations, after ? DESTINATION : COMMON, after ? COMMON : DESTINATION);
43 list->ResourceBarrier(
static_cast<UINT
>(barriers.size()), barriers.data());
62 const std::vector<StateRegion> regions =
StateRegions(0);
64 for (uint32_t index = 0; index < count; ++index) {
75 buffer->SetName(std::format(L
"ProbeSim.savePoint{}.{}", index, savePoint.
buffers.size()).c_str());
76 savePoint.
buffers.push_back(std::move(buffer));
86 bytes += region.bytes;
93 const uint64_t generation = tick & 1;
94 std::vector<StateRegion> regions = {
96 .offset = generation * CELL_BYTES,
98 .generationBytes = CELL_BYTES},
100 .offset = generation * THERMAL_BYTES,
101 .bytes = THERMAL_BYTES,
102 .generationBytes = THERMAL_BYTES},
104 {.resource =
m_activeLists[0].Get(), .bytes = PROBE_ACTIVE_LIST_BYTES},
105 {.resource =
m_activeLists[1].Get(), .bytes = PROBE_ACTIVE_LIST_BYTES},
106 {.resource =
m_hashes.Get(), .bytes = PROBE_HASH_BYTES},
107 {.resource =
m_tickEvents.Get(), .bytes = PROBE_TICK_EVENT_BYTES},
111 for (
const ComPtr<ID3D12Resource>& buffer :
m_physics->StateBuffers())
112 regions.push_back({.resource = buffer.Get(), .bytes = buffer->GetDesc().Width});
123 if (!saving && !restoring)
131 "保存点の使い方が不正: 写す {} 戻す {} 刻み {} 単位 {}(保存点の数 {}、初期化 {})",
132 saving ?
static_cast<int64_t
>(input.
saveTo) : -1,
144 const std::vector<StateRegion> regions =
StateRegions(tick);
145 std::vector<ID3D12Resource*> sources;
146 std::vector<ID3D12Resource*> destinations;
147 for (
size_t region = 0; region < regions.size(); ++region) {
148 sources.push_back(regions[region].resource);
149 destinations.push_back(savePoint.
buffers[region].Get());
152 RecordAround(list, sources, destinations,
false);
153 for (
size_t region = 0; region < regions.size(); ++region) {
154 list->CopyBufferRegion(destinations[region], 0, regions[region].resource, regions[region].offset,
155 regions[region].bytes);
158 RecordAround(list, sources, destinations,
true);
160 savePoint.
tick = tick;
168 std::vector<ID3D12Resource*> destinations = {
m_commandQueue.Get()};
169 for (
size_t region = 0; region < regions.size(); ++region) {
170 sources.push_back(savePoint.
buffers[region].Get());
171 destinations.push_back(regions[region].resource);
174 RecordAround(list, sources, destinations,
false);
175 for (
size_t region = 0; region < regions.size(); ++region) {
177 ID3D12Resource* saved = savePoint.
buffers[region].Get();
179 list->CopyBufferRegion(state.
resource, 0, saved, 0, state.
bytes);
184 for (uint64_t generation = 0; generation < 2; ++generation)
190 RecordAround(list, sources, destinations,
true);
void ResetCommandMirror()
std::array< ComPtr< ID3D12Resource >, 2 > m_activeLists
std::vector< StateRegion > StateRegions(uint64_t tick) const
uint64_t SavePointBytes() const
std::vector< SavePoint > m_savePoints
uint32_t m_queuedCommandCount
ComPtr< ID3D12Resource > m_zeroQueueHeader
std::unique_ptr< GpuPhysics > m_physics
void RecordSave(ID3D12GraphicsCommandList10 *list, uint32_t index, uint64_t tick)
std::vector< QueuedTick > m_queuedTicks
ComPtr< ID3D12Resource > m_hashes
bool ValidateSavePoints(const ProbeFrameInput &input) const
ComPtr< ID3D12Resource > m_blockSchedule
ComPtr< ID3D12Resource > m_commandQueue
ComPtr< ID3D12Resource > m_tickEvents
void RecordRestore(ID3D12GraphicsCommandList10 *list, uint32_t index)
ComPtr< ID3D12Resource > m_cells
ComPtr< ID3D12Resource > m_thermal
bool CreateSavePoints(ID3D12Device5 *device, uint32_t count)
D3D12_RESOURCE_BARRIER Transition(ID3D12Resource *resource, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after)
ComPtr< ID3D12Resource > CreateBuffer(ID3D12Device *device, uint64_t sizeBytes, BufferKind kind)
void RecordAround(ID3D12GraphicsCommandList10 *list, std::span< ID3D12Resource *const > sources, std::span< ID3D12Resource *const > destinations, bool after)
void AppendTransitions(std::vector< D3D12_RESOURCE_BARRIER > &barriers, std::span< ID3D12Resource *const > resources, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after)
constexpr uint64_t THERMAL_BYTES
constexpr uint64_t CELL_BYTES
constexpr uint32_t NO_SAVE_POINT
void Log(Channel channel, Level level, FormatWithLocation< std::type_identity_t< Args >... > pattern, Args &&... args)
std::vector< ComPtr< ID3D12Resource > > buffers
ID3D12Resource * resource