|
|
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" ! 15: #include "renderer.h" ! 16: #include <vector> ! 17: ! 18: class PlaneVRAMDevice : public IODevice ! 19: { ! 20: using inherited = IODevice; ! 21: ! 22: protected: ! 23: // ショートカット ! 24: static const int BLKX = Renderer::BLKX; ! 25: static const int BLKY = Renderer::BLKY; ! 26: ! 27: public: ! 28: PlaneVRAMDevice(const std::string& objname_, int width_, int height_); ! 29: virtual ~PlaneVRAMDevice() override; ! 30: ! 31: void ResetHard(bool poweron) override; ! 32: ! 33: // レンダリング時に使うテーブルを事前に計算する。 ! 34: void InitDeptable(); ! 35: ! 36: // プレーン数を取得 ! 37: int GetPlaneCount() const { return nplane; } ! 38: ! 39: // 更新情報を取得 ! 40: ModifyInfo GetModify() const; ! 41: ! 42: // 更新フラグをクリア ! 43: void ClearDirty(); ! 44: ! 45: // 画面を合成する ! 46: bool Render(BitmapRGB& dst, const ModifyInfo& modify); ! 47: ! 48: // 合成ビットマップを取得する ! 49: const BitmapI8& GetComposite() const { return composite; } ! 50: ! 51: #if defined(PERF_HIT) ! 52: // ブロックのヒット効率(?)を調べる ! 53: std::array<bool, 65536> dirty_word {}; ! 54: #endif ! 55: ! 56: protected: ! 57: // 全画面の更新フラグを立てる ! 58: void Invalidate(); ! 59: ! 60: // 垂直 VRAM から BitmapI8 バッファを作成する ! 61: void RenderVRAMToComposite(const ModifyInfo& modify); ! 62: ! 63: // BitmapI8 バッファから BitmapRGB を作成する。 ! 64: void RenderCompositeToRGB(BitmapRGB& dst, const ModifyInfo& modify); ! 65: ! 66: // ビットマッププレーン。 ! 67: // メモリを確保する時のサイズ計算のため型を uint8 にしているが、 ! 68: // 運用はロングワードでホストバイトオーダー。 ! 69: // Lunafb では 1枚 256KBで 1 or 4枚。TVRAM では 512KB。 ! 70: std::unique_ptr<uint8[]> mem {}; ! 71: ! 72: // プレーン数 (TVRAM なら 4 固定、LUNA は設定による) ! 73: int nplane {}; ! 74: ! 75: // テキスト画面の合成ビットマップ ! 76: BitmapI8 composite {}; ! 77: ! 78: // 更新フラグ。 ! 79: // Lunafb では 1024、TVRAM では 512個。 ! 80: std::vector<uint8> dirty {}; ! 81: ! 82: // ModifyInfo.bits に対するマスク。横方向のブロック数によって決まり、 ! 83: // Lunafb では 0xffff、TVRAM では 0xff00。 ! 84: uint16 modify_mask {}; ! 85: ! 86: // レンダリング時に使う変換テーブル ! 87: std::unique_ptr<uint64[]> deptable {}; ! 88: ! 89: // ホストパレット ! 90: const ColorXBGR *palette {}; ! 91: ! 92: // スクロール ! 93: int xscroll {}; ! 94: int yscroll {}; ! 95: }; ! 96: ! 97: extern PlaneVRAMDevice *gPlaneVRAM;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.