From 2aa1d1449c659898ab8ca24d318c4346366e4529 Mon Sep 17 00:00:00 2001 From: rw-r-r-0644 Date: Sun, 10 Mar 2019 00:46:05 +0100 Subject: [PATCH] render/wiiu: Reduce GX2SetContextState calls The function takes a fairly long time to complete --- src/render/wiiu/SDL_rdraw_wiiu.c | 8 +++----- src/render/wiiu/SDL_render_wiiu.c | 11 ++++++----- src/render/wiiu/SDL_rpresent_wiiu.c | 3 +++ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/render/wiiu/SDL_rdraw_wiiu.c b/src/render/wiiu/SDL_rdraw_wiiu.c index c277895eb..cd7740302 100644 --- a/src/render/wiiu/SDL_rdraw_wiiu.c +++ b/src/render/wiiu/SDL_rdraw_wiiu.c @@ -112,7 +112,6 @@ int WIIU_SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, GX2RUnlockBufferEx(a_texCoord, 0); /* Render */ - GX2SetContextState(data->ctx); wiiuSetTextureShader(); GX2SetPixelTexture(&tdata->texture, 0); GX2SetPixelSampler(&tdata->sampler, 0); @@ -215,7 +214,6 @@ int WIIU_SDL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, GX2RUnlockBufferEx(a_texCoord, 0); /* Render */ - GX2SetContextState(data->ctx); wiiuSetTextureShader(); GX2SetPixelTexture(&tdata->texture, 0); GX2SetPixelSampler(&tdata->sampler, 0); @@ -265,7 +263,6 @@ int WIIU_SDL_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points GX2RUnlockBufferEx(a_position, 0); /* Render points */ - GX2SetContextState(data->ctx); wiiuSetColorShader(); GX2RSetAttributeBuffer(a_position, 0, a_position->elemSize, 0); GX2SetVertexUniformReg(wiiuColorShader.vertexShader->uniformVars[0].offset, 4, (uint32_t *)&data->u_viewSize); @@ -312,7 +309,6 @@ int WIIU_SDL_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points, GX2RUnlockBufferEx(a_position, 0); /* Render lines */ - GX2SetContextState(data->ctx); wiiuSetColorShader(); GX2RSetAttributeBuffer(a_position, 0, a_position->elemSize, 0); GX2SetVertexUniformReg(wiiuColorShader.vertexShader->uniformVars[0].offset, 4, (uint32_t *)&data->u_viewSize); @@ -373,7 +369,6 @@ int WIIU_SDL_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects, i GX2RUnlockBufferEx(a_position, 0); /* Render rects */ - GX2SetContextState(data->ctx); wiiuSetColorShader(); GX2RSetAttributeBuffer(a_position, 0, a_position->elemSize, 0); GX2SetVertexUniformReg(wiiuColorShader.vertexShader->uniformVars[0].offset, 4, (uint32_t *)&data->u_viewSize); @@ -411,7 +406,10 @@ int WIIU_SDL_RenderClear(SDL_Renderer * renderer) (float)renderer->g / 255.0f, (float)renderer->b / 255.0f, (float)renderer->a / 255.0f); + + /* Restore SDL context state */ GX2SetContextState(data->ctx); + return 0; } diff --git a/src/render/wiiu/SDL_render_wiiu.c b/src/render/wiiu/SDL_render_wiiu.c index e97da9cc3..82944b86c 100644 --- a/src/render/wiiu/SDL_render_wiiu.c +++ b/src/render/wiiu/SDL_render_wiiu.c @@ -101,6 +101,12 @@ SDL_Renderer *WIIU_SDL_CreateRenderer(SDL_Window * window, Uint32 flags) data->ctx = (GX2ContextState *) memalign(GX2_CONTEXT_STATE_ALIGNMENT, sizeof(GX2ContextState)); memset(data->ctx, 0, sizeof(GX2ContextState)); GX2SetupContextStateEx(data->ctx, TRUE); + GX2SetContextState(data->ctx); + + // Setup some context state options + GX2SetAlphaTest(TRUE, GX2_COMPARE_FUNC_GREATER, 0.0f); + GX2SetDepthOnlyControl(FALSE, FALSE, GX2_COMPARE_FUNC_NEVER); + GX2SetCullOnlyControl(GX2_FRONT_FACE_CCW, FALSE, FALSE); // Make a texture for the window WIIU_SDL_CreateWindowTex(renderer, window); @@ -151,7 +157,6 @@ int WIIU_SDL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture) }; // Update context state - GX2SetContextState(data->ctx); GX2SetColorBuffer(target, GX2_RENDER_TARGET_0); // These may be unnecessary - see SDL_render.c: SDL_SetRenderTarget's calls // to UpdateViewport and UpdateClipRect. TODO for once the render is @@ -159,10 +164,6 @@ int WIIU_SDL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture) GX2SetViewport(0, 0, (float)target->surface.width, (float)target->surface.height, 0.0f, 1.0f); GX2SetScissor(0, 0, (float)target->surface.width, (float)target->surface.height); - GX2SetAlphaTest(TRUE, GX2_COMPARE_FUNC_GREATER, 0.0f); - GX2SetDepthOnlyControl(FALSE, FALSE, GX2_COMPARE_FUNC_NEVER); - GX2SetCullOnlyControl(GX2_FRONT_FACE_CCW, FALSE, FALSE); - return 0; } diff --git a/src/render/wiiu/SDL_rpresent_wiiu.c b/src/render/wiiu/SDL_rpresent_wiiu.c index 1a36b4ebf..ef7074425 100644 --- a/src/render/wiiu/SDL_rpresent_wiiu.c +++ b/src/render/wiiu/SDL_rpresent_wiiu.c @@ -122,6 +122,9 @@ void WIIU_SDL_RenderPresent(SDL_Renderer * renderer) WHBGfxFinishRender(); WIIU_FreeRenderData(data); + +/* Restore SDL context state */ + GX2SetContextState(data->ctx); } #endif //SDL_VIDEO_RENDER_WIIU