#ifndef PSX_GPU_H
#define PSX_GPU_H
+#include "vector_types.h"
+
typedef enum
{
PRIMITIVE_TYPE_TRIANGLE = 0,
u16 y;
} edge_data_struct;
-// 64 bytes total
+// 64 (72) bytes total
typedef struct
{
// 16 bytes
vec_8x16u pixels;
};
- // 8 bytes
+ // 8 (16) bytes
u32 draw_mask_bits;
u16 *fb_ptr;
u16 clut_settings;
u16 texture_settings;
+ u32 *reciprocal_table_ptr;
+
// enhancement stuff
u16 *enhancement_buf_ptr;
u16 *enhancement_current_buf_ptr;
s16 saved_viewport_start_y;
s16 saved_viewport_end_x;
s16 saved_viewport_end_y;
+ u8 enhancement_buf_by_x16[64];
// Align up to 64 byte boundary to keep the upcoming buffers cache line
// aligned, also make reachable with single immediate addition
- u8 reserved_a[228];
+ u8 reserved_a[160];
// 8KB
block_struct blocks[MAX_BLOCKS_PER_ROW];
u8 texture_4bpp_cache[32][256 * 256];
u8 texture_8bpp_even_cache[16][256 * 256];
u8 texture_8bpp_odd_cache[16][256 * 256];
+ int use_dithering;
} psx_gpu_struct;
typedef struct __attribute__((aligned(16)))
s16 x;
s16 y;
+
+ u32 padding;
} vertex_struct;
void render_block_fill(psx_gpu_struct *psx_gpu, u32 color, u32 x, u32 y,
void render_sprite(psx_gpu_struct *psx_gpu, s32 x, s32 y, u32 u, u32 v,
s32 width, s32 height, u32 flags, u32 color);
void render_line(psx_gpu_struct *gpu, vertex_struct *vertexes, u32 flags,
- u32 color);
+ u32 color, int double_resolution);
u32 texture_region_mask(s32 x1, s32 y1, s32 x2, s32 y2);
+void update_texture_8bpp_cache(psx_gpu_struct *psx_gpu);
void flush_render_block_buffer(psx_gpu_struct *psx_gpu);
void initialize_psx_gpu(psx_gpu_struct *psx_gpu, u16 *vram);
void triangle_benchmark(psx_gpu_struct *psx_gpu);
+void compute_all_gradients(psx_gpu_struct * __restrict__ psx_gpu,
+ const vertex_struct * __restrict__ a, const vertex_struct * __restrict__ b,
+ const vertex_struct * __restrict__ c);
+
#endif