|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
1.1.1.7 root 7: //
8: // ビデオコントローラ
9: //
10:
1.1 root 11: #pragma once
12:
13: #include "device.h"
1.1.1.9 root 14: #include "bitmap.h"
1.1.1.7 root 15: #include "color.h"
1.1.1.9 root 16: #include "event.h"
1.1.1.8 root 17: #include <array>
1.1.1.11! root 18: #include <atomic>
1.1.1.8 root 19:
1.1.1.10 root 20: class PlaneVRAMDevice;
1.1.1.11! root 21: class Renderer;
1.1 root 22:
1.1.1.6 root 23: class VideoCtlrDevice : public IODevice
1.1 root 24: {
25: using inherited = IODevice;
1.1.1.7 root 26:
1.1.1.8 root 27: static const uint32 baseaddr = 0xe82000;
1.1 root 28:
29: public:
30: VideoCtlrDevice();
1.1.1.9 root 31: ~VideoCtlrDevice() override;
1.1 root 32:
1.1.1.8 root 33: bool Init() override;
1.1.1.7 root 34: void ResetHard(bool poweron) override;
1.1.1.3 root 35:
1.1.1.10 root 36: busdata Read(busaddr addr) override;
37: busdata Write(busaddr addr, uint32 data) override;
38: busdata Peek1(uint32 addr) override;
39: bool Poke1(uint32 addr, uint32 data) override;
1.1.1.9 root 40:
41: // コントラストを取得 (Peek() からも呼ぶので副作用を起こしてはいけない)
1.1.1.10 root 42: uint GetContrast() const { return target_contrast / 0x11; }
1.1.1.9 root 43: // コントラストを設定
1.1.1.10 root 44: void SetContrast(uint);
1.1.1.9 root 45:
1.1.1.11! root 46: // 画面作成。
! 47: void VDisp();
! 48:
1.1.1.9 root 49: // 画面合成
1.1.1.11! root 50: bool Render(BitmapRGBX& dst);
1.1.1.9 root 51:
1.1.1.2 root 52: // 加工済みテキストパレットの先頭アドレスを取得
53: // レンダラとかからの参照用
1.1.1.10 root 54: const std::vector<Color>& GetHostPalette() const { return hostcolor; }
1.1.1.8 root 55:
56: // 生パレットを uint32 形式にしたものを返す (GUI 用)
57: const std::vector<uint32> GetIntPalette() const;
1.1 root 58:
59: private:
1.1.1.10 root 60: static inline uint32 Decoder(uint32 addr);
61: static inline uint Offset2Rn(uint32 offset);
62:
63: uint32 Get16(uint32 offset) const;
64: void Set8(uint32 offset, uint32 data);
65: void Set16(uint32 offset, uint32 data);
1.1.1.8 root 66:
1.1.1.2 root 67: void MakePalette();
1.1.1.9 root 68: void RenderContrast(BitmapRGBX& dst, const BitmapRGBX& src);
69: static void RenderContrast_gen(BitmapRGBX&, const BitmapRGBX&, uint32);
70: #if defined(HAVE_AVX2)
71: static void RenderContrast_avx2(BitmapRGBX&, const BitmapRGBX&, uint32);
72: bool enable_avx2 {};
73: #endif
1.1.1.10 root 74: #if defined(HAVE_NEON)
75: static void RenderContrast_neon(BitmapRGBX&, const BitmapRGBX&, uint32);
76: bool enable_neon {};
77: #endif
1.1.1.9 root 78:
79: void ContrastCallback(Event& ev);
1.1 root 80:
1.1.1.10 root 81: // ワードレジスタ R0, R1, R2
82: std::array<uint16, 3> reg {};
1.1.1.8 root 83:
1.1.1.9 root 84: // テキスト画面
85: BitmapRGBX textbmp {};
86:
1.1.1.10 root 87: // パレット (ホストバイトオーダー)
88: std::array<uint16, 512> palette {};
1.1.1.2 root 89:
1.1.1.7 root 90: // ホスト形式のテキストパレット (レンダラ用に加工したもの)
1.1.1.10 root 91: std::vector<Color> hostcolor {};
1.1.1.8 root 92:
1.1.1.9 root 93: // 設定したコントラスト値 (0-255)
94: uint32 target_contrast {};
95: // 現在の (遷移中かもしれない) コントラスト値 (0-255)
96: uint32 running_contrast {};
97: // 設定を変える時の初期値 (0-255)
98: uint32 initial_contrast {};
99: // 設定を変える時の起点
100: uint64 contrast_time0 {};
101:
1.1.1.11! root 102: // VM スレッドからレンダラスレッドへの連絡用。(0-255)
! 103: std::atomic<uint32> pending_contrast {};
! 104:
1.1.1.9 root 105: // レンダリングに使っているコントラスト値 (0-255)
106: uint32 rendering_contrast {};
107:
108: Event contrast_event { this };
109:
110: PlaneVRAMDevice *planevram {};
1.1.1.8 root 111: Renderer *renderer {};
1.1 root 112: };
113:
1.1.1.8 root 114: static inline VideoCtlrDevice *GetVideoCtlrDevice() {
115: return Object::GetObject<VideoCtlrDevice>(OBJ_VIDEOCTLR);
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.