summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/video/ps2gs.h
blob: 28db82d1945ad69e3cc269d00c12f5d42653527c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                                                                               

                          


            
                    
 


                            
 


                                     
                                         
 


                                                                                                                                 
                                                          
                                                        


                                                                                                       
                                          
 



                                             


                                       




                                      






                                                                                   

                                             
                                                                         




















                                                 












                                   











































                                     















                                            



















                              
                                                
                                              
                                              
 























































































                                                  
                                 
 
                                            






























                                                       



                                





                                


                                                      



                                              
                            
// 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 <typename T, typename U>

	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<T>(intc_tag));
		m_vu1.set_tag(std::forward<U>(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<ps2_intc_device> m_intc;
	required_device<sonyvu1_device> m_vu1;
	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 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