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