cdrom: change pause timing again
[pcsx_rearmed.git] / plugins / gpu_neon / psx_gpu / psx_gpu.h
... / ...
CommitLineData
1/*
2 * Copyright (C) 2011 Gilead Kutnick "Exophase" <exophase@gmail.com>
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of
7 * the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 */
14
15#ifndef PSX_GPU_H
16#define PSX_GPU_H
17
18#define MAX_SPANS 512
19#define MAX_BLOCKS 64
20#define MAX_BLOCKS_PER_ROW 128
21
22#define SPAN_DATA_BLOCKS_SIZE 32
23
24#ifndef __ASSEMBLER__
25
26#include "vector_types.h"
27
28typedef enum
29{
30 PRIMITIVE_TYPE_TRIANGLE = 0,
31 PRIMITIVE_TYPE_SPRITE = 1,
32 PRIMITIVE_TYPE_LINE = 2,
33 PRIMITIVE_TYPE_UNKNOWN = 3
34} primitive_type_enum;
35
36typedef enum
37{
38 TEXTURE_MODE_4BPP = 0,
39 TEXTURE_MODE_8BPP = 1,
40 TEXTURE_MODE_16BPP = 2
41} texture_mode_enum;
42
43typedef enum
44{
45 BLEND_MODE_AVERAGE = 0,
46 BLEND_MODE_ADD = 1,
47 BLEND_MODE_SUBTRACT = 2,
48 BLEND_MODE_ADD_FOURTH = 3
49} blend_mode_enum;
50
51typedef enum
52{
53 RENDER_FLAGS_MODULATE_TEXELS = 0x1,
54 RENDER_FLAGS_BLEND = 0x2,
55 RENDER_FLAGS_TEXTURE_MAP = 0x4,
56 RENDER_FLAGS_QUAD = 0x8,
57 RENDER_FLAGS_SHADE = 0x10,
58} render_flags_enum;
59
60typedef enum
61{
62 RENDER_STATE_DITHER = 0x8,
63 RENDER_STATE_MASK_EVALUATE = 0x20,
64} render_state_enum;
65
66typedef enum
67{
68 RENDER_INTERLACE_ENABLED = 0x1,
69 RENDER_INTERLACE_ODD = 0x2,
70} render_mode_enum;
71
72typedef struct
73{
74 u16 left_x;
75 u16 num_blocks;
76 u16 right_mask;
77 u16 y;
78} edge_data_struct;
79
80// 64 (72) bytes total
81typedef struct
82{
83 // 16 bytes
84 union
85 {
86 vec_8x16u uv;
87 vec_8x16u texels;
88 vec_8x16u draw_mask;
89 };
90
91 // 24 bytes
92 union
93 {
94 struct
95 {
96 vec_8x8u r;
97 vec_8x8u g;
98 vec_8x8u b;
99 };
100
101 vec_8x16u pixels;
102 };
103
104 // 8 (16) bytes
105 u32 draw_mask_bits;
106 u16 *fb_ptr;
107
108 // 16 bytes
109 vec_8x16u dither_offsets;
110} block_struct;
111
112typedef struct render_block_handler_struct render_block_handler_struct;
113
114typedef struct
115{
116 // 144 bytes
117 vec_8x16u test_mask;
118
119 vec_4x32u uvrg;
120 vec_4x32u uvrg_dx;
121 vec_4x32u uvrg_dy;
122
123 vec_4x32u u_block_span;
124 vec_4x32u v_block_span;
125 vec_4x32u r_block_span;
126 vec_4x32u g_block_span;
127 vec_4x32u b_block_span;
128
129 u32 b;
130 u32 b_dy;
131
132 u32 triangle_area;
133
134 u32 texture_window_settings;
135 u32 current_texture_mask;
136 u32 viewport_mask;
137 u32 dirty_textures_4bpp_mask;
138 u32 dirty_textures_8bpp_mask;
139 u32 dirty_textures_8bpp_alternate_mask;
140
141 u32 triangle_color;
142 u32 dither_table[4];
143
144 struct render_block_handler_struct *render_block_handler;
145 void *texture_page_ptr;
146 void *texture_page_base;
147 u16 *clut_ptr;
148 u16 *vram_ptr;
149 u16 *vram_out_ptr;
150
151 u32 uvrgb_phase;
152
153 u16 render_state_base;
154 u16 render_state;
155
156 u16 num_spans;
157 u16 num_blocks;
158
159 s16 viewport_start_x;
160 s16 viewport_start_y;
161 s16 viewport_end_x;
162 s16 viewport_end_y;
163
164 u16 mask_msb;
165
166 u8 triangle_winding;
167
168 u8 display_area_draw_enable;
169
170 u8 current_texture_page;
171 u8 last_8bpp_texture_page;
172
173 u8 texture_mask_width;
174 u8 texture_mask_height;
175 u8 texture_window_x;
176 u8 texture_window_y;
177
178 u8 primitive_type;
179 u8 render_mode;
180
181 s16 offset_x;
182 s16 offset_y;
183
184 u16 clut_settings;
185 u16 texture_settings;
186
187 u32 *reciprocal_table_ptr;
188
189 // enhancement stuff
190 u16 *enhancement_buf_ptr; // main alloc
191 u16 *enhancement_current_buf_ptr; // offset into above, 4 bufs
192 u32 saved_hres;
193 s16 saved_viewport_start_x;
194 s16 saved_viewport_start_y;
195 s16 saved_viewport_end_x;
196 s16 saved_viewport_end_y;
197 struct psx_gpu_scanout {
198 u16 x, y, w, h;
199 } enhancement_scanouts[4]; // 0-3 specifying which buf to use
200 u16 enhancement_scanout_eselect; // eviction selector
201 u16 enhancement_current_buf;
202
203 u32 hack_disable_main:1;
204 u32 hack_texture_adj:1;
205
206 // Align up to 64 byte boundary to keep the upcoming buffers cache line
207 // aligned, also make reachable with single immediate addition
208 u8 reserved_a[184 + 9*4 - 9*sizeof(void *)];
209
210 // 8KB
211 block_struct blocks[MAX_BLOCKS_PER_ROW];
212
213 // 14336 bytes
214 vec_4x32u span_uvrg_offset[MAX_SPANS];
215 edge_data_struct span_edge_data[MAX_SPANS];
216 u32 span_b_offset[MAX_SPANS];
217
218 u8 texture_4bpp_cache[32][256 * 256];
219 u8 texture_8bpp_even_cache[16][256 * 256];
220 u8 texture_8bpp_odd_cache[16][256 * 256];
221} psx_gpu_struct;
222
223typedef struct __attribute__((aligned(16)))
224{
225 u8 u;
226 u8 v;
227
228 u8 r;
229 u8 g;
230 u8 b;
231
232 u8 reserved[3];
233
234 s16 x;
235 s16 y;
236
237 u32 padding;
238} vertex_struct;
239
240void render_block_fill(psx_gpu_struct *psx_gpu, u32 color, u32 x, u32 y,
241 u32 width, u32 height);
242void render_block_copy(psx_gpu_struct *psx_gpu, u16 *source, u32 x, u32 y,
243 u32 width, u32 height, u32 pitch);
244void render_block_move(psx_gpu_struct *psx_gpu, u32 source_x, u32 source_y,
245 u32 dest_x, u32 dest_y, u32 width, u32 height);
246
247void render_triangle(psx_gpu_struct *psx_gpu, vertex_struct *vertexes,
248 u32 flags);
249void render_sprite(psx_gpu_struct *psx_gpu, s32 x, s32 y, u32 u, u32 v,
250 s32 *width, s32 *height, u32 flags, u32 color);
251void render_line(psx_gpu_struct *gpu, vertex_struct *vertexes, u32 flags,
252 u32 color, int double_resolution);
253
254u32 texture_region_mask(s32 x1, s32 y1, s32 x2, s32 y2);
255
256void update_texture_8bpp_cache(psx_gpu_struct *psx_gpu);
257void flush_render_block_buffer(psx_gpu_struct *psx_gpu);
258
259void initialize_psx_gpu(psx_gpu_struct *psx_gpu, u16 *vram);
260u32 gpu_parse(psx_gpu_struct *psx_gpu, u32 *list, u32 size,
261 s32 *cpu_cycles_sum_out, s32 *cpu_cycles_last, u32 *last_command);
262
263void triangle_benchmark(psx_gpu_struct *psx_gpu);
264
265void compute_all_gradients(psx_gpu_struct * __restrict__ psx_gpu,
266 const vertex_struct * __restrict__ a, const vertex_struct * __restrict__ b,
267 const vertex_struct * __restrict__ c);
268
269#endif // __ASSEMBLER__
270#endif // PSX_GPU_H