gpu_neon: integrate Exophase's rasterizer
[pcsx_rearmed.git] / plugins / gpu_neon / psx_gpu / psx_gpu.h
CommitLineData
75e28f62
E
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
18typedef enum
19{
20 PRIMITIVE_TYPE_TRIANGLE = 0,
21 PRIMITIVE_TYPE_SPRITE = 1,
22 PRIMITIVE_TYPE_LINE = 2,
23 PRIMITIVE_TYPE_UNKNOWN = 3
24} primitive_type_enum;
25
26typedef enum
27{
28 TEXTURE_MODE_4BPP = 0,
29 TEXTURE_MODE_8BPP = 1,
30 TEXTURE_MODE_16BPP = 2
31} texture_mode_enum;
32
33typedef enum
34{
35 BLEND_MODE_AVERAGE = 0,
36 BLEND_MODE_ADD = 1,
37 BLEND_MODE_SUBTRACT = 2,
38 BLEND_MODE_ADD_FOURTH = 3
39} blend_mode_enum;
40
41typedef enum
42{
43 RENDER_FLAGS_MODULATE_TEXELS = 0x1,
44 RENDER_FLAGS_BLEND = 0x2,
45 RENDER_FLAGS_TEXTURE_MAP = 0x4,
46 RENDER_FLAGS_QUAD = 0x8,
47 RENDER_FLAGS_SHADE = 0x10,
48} render_flags_enum;
49
50typedef enum
51{
52 RENDER_STATE_DITHER = 0x8,
53 RENDER_STATE_MASK_EVALUATE = 0x20,
54} render_state_enum;
55
56typedef struct
57{
58 u16 left_x;
59 u16 num_blocks;
60 u16 right_mask;
61 u16 y;
62} edge_data_struct;
63
64// 64 bytes total
65typedef struct
66{
67 // 16 bytes
68 union
69 {
70 vec_8x16u uv;
71 vec_8x16u texels;
72 vec_8x16u draw_mask;
73 };
74
75 // 24 bytes
76 union
77 {
78 struct
79 {
80 vec_8x8u r;
81 vec_8x8u g;
82 vec_8x8u b;
83 };
84
85 vec_8x16u pixels;
86 };
87
88 // 8 bytes
89 u32 draw_mask_bits;
90 u16 *fb_ptr;
91
92 // 16 bytes
93 vec_8x16u dither_offsets;
94} block_struct;
95
96#define MAX_SPANS 512
97#define MAX_BLOCKS 64
98#define MAX_BLOCKS_PER_ROW 128
99
100#define SPAN_DATA_BLOCKS_SIZE 32
101
102typedef struct render_block_handler_struct render_block_handler_struct;
103
104typedef struct
105{
106 // 144 bytes
107 vec_8x16u test_mask;
108
109 vec_4x32u uvrg;
110 vec_4x32u uvrg_dx;
111 vec_4x32u uvrg_dy;
112
113 vec_4x32u u_block_span;
114 vec_4x32u v_block_span;
115 vec_4x32u r_block_span;
116 vec_4x32u g_block_span;
117 vec_4x32u b_block_span;
118
119 // 72 bytes
120 u32 b;
121 u32 b_dy;
122
123 u32 triangle_area;
124
125 u32 texture_window_settings;
126 u32 current_texture_mask;
127 u32 viewport_mask;
128 u32 dirty_textures_4bpp_mask;
129 u32 dirty_textures_8bpp_mask;
130 u32 dirty_textures_8bpp_alternate_mask;
131
132 u32 triangle_color;
133 u32 primitive_color;
134
135 u32 dither_table[4];
136
137 struct render_block_handler_struct *render_block_handler;
138 void *texture_page_ptr;
139 u16 *clut_ptr;
140 u16 *vram_ptr;
141
142 // 26 bytes
143 u16 render_state_base;
144 u16 render_state;
145
146 u16 num_spans;
147 u16 num_blocks;
148
149 s16 offset_x;
150 s16 offset_y;
151
152 u16 clut_settings;
153 u16 texture_settings;
154
155 s16 viewport_start_x;
156 s16 viewport_start_y;
157 s16 viewport_end_x;
158 s16 viewport_end_y;
159
160 u16 mask_msb;
161
162 // 8 bytes
163 u8 triangle_winding;
164
165 u8 display_area_draw_enable;
166
167 u8 current_texture_page;
168 u8 last_8bpp_texture_page;
169
170 u8 texture_mask_width;
171 u8 texture_mask_height;
172 u8 texture_window_x;
173 u8 texture_window_y;
174
175 u8 primitive_type;
176
177 // Align up to 64 byte boundary to keep the upcoming buffers cache line
178 // aligned
179 u8 reserved_a[1];
180
181 // 8KB
182 block_struct blocks[MAX_BLOCKS_PER_ROW];
183
184 // 14336 bytes
185 vec_4x32u span_uvrg_offset[MAX_SPANS];
186 edge_data_struct span_edge_data[MAX_SPANS];
187 u32 span_b_offset[MAX_SPANS];
188
75e28f62
E
189 u8 texture_4bpp_cache[32][256 * 256];
190 u8 texture_8bpp_even_cache[16][256 * 256];
191 u8 texture_8bpp_odd_cache[16][256 * 256];
192
193 u32 pixel_count_mode;
194 u32 pixel_compare_mode;
195
196 u8 *vram_pixel_counts_a;
197 u8 *vram_pixel_counts_b;
198 u16 *compare_vram;
199} psx_gpu_struct;
200
201typedef struct __attribute__((aligned(16)))
202{
203 u8 u;
204 u8 v;
205
206 u8 r;
207 u8 g;
208 u8 b;
209
210 u8 reserved[3];
211
212 s16 x;
213 s16 y;
214} vertex_struct;
215
216void render_block_fill(psx_gpu_struct *psx_gpu, u32 color, u32 x, u32 y,
217 u32 width, u32 height);
218void render_block_copy(psx_gpu_struct *psx_gpu, u16 *source, u32 x, u32 y,
219 u32 width, u32 height, u32 pitch);
220void render_block_move(psx_gpu_struct *psx_gpu, u32 source_x, u32 source_y,
221 u32 dest_x, u32 dest_y, u32 width, u32 height);
222
223void render_triangle(psx_gpu_struct *psx_gpu, vertex_struct *vertexes,
224 u32 flags);
225void render_sprite(psx_gpu_struct *psx_gpu, s32 x, s32 y, u32 u, u32 v,
226 s32 width, s32 height, u32 flags, u32 color);
227void render_line(psx_gpu_struct *gpu, vertex_struct *vertexes, u32 flags,
228 u32 color);
229
230u32 texture_region_mask(s32 x1, s32 y1, s32 x2, s32 y2);
231
232void flush_render_block_buffer(psx_gpu_struct *psx_gpu);
233
e8c0e0bb 234void initialize_psx_gpu(psx_gpu_struct *psx_gpu, u16 *vram);
75e28f62
E
235void gpu_parse(psx_gpu_struct *psx_gpu, u32 *list, u32 size);
236
237void triangle_benchmark(psx_gpu_struct *psx_gpu);
238
239#endif
240