--- nono/vm/renderer.h 2026/04/29 17:05:29 1.1.1.11 +++ nono/vm/renderer.h 2026/04/29 17:05:33 1.1.1.12 @@ -13,43 +13,15 @@ #include "thread.h" #include "bitmap.h" #include "fixedqueue.h" -#include "monitor.h" -#include "spscqueue.h" #include #include +class ConsoleDevice; class PlaneVRAMDevice; class Scheduler; class Syncer; class VideoCtlrDevice; -// 更新情報交換用構造体 -struct ModifyInfo -{ - // 1ライン単位の更新フラグ。 - std::array bits {}; - - // 更新フラグの立っているライン数を返す。 - uint GetDirtyCount() const { - uint count = 0; - for (auto v : bits) { - if (v) { - count++; - } - } - return count; - } - - // bits がいずれかでも立っていれば true。 - bool dirty {}; - bool IsClean() const { return !dirty; } - bool IsDirty() const { return dirty; } - - // パレットを変更した場合とスクロールした場合のように - // composite の変更によらず bitmap を更新する場合は true。 - bool invalidate2 {}; -}; - class Renderer : public ThreadDevice { using inherited = ThreadDevice; @@ -81,9 +53,6 @@ class Renderer : public ThreadDevice // 画面合成処理の指示 (CRTC/CRTC2 から呼ばれる) void NotifyRender(); - // 全画面更新の指示 (パレット変更とスクロール座標変更で呼ばれる) - void Invalidate2(); - // 表示画面サイズを設定 (GUI から呼ばれる) void ResizeView(uint width_, uint height_); @@ -97,21 +66,12 @@ class Renderer : public ThreadDevice void SetRefreshInterval(uint64 t); protected: - // モニタを初期化する - void InitMonitor(); - // レンダリングスレッド void ThreadRun() override; // 描画する。 int64 DoRender(uint32 req); - // 更新チェック。(派生クラス側で用意) - virtual bool GetModifyMD(ModifyInfo *dst) const = 0; - - // 更新情報をクリア。(派生クラス側で用意) - virtual void ClearDirtyMD() = 0; - // 画面合成。更新があれば true を返す。(派生クラス側で用意) virtual bool RenderMD() = 0; @@ -149,32 +109,18 @@ class Renderer : public ThreadDevice // レンダラ有効フラグ (GUI なら true) bool enable {}; - // ステージ2 の全画面更新指示フラグ - bool invalidate2 {}; - // 初期化やリサイズ後に一度でも bitmap24 を更新すれば true。 bool bitmap24_valid {}; - // 更新情報を VM -> Renderer スレッドに渡すための 1 要素キュー - SPSCQueue modq {}; - - // レンダラスレッドで受け取った更新情報 (モニタ表示のため) - ModifyInfo modify {}; - // 画面更新を UI に通知する間隔 uint64 refresh_interval {}; // 次回更新を通知する実時刻 uint64 next_refresh_rtime {}; // 統計情報 - uint32 last_mod_lines {}; // 直近の更新ライン数 - uint64 total_invalidate2 {}; // ステージ2の全画面更新回数 - uint64 stat_input_count {}; // 入力通知回数 uint64 last_input_time {}; // 前回の入力通知 VM 時刻 FixedQueue ma_input_span {}; // 入力通知間隔 - uint64 stat_enqueue_count {}; // リクエストキューに入れた回数 - uint64 stat_enqueue_full {}; // キューに入れられなかった回数 uint64 stat_render_count {}; // RenderMD() の実行回数 uint64 stat_noupdate_count {}; // bitmap24 への更新が不要だった回数 uint64 stat_nobitmap_count {}; // bitmap24 が用意できてなかった回数 @@ -185,7 +131,7 @@ class Renderer : public ThreadDevice Scheduler *scheduler {}; Syncer *syncer {}; - Monitor monitor { this }; + Monitor *monitor {}; private: // スレッドの終了を指示 @@ -203,12 +149,9 @@ class X68030Renderer : public Renderer ~X68030Renderer() override; bool Init() override; - bool GetModifyMD(ModifyInfo *) const override; - void ClearDirtyMD() override; bool RenderMD() override; private: - PlaneVRAMDevice *planevram {}; VideoCtlrDevice *videoctlr {}; }; @@ -223,8 +166,6 @@ class LunaRenderer : public Renderer ~LunaRenderer() override; bool Init() override; - bool GetModifyMD(ModifyInfo *) const override; - void ClearDirtyMD() override; bool RenderMD() override; private: @@ -232,18 +173,25 @@ class LunaRenderer : public Renderer }; // -// 何もしないレンダラ +// コンソールレンダラ // -class NopRenderer : public Renderer +class ConsoleRenderer : public Renderer { using inherited = Renderer; + public: - NopRenderer(); - ~NopRenderer() override; + // フチ [pixel] + static const uint Padding = 3; - bool GetModifyMD(ModifyInfo *) const override; - void ClearDirtyMD() override; + public: + ConsoleRenderer(); + ~ConsoleRenderer() override; + + bool Init() override; bool RenderMD() override; + + private: + ConsoleDevice *console {}; }; static inline Renderer *GetRenderer() {