render/wiiu: Reset context state, make an attempt at supporting viewport

This commit is contained in:
Ash Logan 2020-01-06 13:03:05 +11:00
parent f4724e1e0a
commit e0744aa0a5
4 changed files with 14 additions and 7 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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 */

View File

@ -26,6 +26,8 @@
#include "../SDL_sysrender.h"
#include "SDL_render_wiiu.h"
#include <gx2/registers.h>
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;
}