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

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: 
1.1.1.6 ! root       39:        bool Init() override;
1.1       root       40:        void ResetHard(bool poweron) override;
                     41: 
                     42:        // プレーン数を取得
1.1.1.4   root       43:        uint GetPlaneCount() const { return nplane; }
1.1       root       44: 
1.1.1.5   root       45:        bool Snap();
1.1       root       46: 
                     47:        // 画面を合成する
1.1.1.5   root       48:        bool Render(BitmapRGBX& dst);
                     49: 
                     50:        // VRAM には更新がないが再レンダリングが必要。(パレット変更、スクロール等)
                     51:        void Invalidate2();
1.1       root       52: 
                     53:        // 合成ビットマップを取得する
                     54:        const BitmapI8& GetComposite() const { return composite; }
                     55: 
1.1.1.2   root       56:        // 座標位置の情報を出力 (GUI 用)
                     57:        virtual void UpdateInfo(TextScreen&, int x, int y) const = 0;
1.1       root       58: 
                     59:  protected:
                     60:        // 全画面の更新フラグを立てる
                     61:        void Invalidate();
                     62: 
                     63:        // 垂直 VRAM から BitmapI8 バッファを作成する
1.1.1.5   root       64:        void RenderVRAMToComposite(const std::vector<bool>& modified);
1.1       root       65: 
1.1.1.3   root       66:        // BitmapI8 バッファから BitmapRGBX を作成する。
1.1.1.5   root       67:        void RenderCompositeToRGBX(BitmapRGBX& dst,
                     68:                const ModifyInfo& modified);
1.1       root       69: 
1.1.1.2   root       70:        // X 方向にはみ出したときに対応する仮想画面の Y 座標を返す。
                     71:        virtual int GetWrapY(int) const = 0;
                     72: 
1.1       root       73:        // ビットマッププレーン。
                     74:        // メモリを確保する時のサイズ計算のため型を uint8 にしているが、
                     75:        // 運用はロングワードでホストバイトオーダー。
                     76:        // Lunafb では 1枚 256KBで 1 or 4枚。TVRAM では 512KB。
                     77:        std::unique_ptr<uint8[]> mem {};
                     78: 
                     79:        // プレーン数 (TVRAM なら 4 固定、LUNA は設定による)
1.1.1.4   root       80:        uint nplane {};
1.1       root       81: 
                     82:        // テキスト画面の合成ビットマップ
                     83:        BitmapI8 composite {};
                     84: 
1.1.1.5   root       85:        // VM スレッド内での仮想画面の更新フラグ。
                     86:        ModifyInfo dirty {};
                     87: 
                     88:        // レンダラスレッドで未処理の行。
                     89:        // VM スレッドからレンダラスレッドへの連絡用なので mtx で保護する。
                     90:        ModifyInfo pending {};
                     91:        std::mutex mtx {};
1.1       root       92: 
                     93:        // レンダリング時に使う変換テーブル
                     94:        std::unique_ptr<uint64[]> deptable {};
                     95: 
                     96:        // ホストパレット
1.1.1.4   root       97:        const Color *palette {};
1.1       root       98: 
                     99:        // スクロール
                    100:        int xscroll {};
                    101:        int yscroll {};
                    102: };
                    103: 
1.1.1.2   root      104: static inline PlaneVRAMDevice *GetPlaneVRAMDevice() {
                    105:        return Object::GetObject<PlaneVRAMDevice>(OBJ_PLANEVRAM);
                    106: }

unix.superglobalmegacorp.com

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