Xbox: Simplify clearing slightly

This commit is contained in:
UnknownShadow200 2025-09-02 20:51:26 +10:00
parent f701f9a9cb
commit f5541e7518
2 changed files with 42 additions and 14 deletions

View File

@ -96,6 +96,10 @@ static void ResetState(void) {
// the order ClassiCube specifies quad vertices in are in the wrong order
// compared to what the GPU expects for front and back facing quads
int width = pb_back_buffer_width();
int height = pb_back_buffer_height();
p = NV2A_set_clear_rect(p, 0, 0, width, height);
pb_end(p);
}
@ -281,10 +285,10 @@ void Gfx_BindTexture(GfxResourceID texId) {
/*########################################################################################################################*
*-----------------------------------------------------State management----------------------------------------------------*
*#########################################################################################################################*/
static PackedCol clearColor;
void Gfx_ClearColor(PackedCol color) {
clearColor = color;
uint32_t* p = pb_begin();
p = NV2A_set_clear_colour(p, color);
pb_end(p);
}
void Gfx_SetFaceCulling(cc_bool enabled) {
@ -360,17 +364,16 @@ void Gfx_BeginFrame(void) {
pb_wait_for_vbl();
pb_reset();
pb_target_back_buffer();
uint32_t* p = pb_begin();
p = NV2A_reset_control0(p);
pb_end(p);
}
void Gfx_ClearBuffers(GfxBuffers buffers) {
int width = pb_back_buffer_width();
int height = pb_back_buffer_height();
// TODO do ourselves
if (buffers & GFX_BUFFER_DEPTH)
pb_erase_depth_stencil_buffer(0, 0, width, height);
if (buffers & GFX_BUFFER_COLOR)
pb_fill(0, 0, width, height, clearColor);
uint32_t* p = pb_begin();
p = NV2A_start_clear(p, buffers & GFX_BUFFER_COLOR, buffers & GFX_BUFFER_DEPTH);
pb_end(p);
//pb_erase_text_screen();
while (pb_busy()) { } // Wait for completion TODO: necessary??
@ -540,9 +543,6 @@ static struct Matrix _view, _proj, _mvp;
static void UpdateVSConstants(void) {
uint32_t* p;
p = pb_begin();
// TODO: Have to call this to avoid graphical artifacts. Figure out why
p = NV2A_reset_control0(p);
p = NV2A_set_constant_upload_offset(p, 0);

View File

@ -78,3 +78,31 @@ static uint32_t* NV2A_set_vertex_attrib_format(uint32_t* p, int index, int forma
MASK(NV097_SET_VERTEX_DATA_ARRAY_FORMAT_SIZE, size) |
MASK(NV097_SET_VERTEX_DATA_ARRAY_FORMAT_STRIDE, stride));
}
/*########################################################################################################################*
*------------------------------------------------------Buffer clearing----------------------------------------------------*
*#########################################################################################################################*/
static CC_INLINE uint32_t* NV2A_set_clear_rect(uint32_t* p, int x, int y, int w, int h) {
// Sets NV097_SET_CLEAR_RECT_HORIZONTAL then NV097_SET_CLEAR_RECT_VERTICAL
return pb_push2(p, NV097_SET_CLEAR_RECT_HORIZONTAL,
((x + w - 1) << 16) | x,
((y + h - 1) << 16) | y);
}
static CC_INLINE uint32_t* NV2A_set_clear_colour(uint32_t* p, uint32_t colour) {
// Sets NV097_SET_ZSTENCIL_CLEAR_VALUE then NV097_SET_COLOR_CLEAR_VALUE
return pb_push2(p, NV097_SET_ZSTENCIL_CLEAR_VALUE,
0xFFFFFF00, // (depth << 8) | stencil
colour);
}
static CC_INLINE uint32_t* NV2A_start_clear(uint32_t* p, int color, int depth) {
uint32_t mask = 0;
if (color) mask |= NV097_CLEAR_SURFACE_COLOR;
if (depth) mask |= NV097_CLEAR_SURFACE_Z;
if (depth) mask |= NV097_CLEAR_SURFACE_STENCIL;
return pb_push1(p, NV097_CLEAR_SURFACE, mask);
}