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