mirror of
https://github.com/yawut/SDL.git
synced 2026-07-19 01:11:38 -05:00
wiiu: first attempt at using the render driver instead of WindowFramebuffer
This commit is contained in:
parent
e1f0a6e73c
commit
f1cbd5536d
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ typedef struct
|
|||
GX2ContextState *ctx;
|
||||
WIIU_RenderAllocData *listfree;
|
||||
float u_viewSize[4];
|
||||
SDL_Texture windowTex;
|
||||
} WIIU_RenderData;
|
||||
|
||||
typedef struct
|
||||
|
|
|
|||
89
src/render/wiiu/SDL_rpresent_wiiu.c
Normal file
89
src/render/wiiu/SDL_rpresent_wiiu.c
Normal 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
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user