|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.