diff options
Diffstat (limited to 'src/devices/video/ps2gs.h')
-rw-r--r-- | src/devices/video/ps2gs.h | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/src/devices/video/ps2gs.h b/src/devices/video/ps2gs.h new file mode 100644 index 00000000000..986041c675a --- /dev/null +++ b/src/devices/video/ps2gs.h @@ -0,0 +1,313 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/****************************************************************************** +* +* Sony Playstation 2 Graphics Synthesizer device skeleton +* +* To Do: +* Everything +* +*/ + +#ifndef DEVICES_VIDEO_PS2GS_H +#define DEVICES_VIDEO_PS2GS_H + +#pragma once + +#include "emu.h" +#include "machine/ps2intc.h" + +class ps2_gif_device; + +class ps2_gs_device : public device_t +{ +public: + template <typename T> + + ps2_gs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&intc_tag) + : ps2_gs_device(mconfig, tag, owner, clock) + { + m_intc.set_tag(std::forward<T>(intc_tag)); + } + + ps2_gs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_READ64_MEMBER(priv_regs0_r); + DECLARE_WRITE64_MEMBER(priv_regs0_w); + DECLARE_READ64_MEMBER(priv_regs1_r); + DECLARE_WRITE64_MEMBER(priv_regs1_w); + + DECLARE_WRITE64_MEMBER(regs_w); + + DECLARE_READ32_MEMBER(gif_r); + DECLARE_WRITE32_MEMBER(gif_w); + + ps2_gif_device* interface(); + + void reg_write(const uint8_t reg, const uint64_t value); + void write_packed(const uint8_t reg, const uint64_t hi, const uint64_t lo); + + void vblank_start(); + void vblank_end(); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + void copy_dword_from_host(uint64_t data); + + enum : uint64_t + { + HOST_TO_LOCAL, + LOCAL_TO_HOST, + LOCAL_TO_LOCAL, + NO_TRANSFER + }; + + enum : uint8_t + { + UL_TO_BR, + BL_TO_UR, + UR_TO_BL, + BR_TO_UL + }; + + enum : uint8_t + { + PSMCT32 = 0x00, + PSMCT24 = 0x01, + PSMCT16 = 0x02, + PSMCT16S = 0x0a, + PSMT8 = 0x13, + PSMT4 = 0x14, + PSMT8H = 0x1b, + PSMT4HL = 0x24, + PSMT4HH = 0x2c, + PSMZ32 = 0x30, + PSMZ24 = 0x31, + PSMZ16 = 0x32, + PSMZ16S = 0x3a + }; + + enum : uint8_t + { + ALPHA_FUNC_NEVER, + ALPHA_FUNC_ALWAYS, + ALPHA_FUNC_LESS, + ALPHA_FUNC_LEQUAL, + ALPHA_FUNC_EQUAL, + ALPHA_FUNC_GEQUAL, + ALPHA_FUNC_GREATER, + ALPHA_FUNC_NOTEQUAL + }; + + enum : uint8_t + { + ALPHA_FAIL_KEEP, + ALPHA_FAIL_UPDATE_FB, + ALPHA_FAIL_UPDATE_ZB, + ALPHA_FAIL_UPDATE_RGB + }; + + enum : uint8_t + { + DEPTH_FUNC_NEVER, + DEPTH_FUNC_ALWAYS, + DEPTH_FUNC_GEQUAL, + DEPTH_FUNC_GREATER + }; + + enum : uint8_t + { + PRIM_TYPE_POINT, + PRIM_TYPE_LINE, + PRIM_TYPE_LINE_STRIP, + PRIM_TYPE_TRI, + PRIM_TYPE_TRI_STRIP, + PRIM_TYPE_TRI_FAN, + PRIM_TYPE_SPRITE, + PRIM_TYPE_INVALID + }; + + enum : uint32_t + { + CSR_SIGNAL = 0x00000001, + CSR_FINISH = 0x00000002, + CSR_HSINT = 0x00000004, + CSR_VSINT = 0x00000008, + CSR_EDWINT = 0x00000010, + CSR_FLUSH = 0x00000100, + CSR_RESET = 0x00000200, + CSR_NFIELD = 0x00001000, + CSR_FIELD_ODD = 0x00002000, + CSR_FIFO_MASK = 0x0000c000, + CSR_FIFO_MID = 0x00000000, + CSR_FIFO_EMPTY = 0x00004000, + CSR_FIFO_HI = 0x00008000, + CSR_FIFO_INV = 0x0000c000, + CSR_REV = 0x001b0000, + CSR_ID = 0x55000000 + }; + + struct vertex_t + { + uint16_t m_x; + uint16_t m_y; + uint32_t m_z; + + uint8_t m_r; + uint8_t m_g; + uint8_t m_b; + uint8_t m_a; + float m_q; + + uint32_t m_us; + uint32_t m_vt; + + uint8_t m_fog; + }; + + required_device<ps2_intc_device> m_intc; + required_device<ps2_gif_device> m_gif; + + std::unique_ptr<uint32_t[]> m_ram; + std::unique_ptr<vertex_t[]> m_vertices; + + struct context_t + { + uint64_t m_xyoffset; // 0x18, 0x19 + uint32_t m_offset_x; + uint32_t m_offset_y; + + uint64_t m_scissor; // 0x40, 0x41 + uint16_t m_scissor_x0; + uint16_t m_scissor_x1; + uint16_t m_scissor_y0; + uint16_t m_scissor_y1; + + uint64_t m_test; // 0x47, 0x48 + bool m_alpha_test; + uint8_t m_alpha_func; + uint8_t m_alpha_ref; + uint8_t m_alpha_fail; + bool m_dstalpha_test; + bool m_dstalpha_pass1; + bool m_depth_test; + uint8_t m_depth_func; + + uint64_t m_frame; // 0x4c, 0x4d + uint32_t m_fb_base; + uint32_t m_fb_width; + uint8_t m_fb_format; + uint32_t m_fb_mask; + + uint64_t m_zbuf; // 0x4e, 0x4f + uint32_t m_z_base; + uint8_t m_z_format; + bool m_z_mask; + }; + + context_t m_context[2]; + + uint64_t m_prim; // 0x00 + uint8_t m_prim_type; + bool m_gouraud_enable; + bool m_texture_enable; + bool m_fog_enable; + bool m_blend_enable; + bool m_aa_enable; + bool m_no_perspective; + uint8_t m_curr_context; + bool m_fix_fragments; + + uint64_t m_rgbaq; // 0x01 + uint8_t m_vc_r; + uint8_t m_vc_g; + uint8_t m_vc_b; + uint8_t m_vc_a; + float m_q; + + uint64_t m_prmodecont; // 0x1a + bool m_use_prim_for_attrs; + + uint64_t m_dthe; // 0x45 + bool m_dither; + + uint64_t m_colclamp; // 0x46 + bool m_clamp_color; + + uint64_t m_bitbltbuf; // 0x50 + uint32_t m_src_buf_base; + uint32_t m_src_buf_width; + uint8_t m_src_buf_fmt; + uint32_t m_dst_buf_base; + uint32_t m_dst_buf_width; + uint8_t m_dst_buf_fmt; + + uint64_t m_trx_pos; // 0x51 + uint32_t m_src_ul_x; + uint32_t m_src_ul_y; + uint32_t m_dst_ul_x; + uint32_t m_dst_ul_y; + uint8_t m_copy_dir; + + uint64_t m_trx_reg; // 0x52 + uint32_t m_trx_width; + uint32_t m_trx_height; + + uint64_t m_trx_dir; // 0x53 + + // Privileged regs + uint64_t m_base_regs[15]; + + uint64_t m_pmode; // Privileged 0x00 + bool m_read_circuit_enable[2]; + bool m_use_fixed_alpha; + uint8_t m_alpha_out_select; + bool m_blend_to_background; + uint8_t m_fixed_alpha; + + uint64_t m_smode2; // Privileged 0x02 + bool m_interlace; + bool m_frame_interlace; + uint8_t m_dpms_mode; + + uint64_t m_dispfb[2]; // Privileged 0x07, 0x09 + uint32_t m_dispfb_base[2]; + uint32_t m_dispfb_width[2]; + uint8_t m_dispfb_format[2]; + uint32_t m_dispfb_x[2]; + uint32_t m_dispfb_y[2]; + + uint64_t m_display[2]; // Privileged 0x08, 0x0a + uint32_t m_display_xpos[2]; + uint32_t m_display_ypos[2]; + uint8_t m_magh[2]; + uint8_t m_magv[2]; + uint32_t m_display_width[2]; + uint32_t m_display_height[2]; + + uint64_t m_bgcolor; // Privileged 0x0e + uint8_t m_bg_r; + uint8_t m_bg_g; + uint8_t m_bg_b; + + uint64_t m_csr; + uint64_t m_imr; + uint64_t m_busdir; + uint64_t m_sig_label_id; + + uint32_t m_vertex_count; + uint32_t m_kick_count; + + uint8_t m_curr_field; + + static const size_t FORMAT_PIXEL_WIDTHS[0x40]; + static const char* FORMAT_NAMES[0x40]; + static const uint32_t KICK_COUNTS[8]; +}; + +DECLARE_DEVICE_TYPE(SONYPS2_GS, ps2_gs_device) + +#endif // DEVICES_VIDEO_PS2GS_H
\ No newline at end of file |