--- nono/vm/renderer.h 2026/04/29 17:05:10 1.1.1.7 +++ nono/vm/renderer.h 2026/04/29 17:05:25 1.1.1.10 @@ -10,9 +10,6 @@ #pragma once -// ブロックのヒット効率(?)を測定 -#define PERF_HIT - #include "thread.h" #include "bitmap.h" #include "monitor.h" @@ -21,25 +18,21 @@ #include #include -#if defined(PERF_HIT) -#include "fixedqueue.h" -#endif +class PlaneVRAMDevice; +class Syncer; +class VideoCtlrDevice; // 更新情報交換用構造体 struct ModifyInfo { - std::array bits {}; + std::array bits {}; uint32 n_dirty {}; -#if defined(PERF_HIT) - // 65536 = (2048px / 32bit) * 1024px - std::array dirty_word {}; -#endif // パレットを変更した場合とスクロールした場合のように // composite に変更によらず bitmap を更新する場合は true。 bool invalidate2 {}; - void Fill(uint16 v) { + void Fill(uint8 v) { std::fill(bits.begin(), bits.end(), v); if (v) { n_dirty = bits.size(); @@ -60,13 +53,11 @@ class Renderer : public ThreadDevice static const uint REQ_REND_POWEROFF = 0x02; // 電源オフ時の描画指示 static const uint REQ_REND_NORMAL = 0x04; // 通常の描画指示 - static const int BLKX = 128; // 1ブロックの幅 [pixel] - static const int BLKY = 16; // 1ブロックの高さ [pixel] - public: Renderer(); - virtual ~Renderer() override; + ~Renderer() override; + bool Init() override; void ResetHard(bool poweron) override; void PowerOff() override; @@ -98,6 +89,9 @@ class Renderer : public ThreadDevice // 画面合成。更新があれば true を返す。(派生クラス側で用意) virtual bool RenderMain() = 0; + // RGBX から RGB への変換。 + void RGBXtoRGB(BitmapRGB& dst, const BitmapRGBX& src); + DECLARE_MONITOR_CALLBACK(MonitorUpdate); // ウィンドウとして表示される画面はオプションや設定などで縮尺を変える @@ -146,17 +140,20 @@ class Renderer : public ThreadDevice uint64 total_mod_blocks {}; // 総更新ブロック数 uint64 total_invalidate2 {}; // ステージ2の全画面更新回数 -#if defined(PERF_HIT) - FixedQueue hitrate_ma {}; - uint64 hitrate_total_word {}; - uint64 hitrate_total_block {}; -#endif + PlaneVRAMDevice *planevram {}; + Syncer *syncer {}; Monitor monitor { this }; private: // スレッドの終了を指示 void Terminate() override; + + static void RGBXtoRGB_gen(BitmapRGB& dst, const BitmapRGBX& src); +#if defined(HAVE_AVX2) + static void RGBXtoRGB_avx2(BitmapRGB& dst, const BitmapRGBX& src); + bool enable_avx2 {}; +#endif }; // @@ -167,9 +164,15 @@ class X68030Renderer : public Renderer using inherited = Renderer; public: X68030Renderer(); - virtual ~X68030Renderer() override; + ~X68030Renderer() override; + bool Init() override; bool RenderMain() override; + + private: + BitmapRGBX bitmap32 {}; + + VideoCtlrDevice *videoctlr {}; }; // @@ -180,12 +183,28 @@ class LunaRenderer : public Renderer using inherited = Renderer; public: LunaRenderer(); - virtual ~LunaRenderer() override; + ~LunaRenderer() override; - // 合成ビットマップを取得 - const BitmapI8& GetComposite() const; + bool Init() override; + bool RenderMain() override; + + private: + BitmapRGBX textbmp {}; +}; + +// +// 何もしないレンダラ +// +class NopRenderer : public Renderer +{ + using inherited = Renderer; + public: + NopRenderer(); + ~NopRenderer() override; bool RenderMain() override; }; -extern Renderer *gRenderer; +static inline Renderer *GetRenderer() { + return Object::GetObject(OBJ_RENDERER); +}