Bicameral Engine
GPU-resident engine for a magic-research open-world game
Loading...
Searching...
No Matches
frame_loop.h
Go to the documentation of this file.
1// frame_loop.h — 窓を開き、毎フレーム「コマンドを渡して投げて Present する」だけのループを回す(T-0004・T-0012、06 §4)。
2//
3// CPU は View と Controller(D-107): 窓の入力をコマンドにし、記録済みのリストを投げ、Present する。世界の状態には触れない。
4// - シミュは compute キュー、描画は direct キュー。キューの間の同期は GPU のフェンスだけ(Queue::GpuWait)。
5// - シミュは 1 フレームの予算ぶんの「単位」だけを投げ、その後ろに描画を投げる(ADR-0011)。刻みはフレームをまたいでよい。
6// 単位の数は SimScheduler が、読み戻した単位ごとの GPU 時間と描画の GPU 時間から決める(重いと世界が遅くなる。D-202)。
7// - 描画のリストは作るときに 1 度だけ記録して使い回す。シミュのリストはフレームの枠ごとに毎フレーム記録する(sim/probe_sim)。
8// - GPU → CPU は待たない読み戻し(イベント・刻みごとの状態のハッシュ・デバッグの出力・タイムスタンプ)。フェンスが進んでいた分だけ読む。
9// - 窓の操作はコマンド(適用する刻みつき)になり、GPU のコマンドキューで自分の刻みまで待つ(06 §3)。
10// --record でコマンドの列と刻みごとのハッシュを再生ファイルに書き、--replay でそれを流して同じハッシュ列になるかを確かめる(15 §2)。
11// 窓の入力は render/debug_view_controller がカメラ・表示の切り替え・つつくセル・トレースの依頼(T)に振り分ける(T-0015・T-0088)。
12// カメラとトレースは世界に入らない。
13// 今の世界は仮のもの(sim/probe_sim。クリックした所が熱くなって広がる)。中身は T-0005 以降で本物に。
14#pragma once
15
16#include <cstdint>
17#include <filesystem>
18#include <optional>
19
20#include "core/aliases.h"
21#include "gpu/device.h"
22#include "gpu/graph_trace.h"
24
25namespace bicameral::frame {
26
27 // 連鎖のトレースの容量(1 フレームに GPU が書ける記録。1 MiB)。範囲を実行中に変えるので、いつも確保しておく(T-0088)
28 inline constexpr uint32_t TRACE_CAPACITY_PER_FRAME = 1u << 16;
29
30 // FrameLoopOptions::savePoints の既定(--editor なら DEFAULT_EDITOR_SAVE_POINTS、でなければ 0)
31 inline constexpr uint32_t AUTO_SAVE_POINTS = UINT32_MAX;
32 inline constexpr uint32_t DEFAULT_EDITOR_SAVE_POINTS = 6;
33 inline constexpr uint32_t MAX_SAVE_POINTS = 64;
34
36 // --- フレームの進め方 ---
37 uint32_t frameLimit = 0; // 0 なら窓を閉じるまで。自動の確認(job.py run)では有限にする
38 bool vsync = true; // false なら待たずに Present(対応していれば tearing)
39 uint32_t maxFrameLatency = 2; // CPU が GPU より先に進めるフレームの数(2〜3)
40 uint32_t targetFps = 60; // 重いときに描画が保つ fps(ADR-0011。30 以上)
41 bool renderHighPriority = true; // 描画のキューの優先度を HIGH にする
42
43 // --- 重さの試験(R-LOOP-2)---
44 uint32_t simLoad = 0; // 1 刻みに足す繰り返し(0 なら無し)
45 uint32_t simSplit = 1; // 何個の単位に分けるか
46
47 // --- 入力・記録・再生 ---
48 bool autoClick = false; // 自動でクリックを入れる(人がいない自動の確認でイベントの流れを通す)
49 bool autoPush = false; // 決まったフレームで積み木を押す(人がいない確認で押すコマンドの流れを通す。T-0098)
50 // 最初のフレームに 1 回だけ木箱の壁に火をつける。最初に投げる刻み(0)に載るので、どの実行でも世界が同じ(T-0025)
51 bool autoIgnite = false;
52 fs::path recordPath; // 空でなければ、終わるときに再生ファイルを書く
53 fs::path replayPath; // 空でなければ、この再生ファイルのコマンドで進めてハッシュを突き合わせる
54 fs::path screenshotPath; // 空でなければ、最後のフレーム(frameLimit)か screenshotTick の画面を BMP に書く
55 // あれば、その刻みの始めで世界を止め、S(その刻み) を描いたフレームを写して終える(決まった画面。画像の比較。T-0025)。
56 // frameLimit はそこまでの上限になる(届かなければ失敗)
57 std::optional<uint64_t> screenshotTick;
58
59 // --- 連鎖のトレース(T-0087・T-0088。frame/trace_capture.h)---
60 // 空でなければ、起動時から trace の範囲を集め、範囲の刻みが終わったら(終わりが無ければ終わるときに)刻みごとの木にして書く
61 fs::path tracePath;
63 trace; // その範囲(場所の箱はブロックの座標。main が --trace-ticks・--trace-cells から作る)
64 fs::path traceDirectory; // 窓の T で集めたトレースを書くフォルダ(main の既定は exe の横の traces/)
65 bool autoTrace = false; // 決まったフレームで T を押す(人がいない確認で T の流れを通す)
66
67 // --- 覗き窓(T-0096)---
68 bool peek = false; // 起動時から peekCell を覗く(窓では P)
69 render::CellCoordinate peekCell; // 覗く世界のセル
70 uint32_t peekDepth = 0; // 潜る段(カメラが寄る。0〜9)
71
72 // --- 物理(T-0098)---
73 bool physics = true; // 仮の世界に積み木(sim::MakeProbeStackScene)を入れる。Shift + 左クリックで押す
74 // CPU の物理(sim::PhysicsWorld)を並べて走らせ、刻みごとの物のハッシュを突き合わせる(--check-physics。調べる用)
75 bool checkPhysics = false;
76 bool physicsComputeBroadphase = false; // 広域の選別を Compute で(--physics-compute。比べる用)
77
78 // --- エディタ(T-0023。editor/)---
79 bool editor = false; // 窓に ImGui のパネル(時間の操作・状態の表示)を重ねる(--editor)
80 bool autoTime =
81 false; // 決まったフレームで止める・1 刻み・速さを操作し、止まったか・1 刻みずつ進んだかを確かめる(--auto-time)
82
83 bool
84 autoLab = false; // 実験室で木を置いて火を付け、GPU と CPU の一致と記録の再生を確かめる(--auto-lab。T-0142)
85
86 // --- 巻き戻し(保存点 + 再生。T-0143・ADR-0036)---
87 uint32_t savePoints = AUTO_SAVE_POINTS; // 保存点の数(VRAM に 1 つ約 33 MiB。0 なら巻き戻さない)
88 uint64_t saveIntervalTicks = 120; // 何刻みごとに写すか(その倍数の刻みの境界で写す)
89 bool autoRewind = false; // 保存点が 2 つできたら古い方へ 1 回戻す(人がいない確認。--auto-rewind)
90
91 // --- 世界のデータ(T-0157・ADR-0033)---
92 // 反応表のパッケージのフォルダ(直下のフォルダが 1 つずつパッケージ)。空なら exe の横の data/packages(--packages)
93 fs::path packageRoot;
94
95 // --- 表示と GPU ---
96 render::DebugViewSettings view; // 最初のデバッグ表示(T-0015)
97 render::OrbitCameraState camera; // 最初のカメラ
99 };
100
101 // 終了コード: 0 = 正常、1 = 失敗(作れない・デバイスの喪失・debug layer のエラー・再生のハッシュの不一致・記録を書けない)
102 int RunFrameLoop(const FrameLoopOptions& options);
103
104} // namespace bicameral::frame
constexpr uint32_t DEFAULT_EDITOR_SAVE_POINTS
Definition frame_loop.h:32
constexpr uint32_t MAX_SAVE_POINTS
Definition frame_loop.h:33
constexpr uint32_t TRACE_CAPACITY_PER_FRAME
Definition frame_loop.h:28
constexpr uint32_t AUTO_SAVE_POINTS
Definition frame_loop.h:31
int RunFrameLoop(const FrameLoopOptions &options)
render::CellCoordinate peekCell
Definition frame_loop.h:69
std::optional< uint64_t > screenshotTick
Definition frame_loop.h:57
render::OrbitCameraState camera
Definition frame_loop.h:97
render::DebugViewSettings view
Definition frame_loop.h:96
gpu::GraphTraceFilter trace
Definition frame_loop.h:63