2 * Copyright (C) 2011 Gilead Kutnick "Exophase" <exophase@gmail.com>
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.
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.
20 PRIMITIVE_TYPE_TRIANGLE = 0,
21 PRIMITIVE_TYPE_SPRITE = 1,
22 PRIMITIVE_TYPE_LINE = 2,
23 PRIMITIVE_TYPE_UNKNOWN = 3
24 } primitive_type_enum;
28 TEXTURE_MODE_4BPP = 0,
29 TEXTURE_MODE_8BPP = 1,
30 TEXTURE_MODE_16BPP = 2
35 BLEND_MODE_AVERAGE = 0,
37 BLEND_MODE_SUBTRACT = 2,
38 BLEND_MODE_ADD_FOURTH = 3
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,
52 RENDER_STATE_DITHER = 0x8,
53 RENDER_STATE_MASK_EVALUATE = 0x20,
58 RENDER_INTERLACE_ENABLED = 0x1,
59 RENDER_INTERLACE_ODD = 0x2
60 } render_interlace_enum;
99 vec_8x16u dither_offsets;
102 #define MAX_SPANS 512
103 #define MAX_BLOCKS 64
104 #define MAX_BLOCKS_PER_ROW 128
106 #define SPAN_DATA_BLOCKS_SIZE 32
108 typedef struct render_block_handler_struct render_block_handler_struct;
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;
131 u32 texture_window_settings;
132 u32 current_texture_mask;
134 u32 dirty_textures_4bpp_mask;
135 u32 dirty_textures_8bpp_mask;
136 u32 dirty_textures_8bpp_alternate_mask;
141 struct render_block_handler_struct *render_block_handler;
142 void *texture_page_ptr;
143 void *texture_page_base;
148 u16 render_state_base;
158 u16 texture_settings;
160 s16 viewport_start_x;
161 s16 viewport_start_y;
170 u8 display_area_draw_enable;
172 u8 current_texture_page;
173 u8 last_8bpp_texture_page;
175 u8 texture_mask_width;
176 u8 texture_mask_height;
183 // Align up to 64 byte boundary to keep the upcoming buffers cache line
188 block_struct blocks[MAX_BLOCKS_PER_ROW];
191 vec_4x32u span_uvrg_offset[MAX_SPANS];
192 edge_data_struct span_edge_data[MAX_SPANS];
193 u32 span_b_offset[MAX_SPANS];
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];
200 typedef struct __attribute__((aligned(16)))
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);
222 void render_triangle(psx_gpu_struct *psx_gpu, vertex_struct *vertexes,
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,
229 u32 texture_region_mask(s32 x1, s32 y1, s32 x2, s32 y2);
231 void flush_render_block_buffer(psx_gpu_struct *psx_gpu);
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);
236 void triangle_benchmark(psx_gpu_struct *psx_gpu);