Annotation of nono/vm/renderer.h, revision 1.1.1.13

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.