From 551dfa716fabf400a64d33efc003690e67f3a094 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 22 Mar 2024 07:51:51 +1100 Subject: [PATCH] Change Gfx_Clear to allow separately clearing colour and depth buffer --- src/Game.c | 2 +- src/Graphics.h | 10 ++++++++-- src/Graphics_3DS.c | 10 +++++++--- src/Graphics_D3D11.c | 15 +++++++++++---- src/Graphics_D3D9.c | 9 ++++++--- src/Graphics_Dreamcast.c | 4 +++- src/Graphics_GCWii.c | 3 ++- src/Graphics_N64.c | 10 +++++++--- src/Graphics_NDS.c | 3 ++- src/Graphics_PS2.c | 3 ++- src/Graphics_PS3.c | 9 ++++++--- src/Graphics_PSP.c | 9 ++++++++- src/Graphics_PSVita.c | 3 ++- src/Graphics_SoftGPU.c | 10 +++++++--- src/Graphics_WiiU.c | 3 ++- src/Graphics_Xbox.c | 10 ++++++---- src/Graphics_Xbox360.c | 3 ++- src/Window_PS3.c | 2 +- src/_GLShared.h | 8 ++++++-- 19 files changed, 89 insertions(+), 37 deletions(-) diff --git a/src/Game.c b/src/Game.c index f6ef6de50..f8bf01431 100644 --- a/src/Game.c +++ b/src/Game.c @@ -625,7 +625,7 @@ static void Game_RenderFrame(double delta) { /* TODO: Not calling Gfx_EndFrame doesn't work with Direct3D9 */ if (Window_Main.Inactive) return; - Gfx_Clear(); + Gfx_ClearBuffers(GFX_BUFFER_COLOR | GFX_BUFFER_DEPTH); Gfx_LoadMatrix(MATRIX_PROJECTION, &Gfx.Projection); Gfx_LoadMatrix(MATRIX_VIEW, &Gfx.View); diff --git a/src/Graphics.h b/src/Graphics.h index 2281c58cb..5b76e72c2 100644 --- a/src/Graphics.h +++ b/src/Graphics.h @@ -70,6 +70,11 @@ extern const cc_string Gfx_LowPerfMessage; #define GFX_MAX_INDICES (65536 / 4 * 6) #define GFX_MAX_VERTICES 65536 +typedef enum GfxBuffers_ { + GFX_BUFFER_COLOR = 1, + GFX_BUFFER_DEPTH = 2 +} GfxBuffers; + /* Texture should persist across gfx context loss (if backend supports ManagedTextures) */ #define TEXTURE_FLAG_MANAGED 0x01 /* Texture should allow updating via Gfx_UpdateTexture */ @@ -132,8 +137,9 @@ CC_API void Gfx_SetAlphaBlending(cc_bool enabled); /* Sets whether blending between the alpha components of texture and vertex colour is performed */ CC_API void Gfx_SetAlphaArgBlend(cc_bool enabled); -/* Clears the colour and depth buffer to default */ -CC_API void Gfx_Clear(void); +/* Clears the given rendering buffer(s) to default. */ +/* buffers can be either GFX_BUFFER_COLOR or GFX_BUFFER_DEPTH, or both */ +CC_API void Gfx_ClearBuffers(GfxBuffers buffers); /* Sets the colour that the colour buffer is cleared to */ CC_API void Gfx_ClearColor(PackedCol color); /* Sets whether pixels may be discard based on z/depth */ diff --git a/src/Graphics_3DS.c b/src/Graphics_3DS.c index dfc17a186..eff743854 100644 --- a/src/Graphics_3DS.c +++ b/src/Graphics_3DS.c @@ -426,9 +426,13 @@ void Gfx_BeginFrame(void) { C3D_FrameDrawOn(topTarget); } -void Gfx_Clear(void) { - C3D_RenderTargetClear(topTarget, C3D_CLEAR_ALL, clear_color, 0); - C3D_RenderTargetClear(bottomTarget, C3D_CLEAR_ALL, 0, 0); +void Gfx_ClearBuffers(GfxBuffers buffers) { + int targets = 0; + if (buffers & GFX_BUFFER_COLOR) targets |= C3D_CLEAR_COLOR; + if (buffers & GFX_BUFFER_DEPTH) targets |= C3D_CLEAR_DEPTH; + + C3D_RenderTargetClear(topTarget, targets, clear_color, 0); + C3D_RenderTargetClear(bottomTarget, targets, 0, 0); } void Gfx_EndFrame(void) { diff --git a/src/Graphics_D3D11.c b/src/Graphics_D3D11.c index 5fee37323..f42f0cf28 100644 --- a/src/Graphics_D3D11.c +++ b/src/Graphics_D3D11.c @@ -899,9 +899,13 @@ static float gfx_clearColor[4]; static cc_bool gfx_alphaBlending, gfx_colorEnabled = true; static cc_bool gfx_depthTest, gfx_depthWrite; -static void OM_Clear(void) { - ID3D11DeviceContext_ClearRenderTargetView(context, backbuffer, gfx_clearColor); - ID3D11DeviceContext_ClearDepthStencilView(context, depthbufferView, D3D11_CLEAR_DEPTH, 0.0f, 0); +static void OM_Clear(GfxBuffers buffers) { + if (buffers & GFX_BUFFER_COLOR) { + ID3D11DeviceContext_ClearRenderTargetView(context, backbuffer, gfx_clearColor); + } + if (buffers & GFX_BUFFER_DEPTH) { + ID3D11DeviceContext_ClearDepthStencilView(context, depthbufferView, D3D11_CLEAR_DEPTH, 0.0f, 0); + } } static void OM_UpdateTarget(void) { @@ -1108,7 +1112,10 @@ void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) { gfx_vsync = vsync; } void Gfx_BeginFrame(void) { OM_UpdateTarget(); } -void Gfx_Clear(void) { OM_Clear(); } + +void Gfx_ClearBuffers(GfxBuffers buffers) { + OM_Clear(buffers); +} void Gfx_EndFrame(void) { // https://docs.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-present diff --git a/src/Graphics_D3D9.c b/src/Graphics_D3D9.c index eacd9f863..465c23a76 100644 --- a/src/Graphics_D3D9.c +++ b/src/Graphics_D3D9.c @@ -844,9 +844,12 @@ void Gfx_BeginFrame(void) { IDirect3DDevice9_BeginScene(device); } -void Gfx_Clear(void) { - DWORD flags = D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER; - cc_result res = IDirect3DDevice9_Clear(device, 0, NULL, flags, gfx_clearColor, 0.0f, 0); +void Gfx_ClearBuffers(GfxBuffers buffers) { + DWORD targets = 0; + if (buffers & GFX_BUFFER_COLOR) targets |= D3DCLEAR_TARGET; + if (buffers & GFX_BUFFER_DEPTH) targets |= D3DCLEAR_ZBUFFER; + + cc_result res = IDirect3DDevice9_Clear(device, 0, NULL, targets, gfx_clearColor, 0.0f, 0); if (res) Logger_Abort2(res, "D3D9_Clear"); } diff --git a/src/Graphics_Dreamcast.c b/src/Graphics_Dreamcast.c index 37dc2bfa7..0aa3d7cb3 100644 --- a/src/Graphics_Dreamcast.c +++ b/src/Graphics_Dreamcast.c @@ -531,7 +531,9 @@ void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) { } void Gfx_BeginFrame(void) { } -void Gfx_Clear(void) { + +void Gfx_ClearBuffers(GfxBuffers buffers) { + // TODO clear only some buffers // no need to use glClear } diff --git a/src/Graphics_GCWii.c b/src/Graphics_GCWii.c index c3c47d895..d5eb44973 100644 --- a/src/Graphics_GCWii.c +++ b/src/Graphics_GCWii.c @@ -253,7 +253,8 @@ void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) { void Gfx_BeginFrame(void) { } -void Gfx_Clear(void) { +void Gfx_ClearBuffers(GfxBuffers buffers) { + // TODO clear only some buffers } void Gfx_EndFrame(void) { diff --git a/src/Graphics_N64.c b/src/Graphics_N64.c index 82b559eca..d03622bec 100644 --- a/src/Graphics_N64.c +++ b/src/Graphics_N64.c @@ -90,10 +90,14 @@ void Gfx_BeginFrame(void) { extern void __rdpq_autosync_change(int mode); static color_t gfx_clearColor; -void Gfx_Clear(void) { + +void Gfx_ClearBuffers(GfxBuffers buffers) { __rdpq_autosync_change(AUTOSYNC_PIPE); - rdpq_clear(gfx_clearColor); - rdpq_clear_z(0xFFFC); + + if (buffers & GFX_BUFFER_COLOR) + rdpq_clear(gfx_clearColor); + if (buffers & GFX_BUFFER_DEPTH) + rdpq_clear_z(0xFFFC); } void Gfx_ClearColor(PackedCol color) { diff --git a/src/Graphics_NDS.c b/src/Graphics_NDS.c index 5a649829c..a0c00a588 100644 --- a/src/Graphics_NDS.c +++ b/src/Graphics_NDS.c @@ -61,7 +61,8 @@ void Gfx_BeginFrame(void) { Platform_LogConst("FRAME"); } -void Gfx_Clear(void) { +void Gfx_ClearBuffers(GfxBuffers buffers) { + // TODO } void Gfx_ClearColor(PackedCol color) { diff --git a/src/Graphics_PS2.c b/src/Graphics_PS2.c index 2f1d070f5..017cd4dfd 100644 --- a/src/Graphics_PS2.c +++ b/src/Graphics_PS2.c @@ -298,7 +298,8 @@ void Gfx_SetAlphaBlending(cc_bool enabled) { void Gfx_SetAlphaArgBlend(cc_bool enabled) { } -void Gfx_Clear(void) { +void Gfx_ClearBuffers(GfxBuffers buffers) { + // TODO clear only some buffers q = draw_disable_tests(q, 0, &fb_depth); q = draw_clear(q, 0, 2048.0f - fb_color.width / 2.0f, 2048.0f - fb_color.height / 2.0f, fb_color.width, fb_color.height, clearR, clearG, clearB); diff --git a/src/Graphics_PS3.c b/src/Graphics_PS3.c index 7f4208c53..b142dcdfb 100644 --- a/src/Graphics_PS3.c +++ b/src/Graphics_PS3.c @@ -432,9 +432,12 @@ void Gfx_BeginFrame(void) { gcmResetFlipStatus(); } -void Gfx_Clear(void) { - rsxClearSurface(context, GCM_CLEAR_R | GCM_CLEAR_G | GCM_CLEAR_B | GCM_CLEAR_A - | GCM_CLEAR_S | GCM_CLEAR_Z); +void Gfx_ClearBuffers(GfxBuffers buffers) { + int targets = 0; + if (buffers & GFX_BUFFER_COLOR) targets |= (GCM_CLEAR_R | GCM_CLEAR_G | GCM_CLEAR_B | GCM_CLEAR_A); + if (buffers & GFX_BUFFER_DEPTH) targets |= (GCM_CLEAR_S | GCM_CLEAR_Z); + + rsxClearSurface(context, targets); } void Gfx_EndFrame(void) { diff --git a/src/Graphics_PSP.c b/src/Graphics_PSP.c index 26b3865a2..308c0884b 100644 --- a/src/Graphics_PSP.c +++ b/src/Graphics_PSP.c @@ -250,7 +250,14 @@ void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) { void Gfx_BeginFrame(void) { sceGuStart(GU_DIRECT, list); } -void Gfx_Clear(void) { sceGuClear(GU_COLOR_BUFFER_BIT | GU_DEPTH_BUFFER_BIT); } + +void Gfx_ClearBuffers(GfxBuffers buffers) { + int targets = 0; + if (buffers & GFX_BUFFER_COLOR) targets |= GU_COLOR_BUFFER_BIT; + if (buffers & GFX_BUFFER_DEPTH) targets |= GU_DEPTH_BUFFER_BIT; + + sceGuClear(targets); +} void Gfx_EndFrame(void) { sceGuFinish(); diff --git a/src/Graphics_PSVita.c b/src/Graphics_PSVita.c index 3178bbbf0..2ef543520 100644 --- a/src/Graphics_PSVita.c +++ b/src/Graphics_PSVita.c @@ -1117,7 +1117,8 @@ void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { } -void Gfx_Clear(void) { +void Gfx_ClearBuffers(GfxBuffers buffers) { + // TODO clear only some buffers static struct GPUBuffer* clearVB; if (!clearVB) { clearVB = GPUBuffer_Alloc(4 * sizeof(struct VertexColoured)); diff --git a/src/Graphics_SoftGPU.c b/src/Graphics_SoftGPU.c index 989dbbe77..f1106e71e 100644 --- a/src/Graphics_SoftGPU.c +++ b/src/Graphics_SoftGPU.c @@ -131,11 +131,15 @@ void Gfx_SetAlphaBlending(cc_bool enabled) { void Gfx_SetAlphaArgBlend(cc_bool enabled) { } -void Gfx_Clear(void) { +void Gfx_ClearBuffers(GfxBuffers buffers) { int i, size = width * height; - for (i = 0; i < size; i++) colorBuffer[i] = clearColor; - for (i = 0; i < size; i++) depthBuffer[i] = 1.0f; + if (buffers & GFX_BUFFER_COLOR) { + for (i = 0; i < size; i++) colorBuffer[i] = clearColor; + } + if (buffers & GFX_BUFFER_DEPTH) { + for (i = 0; i < size; i++) depthBuffer[i] = 1.0f; + } } void Gfx_ClearColor(PackedCol color) { diff --git a/src/Graphics_WiiU.c b/src/Graphics_WiiU.c index 8f724d8cd..035f902f5 100644 --- a/src/Graphics_WiiU.c +++ b/src/Graphics_WiiU.c @@ -267,7 +267,8 @@ void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) { void Gfx_BeginFrame(void) { } -void Gfx_Clear(void) { +void Gfx_ClearBuffers(GfxBuffers buffers) { + // TODO } void Gfx_EndFrame(void) { diff --git a/src/Graphics_Xbox.c b/src/Graphics_Xbox.c index df5c10344..0ecfcc2da 100644 --- a/src/Graphics_Xbox.c +++ b/src/Graphics_Xbox.c @@ -368,15 +368,17 @@ void Gfx_BeginFrame(void) { pb_target_back_buffer(); } -void Gfx_Clear(void) { +void Gfx_ClearBuffers(GfxBuffers buffers) { int width = pb_back_buffer_width(); int height = pb_back_buffer_height(); // TODO do ourselves - pb_erase_depth_stencil_buffer(0, 0, width, height); - pb_fill(0, 0, width, height, clearColor); - //pb_erase_text_screen(); + 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); + //pb_erase_text_screen(); while (pb_busy()) { } // Wait for completion TODO: necessary?? } diff --git a/src/Graphics_Xbox360.c b/src/Graphics_Xbox360.c index 95f36e9aa..fd5d79d3b 100644 --- a/src/Graphics_Xbox360.c +++ b/src/Graphics_Xbox360.c @@ -345,7 +345,8 @@ void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) { void Gfx_BeginFrame(void) { } -void Gfx_Clear(void) { +void Gfx_ClearBuffers(GfxBuffers buffers) { + // TODO clear only some buffers // Xe_Clear is just a Resolve anyways } diff --git a/src/Window_PS3.c b/src/Window_PS3.c index cba646d3c..d9e200f22 100644 --- a/src/Window_PS3.c +++ b/src/Window_PS3.c @@ -333,7 +333,7 @@ void Window_AllocFramebuffer(struct Bitmap* bmp) { void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) { // TODO test Gfx_BeginFrame(); - Gfx_Clear(); + Gfx_ClearBuffers(GFX_BUFFER_COLOR | GFX_BUFFER_DEPTH); // TODO: Only transfer dirty region instead of the entire bitmap Gfx_TransferImage(fb_offset, bmp->width, bmp->height); Gfx_EndFrame(); diff --git a/src/_GLShared.h b/src/_GLShared.h index 15a0a60f0..c6d7fa10d 100644 --- a/src/_GLShared.h +++ b/src/_GLShared.h @@ -297,8 +297,12 @@ void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) { } void Gfx_BeginFrame(void) { } -void Gfx_Clear(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +void Gfx_ClearBuffers(GfxBuffers buffers) { + int targets = 0; + if (buffers & GFX_BUFFER_COLOR) targets |= GL_COLOR_BUFFER_BIT; + if (buffers & GFX_BUFFER_DEPTH) targets |= GL_DEPTH_BUFFER_BIT; + + glClear(targets); } void Gfx_EndFrame(void) {