|
|
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.2 root 106: static inline PlaneVRAMDevice *GetPlaneVRAMDevice() {
107: return Object::GetObject<PlaneVRAMDevice>(OBJ_PLANEVRAM);
108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.