From f1cbd5536d9883059fed6bbb4bae5a14de63bea5 Mon Sep 17 00:00:00 2001 From: Ash Logan Date: Thu, 24 Jan 2019 17:03:08 +1100 Subject: [PATCH] wiiu: first attempt at using the render driver instead of WindowFramebuffer --- src/render/wiiu/SDL_rdraw_wiiu.c | 4 +- src/render/wiiu/SDL_render_wiiu.c | 17 +++--- src/render/wiiu/SDL_render_wiiu.h | 1 + src/render/wiiu/SDL_rpresent_wiiu.c | 89 +++++++++++++++++++++++++++++ src/video/wiiu/SDL_wiiuvideo.c | 6 +- 5 files changed, 104 insertions(+), 13 deletions(-) create mode 100644 src/render/wiiu/SDL_rpresent_wiiu.c diff --git a/src/render/wiiu/SDL_rdraw_wiiu.c b/src/render/wiiu/SDL_rdraw_wiiu.c index dd79fd1b1..9f2de1273 100644 --- a/src/render/wiiu/SDL_rdraw_wiiu.c +++ b/src/render/wiiu/SDL_rdraw_wiiu.c @@ -259,7 +259,7 @@ int WIIU_SDL_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects, i return 0; } -void WIIU_SDL_RenderPresent(SDL_Renderer * renderer) +/*void WIIU_SDL_RenderPresent(SDL_Renderer * renderer) { WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; @@ -273,7 +273,7 @@ void WIIU_SDL_RenderPresent(SDL_Renderer * renderer) } WIIU_FreeRenderData(data); -} +}*/ int WIIU_SDL_RenderClear(SDL_Renderer * renderer) { diff --git a/src/render/wiiu/SDL_render_wiiu.c b/src/render/wiiu/SDL_render_wiiu.c index 44dbbb8f9..5bc88ec3c 100644 --- a/src/render/wiiu/SDL_render_wiiu.c +++ b/src/render/wiiu/SDL_render_wiiu.c @@ -42,15 +42,9 @@ SDL_RenderDriver WIIU_RenderDriver; SDL_Renderer *WIIU_SDL_CreateRenderer(SDL_Window * window, Uint32 flags) { - SDL_Surface *surface; SDL_Renderer *renderer; WIIU_RenderData *data; - surface = SDL_GetWindowSurface(window); - if (!surface) { - return NULL; - } - renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer)); if (!renderer) { SDL_OutOfMemory(); @@ -108,6 +102,13 @@ SDL_Renderer *WIIU_SDL_CreateRenderer(SDL_Window * window, Uint32 flags) memset(data->ctx, 0, sizeof(GX2ContextState)); GX2SetupContextStateEx(data->ctx, TRUE); + // Allocate a buffer for the window + data->windowTex = (SDL_Texture) { + .format = SDL_PIXELFORMAT_RGBA8888, + }; + SDL_GetWindowSize(window, &data->windowTex.w, &data->windowTex.h); + WIIU_SDL_CreateTexture(renderer, &data->windowTex); + // Setup colour buffer, rendering to the window WIIU_SDL_SetRenderTarget(renderer, NULL); @@ -126,8 +127,8 @@ int WIIU_SDL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture) target = &tdata->texture.surface; } else { // Set window texture as target - WIIU_WindowData *wdata = (WIIU_WindowData *) SDL_GetWindowData(renderer->window, WIIU_WINDOW_DATA); - target = &wdata->texture.surface; + WIIU_TextureData *tdata = (WIIU_TextureData *) data->windowTex.driverdata; + target = &tdata->texture.surface; } // Update color buffer diff --git a/src/render/wiiu/SDL_render_wiiu.h b/src/render/wiiu/SDL_render_wiiu.h index 22726e7da..77a5e5a64 100644 --- a/src/render/wiiu/SDL_render_wiiu.h +++ b/src/render/wiiu/SDL_render_wiiu.h @@ -43,6 +43,7 @@ typedef struct GX2ContextState *ctx; WIIU_RenderAllocData *listfree; float u_viewSize[4]; + SDL_Texture windowTex; } WIIU_RenderData; typedef struct diff --git a/src/render/wiiu/SDL_rpresent_wiiu.c b/src/render/wiiu/SDL_rpresent_wiiu.c new file mode 100644 index 000000000..36b991429 --- /dev/null +++ b/src/render/wiiu/SDL_rpresent_wiiu.c @@ -0,0 +1,89 @@ +#include "../../SDL_internal.h" + +#if SDL_VIDEO_RENDER_WIIU + +#include "../../video/wiiu/SDL_wiiuvideo.h" +#include "../../video/wiiu/wiiu_shaders.h" +#include "../SDL_sysrender.h" +#include "SDL_hints.h" +#include "SDL_render_wiiu.h" + +#include +#include +#include + +#define SCREEN_WIDTH 1280 +#define SCREEN_HEIGHT 720 + +static const float u_viewSize[4] = {(float)SCREEN_WIDTH, (float)SCREEN_HEIGHT}; +static const float u_mod[4] = {1.0f, 1.0f, 1.0f, 1.0f}; + +//TODO +static const float a_position[2 * 4] = { + 0.0f, 0.0f, + 1280.0f, 0.0f, + 1280.0f, 720.0f, + 0.0f, 720.0f, +}; + +static const float a_texCoorssd[] = +{ + 0.0f, (float)SCREEN_HEIGHT, + (float)SCREEN_WIDTH, (float)SCREEN_HEIGHT, + (float)SCREEN_WIDTH, 0.0f, + 0.0f, 0.0f, +}; + +static void render_scene(WIIU_RenderData *data) { + WIIU_TextureData *tdata = (WIIU_TextureData *) data->windowTex.driverdata; + float tex_w = tdata->u_texSize[0]; + float tex_h = tdata->u_texSize[1]; + + float* a_texCoord = WIIU_AllocRenderData(data, sizeof(float) * 2 * 4); + float a_texCoord_vals[] = { + 0.0f, tex_h, + tex_w, tex_h, + tex_w, 0.0f, + 0.0f, 0.0f, + }; + memcpy(a_texCoord, a_texCoord_vals, sizeof(float) * 2 * 4); + + WHBGfxClearColor(0.0f, 0.0f, 0.0f, 1.0f); + wiiuSetTextureShader(); + + GX2SetVertexUniformReg(wiiuTextureShader.vertexShader->uniformVars[0].offset, 4, (uint32_t *)u_viewSize); + GX2SetVertexUniformReg(wiiuTextureShader.vertexShader->uniformVars[1].offset, 4, (uint32_t *)tdata->u_texSize); + GX2SetPixelUniformReg(wiiuTextureShader.pixelShader->uniformVars[0].offset, 4, (uint32_t*)u_mod); + + GX2SetAttribBuffer(0, sizeof(float) * 8, sizeof(float) * 2, (void*)a_position); + GX2SetAttribBuffer(1, sizeof(float) * 8, sizeof(float) * 2, (void*)a_texCoord); + + GX2SetPixelTexture(&tdata->texture, wiiuTextureShader.pixelShader->samplerVars[0].location); + GX2SetPixelSampler(&tdata->sampler, wiiuTextureShader.pixelShader->samplerVars[0].location); + + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, 4, 0, 1); +} + +void WIIU_SDL_RenderPresent(SDL_Renderer * renderer) +{ + WIIU_RenderData *data = (WIIU_RenderData *) renderer->driverdata; + //SDL_Window *window = renderer->window; + + //GX2Flush(); + + WHBGfxBeginRender(); + + WHBGfxBeginRenderTV(); + render_scene(data); + WHBGfxFinishRenderTV(); + + WHBGfxBeginRenderDRC(); + render_scene(data); + WHBGfxFinishRenderDRC(); + + WHBGfxFinishRender(); + + WIIU_FreeRenderData(data); +} + +#endif //SDL_VIDEO_RENDER_WIIU diff --git a/src/video/wiiu/SDL_wiiuvideo.c b/src/video/wiiu/SDL_wiiuvideo.c index 6a8392de7..3ba8abaab 100644 --- a/src/video/wiiu/SDL_wiiuvideo.c +++ b/src/video/wiiu/SDL_wiiuvideo.c @@ -275,9 +275,9 @@ static SDL_VideoDevice *WIIU_CreateDevice(int devindex) device->VideoQuit = WIIU_VideoQuit; device->SetDisplayMode = WIIU_SetDisplayMode; device->PumpEvents = WIIU_PumpEvents; - device->CreateWindowFramebuffer = WIIU_CreateWindowFramebuffer; - device->UpdateWindowFramebuffer = WIIU_UpdateWindowFramebuffer; - device->DestroyWindowFramebuffer = WIIU_DestroyWindowFramebuffer; + //device->CreateWindowFramebuffer = WIIU_CreateWindowFramebuffer; + //device->UpdateWindowFramebuffer = WIIU_UpdateWindowFramebuffer; + //device->DestroyWindowFramebuffer = WIIU_DestroyWindowFramebuffer; device->free = WIIU_DeleteDevice;