From e0744aa0a5bc5e2db2b1ff5fcd25726c8b2f80ae Mon Sep 17 00:00:00 2001 From: Ash Logan Date: Mon, 6 Jan 2020 13:03:05 +1100 Subject: [PATCH] render/wiiu: Reset context state, make an attempt at supporting viewport --- src/render/wiiu/SDL_render_wiiu.c | 11 ++++++++--- src/render/wiiu/SDL_render_wiiu.h | 2 +- src/render/wiiu/SDL_rpresent_wiiu.c | 3 +-- src/render/wiiu/SDL_rwindow_wiiu.c | 5 ++++- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/render/wiiu/SDL_render_wiiu.c b/src/render/wiiu/SDL_render_wiiu.c index fdc3acdc1..2ef7b5566 100644 --- a/src/render/wiiu/SDL_render_wiiu.c +++ b/src/render/wiiu/SDL_render_wiiu.c @@ -159,12 +159,17 @@ void WIIU_SDL_CreateWindowTex(SDL_Renderer * renderer, SDL_Window * window) } int WIIU_SDL_RunCommandQueue(SDL_Renderer* renderer, SDL_RenderCommand* cmd, void* vertexes, size_t vertsize) { - //todo set gpu context + WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; + /* Set context state for all upcoming GX2 calls */ + GX2SetContextState(data->ctx); while (cmd) { switch (cmd->command) { + case SDL_RENDERCMD_SETVIEWPORT: { + WIIU_SDL_UpdateViewport(renderer, cmd->data.viewport.rect); + break; + } case SDL_RENDERCMD_CLEAR: { - WIIU_RenderData* data = (WIIU_RenderData*) renderer->driverdata; SDL_Texture* target = WIIU_GetRenderTarget(renderer); WIIU_TextureData* tdata = (WIIU_TextureData*) target->driverdata; @@ -220,7 +225,7 @@ int WIIU_SDL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture) /* These may be unnecessary - see SDL_render.c: SDL_SetRenderTarget's calls to UpdateViewport and UpdateClipRect. TODO for once the render is basically working */ - GX2SetViewport(0, 0, (float)tdata->cbuf.surface.width, (float)tdata->cbuf.surface.height, 0.0f, 1.0f); + //GX2SetViewport(0, 0, (float)tdata->cbuf.surface.width - 600, (float)tdata->cbuf.surface.height, 0.0f, 1.0f); GX2SetScissor(0, 0, (float)tdata->cbuf.surface.width, (float)tdata->cbuf.surface.height); return 0; diff --git a/src/render/wiiu/SDL_render_wiiu.h b/src/render/wiiu/SDL_render_wiiu.h index fc5eb92df..ac0ed5dd5 100644 --- a/src/render/wiiu/SDL_render_wiiu.h +++ b/src/render/wiiu/SDL_render_wiiu.h @@ -117,7 +117,7 @@ int WIIU_SDL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, void **pixels, int *pitch); void WIIU_SDL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); int WIIU_SDL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture); -int WIIU_SDL_UpdateViewport(SDL_Renderer * renderer); +int WIIU_SDL_UpdateViewport(SDL_Renderer * renderer, SDL_Rect vp); int WIIU_SDL_UpdateClipRect(SDL_Renderer * renderer); int WIIU_SDL_RunCommandQueue(SDL_Renderer* renderer, SDL_RenderCommand* cmd, void* vertexes, size_t vertsize); diff --git a/src/render/wiiu/SDL_rpresent_wiiu.c b/src/render/wiiu/SDL_rpresent_wiiu.c index 18adae8e1..6cd93ea71 100644 --- a/src/render/wiiu/SDL_rpresent_wiiu.c +++ b/src/render/wiiu/SDL_rpresent_wiiu.c @@ -150,8 +150,7 @@ void WIIU_SDL_RenderPresent(SDL_Renderer * renderer) WIIU_FreeRenderData(data); WIIU_TextureDoneRendering(data); - /* Restore SDL context state */ - GX2SetContextState(data->ctx); + /* SDL context state will be restored in next RunCommandQueue call */ } #endif /* SDL_VIDEO_RENDER_WIIU */ diff --git a/src/render/wiiu/SDL_rwindow_wiiu.c b/src/render/wiiu/SDL_rwindow_wiiu.c index fff15be94..3bdbd7c49 100644 --- a/src/render/wiiu/SDL_rwindow_wiiu.c +++ b/src/render/wiiu/SDL_rwindow_wiiu.c @@ -26,6 +26,8 @@ #include "../SDL_sysrender.h" #include "SDL_render_wiiu.h" +#include + void WIIU_SDL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) { if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { @@ -48,8 +50,9 @@ int WIIU_SDL_GetOutputSize(SDL_Renderer * renderer, int *w, int *h) /* We handle all viewport changes in the render functions and shaders, so we don't actually have to do anything here. SDL still requires we implement it. */ -int WIIU_SDL_UpdateViewport(SDL_Renderer * renderer) +int WIIU_SDL_UpdateViewport(SDL_Renderer * renderer, SDL_Rect vp) { + GX2SetViewport(vp.x, vp.y, vp.w, vp.h, 0.0f, 1.0f); return 0; }