wiiu: first attempt at using the render driver instead of WindowFramebuffer

This commit is contained in:
Ash Logan 2019-01-24 17:03:08 +11:00
parent e1f0a6e73c
commit f1cbd5536d
5 changed files with 104 additions and 13 deletions

View File

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

View File

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

View File

@ -43,6 +43,7 @@ typedef struct
GX2ContextState *ctx;
WIIU_RenderAllocData *listfree;
float u_viewSize[4];
SDL_Texture windowTex;
} WIIU_RenderData;
typedef struct

View File

@ -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 <whb/gfx.h>
#include <gx2/draw.h>
#include <gx2/state.h>
#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

View File

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