|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
1.1 root 7: //
8: // レンダラ
9: //
10:
11: #pragma once
12:
1.1.1.7 root 13: #include "thread.h"
14: #include "bitmap.h"
1.1.1.11 root 15: #include "fixedqueue.h"
1.1 root 16: #include <condition_variable>
17: #include <mutex>
18:
1.1.1.12 root 19: class ConsoleDevice;
1.1.1.9 root 20: class PlaneVRAMDevice;
1.1.1.11 root 21: class Scheduler;
1.1.1.9 root 22: class Syncer;
1.1.1.10 root 23: class VideoCtlrDevice;
1.1.1.7 root 24:
25: class Renderer : public ThreadDevice
26: {
27: using inherited = ThreadDevice;
28: public:
1.1 root 29: static const uint REQ_TERMINATE = 0x01; // スレッド終了指示
1.1.1.11 root 30: static const uint REQ_SCREENOFF = 0x02; // 電源オフ時の描画指示
31: static const uint REQ_RENDER = 0x04; // 通常の描画指示
32: static const uint REQ_RESIZE = 0x08; // リサイズ指示
33: static const uint REQ_POST = 0x10; // UI への通知指示
1.1.1.7 root 34:
1.1 root 35: public:
36: Renderer();
1.1.1.10 root 37: ~Renderer() override;
1.1 root 38:
1.1.1.9 root 39: bool Init() override;
1.1.1.7 root 40: void ResetHard(bool poweron) override;
41: void PowerOff() override;
1.1 root 42:
1.1.1.11 root 43: // 出力ビットマップが有効なら取得。
44: // (wxImage に渡すため const なし)
45: BitmapRGB *GetBitmap() {
46: if (__predict_true(bitmap24_valid)) {
47: return bitmap24.get();
48: } else {
49: return NULL;
50: }
51: }
1.1.1.7 root 52:
1.1.1.11 root 53: // 画面合成処理の指示 (CRTC/CRTC2 から呼ばれる)
54: void NotifyRender();
1.1 root 55:
1.1.1.11 root 56: // 表示画面サイズを設定 (GUI から呼ばれる)
57: void ResizeView(uint width_, uint height_);
58:
1.1 root 59: // 仮想画面幅(ピクセル)を取得
1.1.1.11 root 60: uint GetWidth() const { return width; }
1.1 root 61:
62: // 仮想画面高さ(ピクセル)を取得
1.1.1.11 root 63: uint GetHeight() const { return height; }
1.1 root 64:
1.1.1.7 root 65: // 描画更新(通知)間隔を設定 (GUI から呼ばれる)
66: void SetRefreshInterval(uint64 t);
1.1 root 67:
68: protected:
1.1.1.7 root 69: // レンダリングスレッド
70: void ThreadRun() override;
71:
1.1.1.11 root 72: // 描画する。
73: int64 DoRender(uint32 req);
74:
75: // 画面合成。更新があれば true を返す。(派生クラス側で用意)
76: virtual bool RenderMD() = 0;
1.1.1.10 root 77:
1.1.1.7 root 78: DECLARE_MONITOR_CALLBACK(MonitorUpdate);
79:
1.1 root 80: // ウィンドウとして表示される画面はオプションや設定などで縮尺を変える
81: // ことが出来るが (こっちを実画面とする)、ここで扱う仮想画面とはそれに
82: // 関わらず常にその機種の最大描画面積を指す。
83: // LUNA でいう 1280 x 1024 のこと。
84:
85: // 仮想画面幅(ピクセル)
1.1.1.11 root 86: uint width {};
1.1 root 87:
88: // 仮想画面高さ(ピクセル)
1.1.1.11 root 89: uint height {};
1.1 root 90:
1.1.1.7 root 91: // レンダリング結果のビットマップ
1.1.1.11 root 92: BitmapRGBX bitmap {};
1.1 root 93:
1.1.1.11 root 94: // wxWidgets 用表示ビットマップ
95: std::unique_ptr<BitmapRGB> bitmap24 /*{}*/;
96:
97: // 表示ビットマップの大きさ
98: Rect viewrect {};
1.1.1.6 root 99:
1.1 root 100: // リクエストフラグ
1.1.1.4 root 101: uint32 request {};
1.1 root 102: std::mutex mtx {};
103: std::condition_variable cv {};
1.1.1.2 root 104:
1.1.1.11 root 105: // リサイズ時の要求サイズ
106: uint new_viewwidth {};
107: uint new_viewheight {};
108:
109: // レンダラ有効フラグ (GUI なら true)
1.1.1.7 root 110: bool enable {};
111:
1.1.1.11 root 112: // 初期化やリサイズ後に一度でも bitmap24 を更新すれば true。
113: bool bitmap24_valid {};
114:
1.1.1.7 root 115: // 画面更新を UI に通知する間隔
116: uint64 refresh_interval {};
117: // 次回更新を通知する実時刻
118: uint64 next_refresh_rtime {};
119:
120: // 統計情報
1.1.1.11 root 121: uint64 stat_input_count {}; // 入力通知回数
122: uint64 last_input_time {}; // 前回の入力通知 VM 時刻
123: FixedQueue<uint64, 4> ma_input_span {}; // 入力通知間隔
124: uint64 stat_render_count {}; // RenderMD() の実行回数
125: uint64 stat_noupdate_count {}; // bitmap24 への更新が不要だった回数
126: uint64 stat_nobitmap_count {}; // bitmap24 が用意できてなかった回数
127: uint64 stat_output_count {}; // UI への出力通知回数
128: uint64 last_output_time {}; // 前回の出力通知 RT 時刻
129: FixedQueue<uint64, 4> ma_output_span {}; // 出力通知間隔
130:
1.1.1.9 root 131: Syncer *syncer {};
1.1.1.7 root 132:
1.1.1.12 root 133: Monitor *monitor {};
1.1.1.7 root 134:
135: private:
1.1.1.2 root 136: // スレッドの終了を指示
1.1.1.7 root 137: void Terminate() override;
1.1 root 138: };
139:
140: //
141: // X68030 レンダラ
142: //
143: class X68030Renderer : public Renderer
144: {
1.1.1.3 root 145: using inherited = Renderer;
1.1 root 146: public:
147: X68030Renderer();
1.1.1.10 root 148: ~X68030Renderer() override;
1.1 root 149:
1.1.1.10 root 150: bool Init() override;
1.1.1.11 root 151: bool RenderMD() override;
1.1.1.10 root 152:
153: private:
154: VideoCtlrDevice *videoctlr {};
1.1 root 155: };
156:
157: //
158: // LUNA レンダラ
159: //
160: class LunaRenderer : public Renderer
161: {
1.1.1.3 root 162: using inherited = Renderer;
1.1 root 163: public:
164: LunaRenderer();
1.1.1.10 root 165: ~LunaRenderer() override;
1.1 root 166:
1.1.1.10 root 167: bool Init() override;
1.1.1.11 root 168: bool RenderMD() override;
1.1.1.10 root 169:
170: private:
1.1.1.11 root 171: PlaneVRAMDevice *planevram {};
1.1 root 172: };
173:
1.1.1.9 root 174: //
1.1.1.12 root 175: // コンソールレンダラ
1.1.1.9 root 176: //
1.1.1.12 root 177: class ConsoleRenderer : public Renderer
1.1.1.9 root 178: {
179: using inherited = Renderer;
1.1.1.12 root 180:
1.1.1.9 root 181: public:
1.1.1.12 root 182: // フチ [pixel]
183: static const uint Padding = 3;
1.1.1.9 root 184:
1.1.1.12 root 185: public:
186: ConsoleRenderer();
187: ~ConsoleRenderer() override;
188:
189: bool Init() override;
1.1.1.11 root 190: bool RenderMD() override;
1.1.1.12 root 191:
192: private:
193: ConsoleDevice *console {};
1.1.1.9 root 194: };
195:
196: static inline Renderer *GetRenderer() {
197: return Object::GetObject<Renderer>(OBJ_RENDERER);
198: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.