#include <stdlib.h>
#include <stdint.h>
#include <string.h>
+#include <assert.h>
#include "common.h"
#ifndef NEON_BUILD
return mask;
}
-void update_texture_cache_region(psx_gpu_struct *psx_gpu, u32 x1, u32 y1,
- u32 x2, u32 y2)
+static void update_texture_cache_region_(psx_gpu_struct *psx_gpu,
+ u32 x1, u32 y1, u32 x2, u32 y2)
{
u32 mask = texture_region_mask(x1, y1, x2, y2);
u32 texture_page;
}
}
+void update_texture_cache_region(psx_gpu_struct *psx_gpu, u32 x1, u32 y1,
+ u32 x2, u32 y2)
+{
+ s32 w = x2 - x1;
+ do
+ {
+ x2 = x1 + w;
+ if (x2 > 1023)
+ x2 = 1023;
+ update_texture_cache_region_(psx_gpu, x1, y1, x2, y2);
+ w -= x2 - x1;
+ x1 = 0;
+ }
+ while (unlikely(w > 0));
+}
+
#ifndef NEON_BUILD
void update_texture_4bpp_cache(psx_gpu_struct *psx_gpu)
printf("mismatch on %s %s: %x vs %x\n", #_a, #_b, _a, _b) \
-#ifndef NDEBUG
-#define setup_spans_debug_check(span_edge_data_element) \
-{ \
- u32 _num_spans = &span_edge_data_element - psx_gpu->span_edge_data; \
- if (_num_spans > MAX_SPANS) \
- *(volatile int *)0 = 1; \
- if (_num_spans < psx_gpu->num_spans) \
- { \
- if(span_edge_data_element.num_blocks > MAX_BLOCKS_PER_ROW) \
- *(volatile int *)0 = 2; \
- if(span_edge_data_element.y >= 2048) \
- *(volatile int *)0 = 3; \
- } \
-} \
-
+#if !defined(NEON_BUILD) && !defined(NDEBUG)
+static void setup_spans_debug_check(psx_gpu_struct *psx_gpu,
+ edge_data_struct *span_edge_data_element)
+{
+ u32 _num_spans = span_edge_data_element - psx_gpu->span_edge_data;
+ if (_num_spans > MAX_SPANS)
+ *(volatile int *)0 = 1;
+ if (_num_spans < psx_gpu->num_spans)
+ {
+ if(span_edge_data_element->num_blocks > MAX_BLOCKS_PER_ROW)
+ *(volatile int *)0 = 2;
+ if(span_edge_data_element->y >= 2048)
+ *(volatile int *)0 = 3;
+ }
+}
#else
-#define setup_spans_debug_check(span_edge_data_element) \
-
+#define setup_spans_debug_check(psx_gpu, span_edge_data_element)
#endif
#define setup_spans_prologue_alternate_yes() \
span_b_offset = psx_gpu->span_b_offset; \
\
vec_8x16u c_0x0001; \
+ vec_4x16u c_max_blocks_per_row; \
\
dup_8x16b(c_0x0001, 0x0001); \
dup_8x16b(left_edge, psx_gpu->viewport_start_x); \
dup_4x16b(c_0x04, 0x04); \
dup_4x16b(c_0x07, 0x07); \
dup_4x16b(c_0xFFFE, 0xFFFE); \
+ dup_4x16b(c_max_blocks_per_row, MAX_BLOCKS_PER_ROW); \
#define compute_edge_delta_x2() \
and_4x16b(span_shift, left_right_x_16.high, c_0x07); \
shl_variable_4x16b(span_shift, c_0xFFFE, span_shift); \
shr_4x16b(left_right_x_16.high, left_right_x_16.high, 3); \
+ min_4x16b(left_right_x_16.high, left_right_x_16.high, c_max_blocks_per_row); \
\
u32 i; \
for(i = 0; i < 4; i++) \
span_edge_data[i].num_blocks = left_right_x_16.high.e[i]; \
span_edge_data[i].right_mask = span_shift.e[i]; \
span_edge_data[i].y = y_x4.e[i]; \
- setup_spans_debug_check(span_edge_data[i]); \
+ setup_spans_debug_check(psx_gpu, &span_edge_data[i]); \
} \
\
span_edge_data += 4; \
\
setup_spans_prologue_b(); \
\
- if(height > 0) \
+ if (height > 512) \
+ height = 512; \
+ if (height > 0) \
{ \
y_x4.e[0] = y_a; \
y_x4.e[1] = y_a + 1; \
\
setup_spans_prologue_b(); \
\
- if(height > 0) \
+ if (height > 512) \
+ height = 512; \
+ if (height > 0) \
{ \
y_x4.e[0] = y_a; \
y_x4.e[1] = y_a - 1; \
setup_spans_prologue_b();
- if(height_minor_a > 0)
+ if (height_minor_a > 512)
+ height_minor_a = 512;
+ if (height_minor_a > 0)
{
y_x4.e[0] = y_a;
y_x4.e[1] = y_a - 1;
setup_spans_clip(increment, no);
}
- if(height_minor_b > 0)
+ if (height_minor_b > 512)
+ height_minor_b = 512;
+ if (height_minor_b > 0)
{
y_x4.e[0] = y_a;
y_x4.e[1] = y_a + 1;
}
}
}
+ assert(psx_gpu->span_edge_data[0].y < 1024u);
u32 render_state = flags &
(RENDER_FLAGS_MODULATE_TEXELS | RENDER_FLAGS_BLEND |
#ifndef NEON_BUILD
-void setup_sprite_untextured(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u,
+void setup_sprite_untextured_512(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u,
s32 v, s32 width, s32 height, u32 color)
{
- if((psx_gpu->render_state & (RENDER_STATE_MASK_EVALUATE |
- RENDER_FLAGS_MODULATE_TEXELS | RENDER_FLAGS_BLEND)) == 0 &&
- (psx_gpu->render_mode & RENDER_INTERLACE_ENABLED) == 0)
- {
- setup_sprite_untextured_simple(psx_gpu, x, y, u, v, width, height, color);
- return;
- }
-
u32 right_width = ((width - 1) & 0x7) + 1;
u32 right_mask_bits = (0xFF << right_width);
u16 *fb_ptr = psx_gpu->vram_out_ptr + (y * 1024) + x;
#endif
-void setup_sprite_untextured_simple(psx_gpu_struct *psx_gpu, s32 x, s32 y,
- s32 u, s32 v, s32 width, s32 height, u32 color)
+static void __attribute__((noinline))
+setup_sprite_untextured_simple(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u,
+ s32 v, s32 width, s32 height, u32 color)
{
u32 r = color & 0xFF;
u32 g = (color >> 8) & 0xFF;
u32 num_width;
- if(psx_gpu->num_blocks > MAX_BLOCKS)
+ if(psx_gpu->num_blocks)
{
flush_render_block_buffer(psx_gpu);
}
}
}
+void setup_sprite_untextured_512(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u,
+ s32 v, s32 width, s32 height, u32 color);
+
+void setup_sprite_untextured(psx_gpu_struct *psx_gpu, s32 x, s32 y, s32 u,
+ s32 v, s32 width, s32 height, u32 color)
+{
+ if((psx_gpu->render_state & (RENDER_STATE_MASK_EVALUATE |
+ RENDER_FLAGS_MODULATE_TEXELS | RENDER_FLAGS_BLEND)) == 0 &&
+ (psx_gpu->render_mode & RENDER_INTERLACE_ENABLED) == 0)
+ {
+ setup_sprite_untextured_simple(psx_gpu, x, y, u, v, width, height, color);
+ return;
+ }
+
+ while (width > 0)
+ {
+ s32 w1 = width > 512 ? 512 : width;
+ setup_sprite_untextured_512(psx_gpu, x, y, 0, 0, w1, height, color);
+ x += 512;
+ width -= 512;
+ }
+}
+
#define setup_sprite_blocks_switch_textured(texture_mode) \
setup_sprite_##texture_mode \
}
}
+#ifndef PCSX
void render_block_copy(psx_gpu_struct *psx_gpu, u16 *source, u32 x, u32 y,
u32 width, u32 height, u32 pitch)
{
render_block_copy(psx_gpu, psx_gpu->vram_ptr + source_x + (source_y * 1024),
dest_x, dest_y, width, height, 1024);
}
-
+#endif
void initialize_reciprocal_table(void)
{
psx_gpu->texture_page_ptr = psx_gpu->vram_ptr;
psx_gpu->clut_ptr = psx_gpu->vram_ptr;
+ psx_gpu->viewport_start_x = psx_gpu->viewport_start_y = 0;
+ psx_gpu->viewport_end_x = psx_gpu->viewport_end_y = 0;
psx_gpu->mask_msb = 0;
psx_gpu->texture_window_x = 0;
psx_gpu->primitive_type = PRIMITIVE_TYPE_UNKNOWN;
- psx_gpu->enhancement_x_threshold = 256;
+ psx_gpu->saved_hres = 256;
}
u64 get_us(void)
#endif
#include "psx_gpu_4x.c"
+
+// vim:ts=2:sw=2:expandtab