// license:BSD-3-Clause // copyright-holders:Ryan Holtz /****************************************************************************** * * Sony Playstation 2 Graphics Synthesizer device skeleton * * To Do: * Everything * */ #ifndef MAME_VIDEO_PS2GS_H #define MAME_VIDEO_PS2GS_H #pragma once class ps2_gs_device; #include "ps2gif.h" #include "machine/ps2intc.h" #include "cpu/mips/ps2vu.h" class ps2_gs_device : public device_t { public: template ps2_gs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&intc_tag, U &&vu1_tag) : ps2_gs_device(mconfig, tag, owner, clock) { m_intc.set_tag(std::forward(intc_tag)); m_vu1.set_tag(std::forward(vu1_tag)); } ps2_gs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~ps2_gs_device() override; 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 m_intc; required_device m_vu1; required_device m_gif; std::unique_ptr m_ram; std::unique_ptr 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 size_t const FORMAT_PIXEL_WIDTHS[0x40]; static char const *const FORMAT_NAMES[0x40]; static uint32_t const KICK_COUNTS[8]; }; DECLARE_DEVICE_TYPE(SONYPS2_GS, ps2_gs_device) #endif // MAME_VIDEO_PS2GS_H