Annotation of nono/vm/videoctlr.h, revision 1.1.1.11

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.