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

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"
1.1.1.7   root       16: #include <bitset>
1.1.1.5   root       17: #include <mutex>
1.1       root       18: 
                     19: class PlaneVRAMDevice : public IODevice
                     20: {
                     21:        using inherited = IODevice;
                     22: 
1.1.1.7   root       23:        using bitset1024 = std::bitset<1024>;
                     24: 
1.1.1.5   root       25:        // 更新情報。
                     26:        struct ModifyInfo
                     27:        {
                     28:                // 1ライン単位の更新フラグ。
                     29:                // 仮想 Y 座標に対応するので Lunafb も TVRAM も 1024個。
1.1.1.7   root       30:                bitset1024 line {};
1.1.1.5   root       31: 
                     32:                // パレットを更新した場合やスクロールした場合のように、
                     33:                // composite に変更がなくても bitmap を更新する必要がある場合は true。
                     34:                bool invalidate2 {};
                     35:        };
                     36: 
1.1       root       37:  public:
1.1.1.2   root       38:        PlaneVRAMDevice(int width_, int height_);
1.1.1.3   root       39:        ~PlaneVRAMDevice() override;
1.1       root       40: 
1.1.1.6   root       41:        bool Init() override;
1.1       root       42:        void ResetHard(bool poweron) override;
                     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.7   root       66:        void RenderVRAMToComposite(const bitset1024& 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.8 ! root      106: inline PlaneVRAMDevice *GetPlaneVRAMDevice() {
1.1.1.2   root      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.