summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/n64types.h
blob: fedac9e02253cf23410eb81f0446ad44e465d294 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz

#ifndef _VIDEO_N64TYPES_H_
#define _VIDEO_N64TYPES_H_

#include "video/rgbutil.h"

struct misc_state_t
{
	misc_state_t()
	{
		m_max_level = 0;
		m_min_level = 0;
	}

	INT32 m_fb_format;          // Framebuffer pixel format index (0 - I, 1 - IA, 2 - CI, 3 - RGBA)
	INT32 m_fb_size;            // Framebuffer pixel size index (0 - 4bpp, 1 - 8bpp, 2 - 16bpp, 3 - 32bpp)
	INT32 m_fb_width;           // Framebuffer width, in pixels
	INT32 m_fb_height;          // Framebuffer height, in pixels
	UINT32 m_fb_address;        // Framebuffer source address offset (in bytes) from start of RDRAM

	UINT32 m_zb_address;        // Z-buffer source address offset (in bytes) from start of RDRAM

	INT32 m_ti_format;          // Format for Texture Interface (TI) transfers
	INT32 m_ti_size;            // Size (in bytes) of TI transfers
	INT32 m_ti_width;           // Width (in pixels) of TI transfers
	UINT32 m_ti_address;        // Destination address for TI transfers

	UINT8 m_random_seed;        // %HACK%, adds 19 each time it's read and is more or less random

	UINT32 m_max_level;         // Maximum LOD level for texture filtering
	UINT32 m_min_level;         // Minimum LOD level for texture filtering

	UINT16 m_primitive_z;       // Forced Z value for current primitive, if applicable
	UINT16 m_primitive_dz;      // Forced Delta-Z value for current primitive, if applicable
};

#if 0
class color_t
{
	public:
		color_t()
		{
			c = 0;
		}

		color_t(UINT32 color)
		{
			set(color);
		}

		color_t(UINT8 a, UINT8 r, UINT8 g, UINT8 b)
		{
			set(a, r, g, b);
		}

		inline void set(color_t& other)
		{
			c = other.c;
		}

		inline void set(UINT32 color)
		{
			i.a = (color >> 24) & 0xff;
			i.r = (color >> 16) & 0xff;
			i.g = (color >>  8) & 0xff;
			i.b = color & 0xff;
		}

		void set(UINT8 a, UINT8 r, UINT8 g, UINT8 b)
		{
			i.a = a;
			i.r = r;
			i.g = g;
			i.b = b;
		}

		inline void set_direct(UINT32 color)
		{
			c = color;
		}

		UINT32 get()
		{
			return i.a << 24 | i.r << 16 | i.g << 8 | i.b;
		}

		union
		{
			UINT32 c;
#ifdef LSB_FIRST
			struct { UINT8 a, b, g, r; } i;
#else
			struct { UINT8 r, g, b, a; } i;
#endif
		};
};
#else
#define color_t rgbaint_t
#endif

enum
{
	BIT_DEPTH_32 = 0,
	BIT_DEPTH_16,

	BIT_DEPTH_COUNT
};

struct n64_tile_t
{
	INT32 format; // Image data format: RGBA, YUV, CI, IA, I
	INT32 size; // Size of texel element: 4b, 8b, 16b, 32b
	INT32 line; // Size of tile line in bytes
	INT32 tmem; // Starting tmem address for this tile in bytes
	INT32 palette; // Palette number for 4b CI texels
	INT32 ct, mt, cs, ms; // Clamp / mirror enable bits for S / T direction
	INT32 mask_t, shift_t, mask_s, shift_s; // Mask values / LOD shifts
	INT32 lshift_s, rshift_s, lshift_t, rshift_t;
	INT32 wrapped_mask_s, wrapped_mask_t;
	bool clamp_s, clamp_t;
	rgbaint_t mm, invmm;
	rgbaint_t wrapped_mask;
	rgbaint_t mask;
	rgbaint_t invmask;
	rgbaint_t lshift;
	rgbaint_t rshift;
	rgbaint_t sth;
	rgbaint_t stl;
	rgbaint_t clamp_st;
	UINT16 sl, tl, sh, th;      // 10.2 fixed-point, starting and ending texel row / column
	INT32 num;
};

struct span_base_t
{
	INT32 m_span_dr;
	INT32 m_span_dg;
	INT32 m_span_db;
	INT32 m_span_da;
	INT32 m_span_ds;
	INT32 m_span_dt;
	INT32 m_span_dw;
	INT32 m_span_dz;
	INT32 m_span_dymax;
	INT32 m_span_dzpix;
	INT32 m_span_drdy;
	INT32 m_span_dgdy;
	INT32 m_span_dbdy;
	INT32 m_span_dady;
	INT32 m_span_dzdy;
};

struct combine_modes_t
{
	INT32 sub_a_rgb0;
	INT32 sub_b_rgb0;
	INT32 mul_rgb0;
	INT32 add_rgb0;
	INT32 sub_a_a0;
	INT32 sub_b_a0;
	INT32 mul_a0;
	INT32 add_a0;

	INT32 sub_a_rgb1;
	INT32 sub_b_rgb1;
	INT32 mul_rgb1;
	INT32 add_rgb1;
	INT32 sub_a_a1;
	INT32 sub_b_a1;
	INT32 mul_a1;
	INT32 add_a1;
};

struct color_inputs_t
{
	// combiner inputs
	color_t* combiner_rgbsub_a[2];
	color_t* combiner_rgbsub_b[2];
	color_t* combiner_rgbmul[2];
	color_t* combiner_rgbadd[2];

	color_t* combiner_alphasub_a[2];
	color_t* combiner_alphasub_b[2];
	color_t* combiner_alphamul[2];
	color_t* combiner_alphaadd[2];

	// blender input
	color_t* blender1a_rgb[2];
	color_t* blender1b_a[2];
	color_t* blender2a_rgb[2];
	color_t* blender2b_a[2];
};

struct other_modes_t
{
	INT32 cycle_type;
	bool persp_tex_en;
	bool detail_tex_en;
	bool sharpen_tex_en;
	bool tex_lod_en;
	bool en_tlut;
	bool tlut_type;
	bool sample_type;
	bool mid_texel;
	bool bi_lerp0;
	bool bi_lerp1;
	bool convert_one;
	bool key_en;
	INT32 rgb_dither_sel;
	INT32 alpha_dither_sel;
	INT32 blend_m1a_0;
	INT32 blend_m1a_1;
	INT32 blend_m1b_0;
	INT32 blend_m1b_1;
	INT32 blend_m2a_0;
	INT32 blend_m2a_1;
	INT32 blend_m2b_0;
	INT32 blend_m2b_1;
	INT32 tex_edge;
	INT32 force_blend;
	INT32 blend_shift;
	bool alpha_cvg_select;
	bool cvg_times_alpha;
	INT32 z_mode;
	INT32 cvg_dest;
	bool color_on_cvg;
	UINT8 image_read_en;
	bool z_update_en;
	bool z_compare_en;
	bool antialias_en;
	bool z_source_sel;
	INT32 dither_alpha_en;
	INT32 alpha_compare_en;
	INT32 alpha_dither_mode;
};

struct rectangle_t
{
	UINT16 m_xl;    // 10.2 fixed-point
	UINT16 m_yl;    // 10.2 fixed-point
	UINT16 m_xh;    // 10.2 fixed-point
	UINT16 m_yh;    // 10.2 fixed-point
};

struct rdp_poly_state
{
	n64_rdp*            m_rdp;                  /* pointer back to the RDP state */

	misc_state_t        m_misc_state;           /* miscellaneous rasterizer bits */
	other_modes_t       m_other_modes;          /* miscellaneous rasterizer bits (2) */
	span_base_t         m_span_base;            /* span initial values for triangle rasterization */
	rectangle_t         m_scissor;              /* screen-space scissor bounds */
	UINT32              m_fill_color;           /* poly fill color */
	n64_tile_t          m_tiles[8];             /* texture tile state */
	UINT8               m_tmem[0x1000];         /* texture cache */
	INT32               tilenum;                /* texture tile index */
	bool                flip;                   /* left-major / right-major flip */
	bool                rect;                   /* primitive is rectangle (vs. triangle) */
};

#define RDP_CVG_SPAN_MAX            (1024)

// This is enormous and horrible
struct rdp_span_aux
{
	UINT32              m_unscissored_rx;
	UINT16              m_cvg[RDP_CVG_SPAN_MAX];
	color_t             m_memory_color;
	color_t             m_pixel_color;
	color_t             m_inv_pixel_color;
	color_t             m_blended_pixel_color;

	color_t             m_combined_color;
	color_t             m_combined_alpha;
	color_t             m_texel0_color;
	color_t             m_texel0_alpha;
	color_t             m_texel1_color;
	color_t             m_texel1_alpha;
	color_t             m_next_texel_color;
	color_t             m_next_texel_alpha;
	color_t             m_blend_color;          /* constant blend color */
	color_t             m_prim_color;           /* flat primitive color */
	color_t             m_prim_alpha;           /* flat primitive alpha */
	color_t             m_env_color;            /* generic color constant ('environment') */
	color_t             m_env_alpha;            /* generic alpha constant ('environment') */
	color_t             m_fog_color;            /* generic color constant ('fog') */
	color_t             m_shade_color;          /* gouraud-shaded color */
	color_t             m_shade_alpha;          /* gouraud-shaded alpha */
	color_t             m_key_scale;            /* color-keying constant */
	color_t             m_noise_color;          /* noise */
	color_t             m_lod_fraction;         /* Z-based LOD fraction for this poly */
	color_t             m_prim_lod_fraction;    /* fixed LOD fraction for this poly */
	color_t             m_k4;
	color_t             m_k5;
	color_inputs_t      m_color_inputs;
	UINT32              m_current_pix_cvg;
	UINT32              m_current_mem_cvg;
	UINT32              m_current_cvg_bit;
	INT32               m_shift_a;
	INT32               m_shift_b;
	INT32               m_precomp_s;
	INT32               m_precomp_t;
	INT32               m_blend_enable;
	bool                m_pre_wrap;
	INT32               m_dzpix_enc;
	UINT8*              m_tmem;                /* pointer to texture cache for this polygon */
	bool                m_start_span;
	rgbaint_t           m_clamp_diff[8];
};

struct z_decompress_entry_t
{
	UINT32 shift;
	UINT32 add;
};

struct cv_mask_derivative_t
{
	UINT8 cvg;
	UINT8 cvbit;
	UINT8 xoff;
	UINT8 yoff;
};

class span_param_t
{
	public:
		union
		{
			UINT32 w;
#ifdef LSB_FIRST
			struct { UINT16 l; INT16 h; } h;
#else
			struct { INT16 h; UINT16 l; } h;
#endif
		};
};

#endif // _VIDEO_N64TYPES_H_