Cleanup and extra error-handling
This commit is contained in:
parent
ee1d777ebb
commit
1f9247e587
1 changed files with 111 additions and 104 deletions
|
@ -94,148 +94,155 @@ RenderBackend_Surface* RenderBackend_Init(const char *window_title, int screen_w
|
||||||
(void)window_title;
|
(void)window_title;
|
||||||
(void)fullscreen;
|
(void)fullscreen;
|
||||||
|
|
||||||
WHBGfxInit();
|
if (WHBGfxInit())
|
||||||
|
|
||||||
// Initialise the shaders
|
|
||||||
|
|
||||||
// Texture shader
|
|
||||||
if (WHBGfxLoadGFDShaderGroup(&texture_shader, 0, rtexture))
|
|
||||||
{
|
{
|
||||||
WHBGfxInitShaderAttribute(&texture_shader, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
// Initialise the shaders
|
||||||
WHBGfxInitShaderAttribute(&texture_shader, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
|
||||||
WHBGfxInitFetchShader(&texture_shader);
|
|
||||||
|
|
||||||
// Texture shader (with colour-key)
|
// Texture shader
|
||||||
if (WHBGfxLoadGFDShaderGroup(&texture_colour_key_shader, 0, rtexture_colour_key))
|
if (WHBGfxLoadGFDShaderGroup(&texture_shader, 0, rtexture))
|
||||||
{
|
{
|
||||||
WHBGfxInitShaderAttribute(&texture_colour_key_shader, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
WHBGfxInitShaderAttribute(&texture_shader, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
||||||
WHBGfxInitShaderAttribute(&texture_colour_key_shader, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
WHBGfxInitShaderAttribute(&texture_shader, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
||||||
WHBGfxInitFetchShader(&texture_colour_key_shader);
|
WHBGfxInitFetchShader(&texture_shader);
|
||||||
|
|
||||||
// Colour-fill shader
|
// Texture shader (with colour-key)
|
||||||
if (WHBGfxLoadGFDShaderGroup(&colour_fill_shader, 0, rcolour_fill))
|
if (WHBGfxLoadGFDShaderGroup(&texture_colour_key_shader, 0, rtexture_colour_key))
|
||||||
{
|
{
|
||||||
WHBGfxInitShaderAttribute(&colour_fill_shader, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
WHBGfxInitShaderAttribute(&texture_colour_key_shader, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
||||||
WHBGfxInitFetchShader(&colour_fill_shader);
|
WHBGfxInitShaderAttribute(&texture_colour_key_shader, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
||||||
|
WHBGfxInitFetchShader(&texture_colour_key_shader);
|
||||||
|
|
||||||
// Glyph shader
|
// Colour-fill shader
|
||||||
if (WHBGfxLoadGFDShaderGroup(&glyph_shader, 0, rglyph))
|
if (WHBGfxLoadGFDShaderGroup(&colour_fill_shader, 0, rcolour_fill))
|
||||||
{
|
{
|
||||||
WHBGfxInitShaderAttribute(&glyph_shader, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
WHBGfxInitShaderAttribute(&colour_fill_shader, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
||||||
WHBGfxInitShaderAttribute(&glyph_shader, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
WHBGfxInitFetchShader(&colour_fill_shader);
|
||||||
WHBGfxInitFetchShader(&glyph_shader);
|
|
||||||
|
|
||||||
// Initialise vertex position buffer
|
// Glyph shader
|
||||||
vertex_position_buffer.flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_VERTEX_BUFFER |
|
if (WHBGfxLoadGFDShaderGroup(&glyph_shader, 0, rglyph))
|
||||||
GX2R_RESOURCE_USAGE_CPU_READ |
|
|
||||||
GX2R_RESOURCE_USAGE_CPU_WRITE |
|
|
||||||
GX2R_RESOURCE_USAGE_GPU_READ);
|
|
||||||
vertex_position_buffer.elemSize = 2 * sizeof(float);
|
|
||||||
vertex_position_buffer.elemCount = 4;
|
|
||||||
GX2RCreateBuffer(&vertex_position_buffer);
|
|
||||||
|
|
||||||
// Initialise texture coordinate buffer
|
|
||||||
texture_coordinate_buffer.flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_VERTEX_BUFFER |
|
|
||||||
GX2R_RESOURCE_USAGE_CPU_READ |
|
|
||||||
GX2R_RESOURCE_USAGE_CPU_WRITE |
|
|
||||||
GX2R_RESOURCE_USAGE_GPU_READ);
|
|
||||||
texture_coordinate_buffer.elemSize = 2 * sizeof(float);
|
|
||||||
texture_coordinate_buffer.elemCount = 4;
|
|
||||||
GX2RCreateBuffer(&texture_coordinate_buffer);
|
|
||||||
|
|
||||||
// Initialise sampler
|
|
||||||
GX2InitSampler(&sampler, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_LINEAR);
|
|
||||||
|
|
||||||
// Create framebuffer surface
|
|
||||||
framebuffer_surface = RenderBackend_CreateSurface(screen_width, screen_height, true);
|
|
||||||
|
|
||||||
if (framebuffer_surface != NULL)
|
|
||||||
{
|
{
|
||||||
// Create a 'context' (this voodoo magic can be used to undo `GX2SetColorBuffer`,
|
WHBGfxInitShaderAttribute(&glyph_shader, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
||||||
// allowing us to draw to the screen once again).
|
WHBGfxInitShaderAttribute(&glyph_shader, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
|
||||||
gx2_context = (GX2ContextState*)aligned_alloc(GX2_CONTEXT_STATE_ALIGNMENT, sizeof(GX2ContextState));
|
WHBGfxInitFetchShader(&glyph_shader);
|
||||||
memset(gx2_context, 0, sizeof(GX2ContextState));
|
|
||||||
GX2SetupContextStateEx(gx2_context, TRUE);
|
|
||||||
GX2SetContextState(gx2_context);
|
|
||||||
|
|
||||||
// Disable depth-test (enabled by default for some reason)
|
// Initialise vertex position buffer
|
||||||
GX2SetDepthOnlyControl(FALSE, FALSE, GX2_COMPARE_FUNC_ALWAYS);
|
vertex_position_buffer.flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_VERTEX_BUFFER |
|
||||||
|
GX2R_RESOURCE_USAGE_CPU_READ |
|
||||||
|
GX2R_RESOURCE_USAGE_CPU_WRITE |
|
||||||
|
GX2R_RESOURCE_USAGE_GPU_READ);
|
||||||
|
vertex_position_buffer.elemSize = 2 * sizeof(float);
|
||||||
|
vertex_position_buffer.elemCount = 4;
|
||||||
|
|
||||||
// Set custom blending mode for pre-multiplied alpha
|
if (GX2RCreateBuffer(&vertex_position_buffer))
|
||||||
/* GX2SetBlendControl(GX2_RENDER_TARGET_0,
|
|
||||||
GX2_BLEND_MODE_ZERO,
|
|
||||||
GX2_BLEND_MODE_ONE,
|
|
||||||
GX2_BLEND_COMBINE_MODE_ADD,
|
|
||||||
TRUE,
|
|
||||||
GX2_BLEND_MODE_ZERO,
|
|
||||||
GX2_BLEND_MODE_ONE,
|
|
||||||
GX2_BLEND_COMBINE_MODE_ADD);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Calculate centred viewports
|
|
||||||
switch (GX2GetSystemTVScanMode())
|
|
||||||
{
|
{
|
||||||
case GX2_TV_SCAN_MODE_NONE: // lolwut
|
// Initialise texture coordinate buffer
|
||||||
break;
|
texture_coordinate_buffer.flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_VERTEX_BUFFER |
|
||||||
|
GX2R_RESOURCE_USAGE_CPU_READ |
|
||||||
|
GX2R_RESOURCE_USAGE_CPU_WRITE |
|
||||||
|
GX2R_RESOURCE_USAGE_GPU_READ);
|
||||||
|
texture_coordinate_buffer.elemSize = 2 * sizeof(float);
|
||||||
|
texture_coordinate_buffer.elemCount = 4;
|
||||||
|
|
||||||
case GX2_TV_SCAN_MODE_480I:
|
if (GX2RCreateBuffer(&texture_coordinate_buffer))
|
||||||
case GX2_TV_SCAN_MODE_480P:
|
{
|
||||||
CalculateViewport(854, 480, &tv_viewport);
|
// Initialise sampler
|
||||||
break;
|
GX2InitSampler(&sampler, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_LINEAR);
|
||||||
|
|
||||||
case GX2_TV_SCAN_MODE_720P:
|
// Create framebuffer surface
|
||||||
case 4: // Why the hell doesn't WUT have an enum for this? It always returns this value for me!
|
framebuffer_surface = RenderBackend_CreateSurface(screen_width, screen_height, true);
|
||||||
CalculateViewport(1280, 720, &tv_viewport);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GX2_TV_SCAN_MODE_1080I:
|
if (framebuffer_surface != NULL)
|
||||||
case GX2_TV_SCAN_MODE_1080P:
|
{
|
||||||
CalculateViewport(1920, 1080, &tv_viewport);
|
// Create a 'context' (this voodoo magic can be used to undo `GX2SetColorBuffer`,
|
||||||
break;
|
// allowing us to draw to the screen once again)
|
||||||
|
gx2_context = (GX2ContextState*)aligned_alloc(GX2_CONTEXT_STATE_ALIGNMENT, sizeof(GX2ContextState));
|
||||||
|
memset(gx2_context, 0, sizeof(GX2ContextState));
|
||||||
|
GX2SetupContextStateEx(gx2_context, TRUE);
|
||||||
|
GX2SetContextState(gx2_context);
|
||||||
|
|
||||||
|
// Disable depth-test (enabled by default for some reason)
|
||||||
|
GX2SetDepthOnlyControl(FALSE, FALSE, GX2_COMPARE_FUNC_ALWAYS);
|
||||||
|
|
||||||
|
// Calculate centred viewports
|
||||||
|
switch (GX2GetSystemTVScanMode())
|
||||||
|
{
|
||||||
|
case GX2_TV_SCAN_MODE_NONE: // lolwut
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GX2_TV_SCAN_MODE_480I:
|
||||||
|
case GX2_TV_SCAN_MODE_480P:
|
||||||
|
CalculateViewport(854, 480, &tv_viewport);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GX2_TV_SCAN_MODE_720P:
|
||||||
|
case 4: // Why the hell doesn't WUT have an enum for this? It always returns this value for me!
|
||||||
|
CalculateViewport(1280, 720, &tv_viewport);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GX2_TV_SCAN_MODE_1080I:
|
||||||
|
case GX2_TV_SCAN_MODE_1080P:
|
||||||
|
CalculateViewport(1920, 1080, &tv_viewport);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
CalculateViewport(854, 480, &drc_viewport);
|
||||||
|
|
||||||
|
return framebuffer_surface;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Backend_PrintError("Couldn't create the framebuffer surface");
|
||||||
|
}
|
||||||
|
|
||||||
|
GX2RDestroyBufferEx(&texture_coordinate_buffer, (GX2RResourceFlags)0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Backend_PrintError("Couldn't create the texture coordinate buffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
GX2RDestroyBufferEx(&vertex_position_buffer, (GX2RResourceFlags)0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Backend_PrintError("Couldn't create the vertex position buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
CalculateViewport(854, 480, &drc_viewport);
|
WHBGfxFreeShaderGroup(&glyph_shader);
|
||||||
|
|
||||||
return framebuffer_surface;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Backend_PrintError("Couldn't create the framebuffer surface");
|
Backend_PrintError("Couldn't create the glyph shader");
|
||||||
}
|
}
|
||||||
|
|
||||||
GX2RDestroyBufferEx(&texture_coordinate_buffer, (GX2RResourceFlags)0);
|
WHBGfxFreeShaderGroup(&colour_fill_shader);
|
||||||
GX2RDestroyBufferEx(&vertex_position_buffer, (GX2RResourceFlags)0);
|
|
||||||
|
|
||||||
WHBGfxFreeShaderGroup(&glyph_shader);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Backend_PrintError("Couldn't create the glyph shader");
|
Backend_PrintError("Couldn't create the colour-fill shader");
|
||||||
}
|
}
|
||||||
|
|
||||||
WHBGfxFreeShaderGroup(&colour_fill_shader);
|
WHBGfxFreeShaderGroup(&texture_colour_key_shader);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Backend_PrintError("Couldn't create the colour-fill shader");
|
Backend_PrintError("Couldn't create the texture colour-key shader");
|
||||||
}
|
}
|
||||||
|
|
||||||
WHBGfxFreeShaderGroup(&texture_colour_key_shader);
|
WHBGfxFreeShaderGroup(&texture_shader);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Backend_PrintError("Couldn't create the texture colour-key shader");
|
Backend_PrintError("Couldn't create the texture shader");
|
||||||
}
|
}
|
||||||
|
|
||||||
WHBGfxFreeShaderGroup(&texture_shader);
|
WHBGfxShutdown();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Backend_PrintError("Couldn't create the texture shader");
|
Backend_PrintError("WHBGfxInit failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
WHBGfxShutdown();
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,8 +384,8 @@ RenderBackend_Surface* RenderBackend_CreateSurface(unsigned int width, unsigned
|
||||||
GX2InitTextureRegs(&surface->texture);
|
GX2InitTextureRegs(&surface->texture);
|
||||||
|
|
||||||
GX2RResourceFlags resource_flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_TEXTURE |
|
GX2RResourceFlags resource_flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_TEXTURE |
|
||||||
GX2R_RESOURCE_USAGE_CPU_WRITE | GX2R_RESOURCE_USAGE_CPU_READ |
|
GX2R_RESOURCE_USAGE_CPU_WRITE | GX2R_RESOURCE_USAGE_CPU_READ |
|
||||||
GX2R_RESOURCE_USAGE_GPU_WRITE | GX2R_RESOURCE_USAGE_GPU_READ);
|
GX2R_RESOURCE_USAGE_GPU_WRITE | GX2R_RESOURCE_USAGE_GPU_READ);
|
||||||
|
|
||||||
if (render_target)
|
if (render_target)
|
||||||
resource_flags = (GX2RResourceFlags)(resource_flags | GX2R_RESOURCE_BIND_COLOR_BUFFER);
|
resource_flags = (GX2RResourceFlags)(resource_flags | GX2R_RESOURCE_BIND_COLOR_BUFFER);
|
||||||
|
@ -771,7 +778,7 @@ void RenderBackend_FlushGlyphs(void)
|
||||||
|
|
||||||
void RenderBackend_HandleRenderTargetLoss(void)
|
void RenderBackend_HandleRenderTargetLoss(void)
|
||||||
{
|
{
|
||||||
// No problem for us
|
// Doesn't happen on the Wii U
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderBackend_HandleWindowResize(unsigned int width, unsigned int height)
|
void RenderBackend_HandleWindowResize(unsigned int width, unsigned int height)
|
||||||
|
@ -779,5 +786,5 @@ void RenderBackend_HandleWindowResize(unsigned int width, unsigned int height)
|
||||||
(void)width;
|
(void)width;
|
||||||
(void)height;
|
(void)height;
|
||||||
|
|
||||||
// No problem for us
|
// Doesn't happen on the Wii U
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue