Annotation of nono/vm/planevram.h, revision 1.1.1.5

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2022 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // プレーン VRAM (垂直 VRAM)
                      9: // Lunafb と X68k TVRAM の共通部分
                     10: //
                     11: 
                     12: #pragma once
                     13: 
                     14: #include "device.h"
1.1.1.5 ! root       15: #include "bitmap.h"
        !            16: #include <mutex>
1.1       root       17: #include <vector>
                     18: 
                     19: class PlaneVRAMDevice : public IODevice
                     20: {
                     21:        using inherited = IODevice;
                     22: 
1.1.1.5 ! root       23:        // 更新情報。
        !            24:        struct ModifyInfo
        !            25:        {
        !            26:                // 1ライン単位の更新フラグ。
        !            27:                // 仮想 Y 座標に対応するので Lunafb も TVRAM も 1024個。
        !            28:                std::vector<bool> line {};
        !            29: 
        !            30:                // パレットを更新した場合やスクロールした場合のように、
        !            31:                // composite に変更がなくても bitmap を更新する必要がある場合は true。
        !            32:                bool invalidate2 {};
        !            33:        };
        !            34: 
1.1       root       35:  public:
1.1.1.2   root       36:        PlaneVRAMDevice(int width_, int height_);
1.1.1.3   root       37:        ~PlaneVRAMDevice() override;
1.1       root       38: 
                     39:        void ResetHard(bool poweron) override;
                     40: 
                     41:        // レンダリング時に使うテーブルを事前に計算する。
                     42:        void InitDeptable();
                     43: 
                     44:        // プレーン数を取得
1.1.1.4   root       45:        uint GetPlaneCount() const { return nplane; }
1.1       root       46: 
1.1.1.5 ! root       47:        bool Snap();
1.1       root       48: 
                     49:        // 画面を合成する
1.1.1.5 ! root       50:        bool Render(BitmapRGBX& dst);
        !            51: 
        !            52:        // VRAM には更新がないが再レンダリングが必要。(パレット変更、スクロール等)
        !            53:        void Invalidate2();
1.1       root       54: 
                     55:        // 合成ビットマップを取得する
                     56:        const BitmapI8& GetComposite() const { return composite; }
                     57: 
1.1.1.2   root       58:        // 座標位置の情報を出力 (GUI 用)
                     59:        virtual void UpdateInfo(TextScreen&, int x, int y) const = 0;
1.1       root       60: 
                     61:  protected:
                     62:        // 全画面の更新フラグを立てる
                     63:        void Invalidate();
                     64: 
                     65:        // 垂直 VRAM から BitmapI8 バッファを作成する
1.1.1.5 ! root       66:        void RenderVRAMToComposite(const std::vector<bool>& modified);
1.1       root       67: 
1.1.1.3   root       68:        // BitmapI8 バッファから BitmapRGBX を作成する。
1.1.1.5 ! root       69:        void RenderCompositeToRGBX(BitmapRGBX& dst,
        !            70:                const ModifyInfo& modified);
1.1       root       71: 
1.1.1.2   root       72:        // X 方向にはみ出したときに対応する仮想画面の Y 座標を返す。
                     73:        virtual int GetWrapY(int) const = 0;
                     74: 
1.1       root       75:        // ビットマッププレーン。
                     76:        // メモリを確保する時のサイズ計算のため型を uint8 にしているが、
                     77:        // 運用はロングワードでホストバイトオーダー。
                     78:        // Lunafb では 1枚 256KBで 1 or 4枚。TVRAM では 512KB。
                     79:        std::unique_ptr<uint8[]> mem {};
                     80: 
                     81:        // プレーン数 (TVRAM なら 4 固定、LUNA は設定による)
1.1.1.4   root       82:        uint nplane {};
1.1       root       83: 
                     84:        // テキスト画面の合成ビットマップ
                     85:        BitmapI8 composite {};
                     86: 
1.1.1.5 ! root       87:        // VM スレッド内での仮想画面の更新フラグ。
        !            88:        ModifyInfo dirty {};
        !            89: 
        !            90:        // レンダラスレッドで未処理の行。
        !            91:        // VM スレッドからレンダラスレッドへの連絡用なので mtx で保護する。
        !            92:        ModifyInfo pending {};
        !            93:        std::mutex mtx {};
1.1       root       94: 
                     95:        // レンダリング時に使う変換テーブル
                     96:        std::unique_ptr<uint64[]> deptable {};
                     97: 
                     98:        // ホストパレット
1.1.1.4   root       99:        const Color *palette {};
1.1       root      100: 
                    101:        // スクロール
                    102:        int xscroll {};
                    103:        int yscroll {};
                    104: };
                    105: 
1.1.1.2   root      106: static inline PlaneVRAMDevice *GetPlaneVRAMDevice() {
                    107:        return Object::GetObject<PlaneVRAMDevice>(OBJ_PLANEVRAM);
                    108: }

unix.superglobalmegacorp.com

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