--- nono/vm/renderer.h 2026/04/29 17:04:28 1.1 +++ nono/vm/renderer.h 2026/04/29 17:04:50 1.1.1.6 @@ -1,6 +1,9 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + // // レンダラ // @@ -13,7 +16,7 @@ class Renderer : public Device { - typedef Device inherited; + using inherited = Device; public: // wxWidgets のビットマップは R8_G8_B8 の3バイト。 static const int BPP = 3; @@ -21,13 +24,14 @@ class Renderer : public Device static const uint REQ_TERMINATE = 0x01; // スレッド終了指示 static const uint REQ_REND_POWEROFF = 0x02; // 電源オフ時の描画指示 static const uint REQ_REND_NORMAL = 0x04; // 通常の描画指示 + static const uint REQ_INVALIDATE = 0x08; // 全画面更新指示 public: Renderer(); - virtual ~Renderer(); + virtual ~Renderer() override; - virtual bool Init(); - virtual bool PowerOff(); + bool Init() override; + bool PowerOff() override; // バッファとコールバック関数を指定 // XXX 名前... @@ -36,6 +40,9 @@ class Renderer : public Device // 画面合成処理 (CRTC とかから呼ばれる) void Render(); + // 全画面無効化の指示 (パレット変更で呼ばれる) + void Invalidate(); + // 仮想画面幅(ピクセル)を取得 int GetWidth() const { return width; } @@ -55,22 +62,32 @@ class Renderer : public Device // LUNA でいう 1280 x 1024 のこと。 // 仮想画面幅(ピクセル) - int width = 0; + int width {}; // 仮想画面高さ(ピクセル) - int height = 0; + int height {}; // バッファ (実体は wx 側で用意) - uint8 *imagebuf = NULL; + uint8 *imagebuf {}; // リフレッシュを指示するためのコールバック (wx 側で用意) // ここから直接 wxWindow::Refresh() を呼べないため。 - void (*refresh_callback)(void) = NULL; + void (*refresh_callback)(void) {}; + + // 次の画面更新で全画面を無効化する場合は true + bool invalidate {}; // リクエストフラグ - uint32 request = 0; + uint32 request {}; std::mutex mtx {}; std::condition_variable cv {}; + + private: + pthread_t thread {}; + bool thread_created {}; // スレッドが作成されたら true + + // スレッドの終了を指示 + void Terminate(); }; // @@ -78,12 +95,12 @@ class Renderer : public Device // class X68030Renderer : public Renderer { - typedef Renderer inherited; + using inherited = Renderer; public: X68030Renderer(); - virtual ~X68030Renderer(); + virtual ~X68030Renderer() override; - virtual bool RenderMain(); + bool RenderMain() override; }; // @@ -91,12 +108,17 @@ class X68030Renderer : public Renderer // class LunaRenderer : public Renderer { - typedef Renderer inherited; + using inherited = Renderer; public: LunaRenderer(); - virtual ~LunaRenderer(); + virtual ~LunaRenderer() override; + + bool Init() override; + + bool RenderMain() override; - virtual bool RenderMain(); + private: + const uint8 *pal {}; }; -extern Renderer *gRenderer; +extern std::unique_ptr gRenderer;