From 223d7c5bf279869c2c1f7bbd0eaa9d15b45f1e27 Mon Sep 17 00:00:00 2001 From: Alberto Mardegan Date: Mon, 22 Jan 2024 19:02:05 +0300 Subject: [PATCH] ogc: support rendering to transparent textures (#47) Switch the EFB format to an alpha-enabled one when the texture we are asked to render to has an alpha channel. This fixes handling of transparency in the VVVVVV game, which makes extensive use of rendering to textures. --- src/render/ogc/SDL_render_ogc.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/render/ogc/SDL_render_ogc.c b/src/render/ogc/SDL_render_ogc.c index 24704f39fed7a..bb6613121fe3b 100644 --- a/src/render/ogc/SDL_render_ogc.c +++ b/src/render/ogc/SDL_render_ogc.c @@ -43,6 +43,7 @@ typedef struct GXColor clear_color; int ops_after_present; bool vsync; + u8 efb_pixel_format; } OGC_RenderData; typedef struct @@ -187,6 +188,7 @@ static void OGC_SetTextureScaleMode(SDL_Renderer *renderer, static int OGC_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture) { OGC_RenderData *data = renderer->driverdata; + u8 desired_efb_pixel_format = GX_PF_RGB8_Z24; if (texture) { if (texture->w > MAX_EFB_WIDTH || texture->h > MAX_EFB_HEIGHT) { @@ -205,7 +207,17 @@ static int OGC_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture) SDL_LogWarn(SDL_LOG_CATEGORY_RENDER, "Render target set after drawing!"); } + + if (SDL_ISPIXELFORMAT_ALPHA(texture->format)) { + desired_efb_pixel_format = GX_PF_RGBA6_Z24; + } } + + if (desired_efb_pixel_format != data->efb_pixel_format) { + data->efb_pixel_format = desired_efb_pixel_format; + GX_SetPixelFmt(data->efb_pixel_format, GX_ZC_LINEAR); + } + return 0; } @@ -581,6 +593,7 @@ static SDL_Renderer *OGC_CreateRenderer(SDL_Window *window, Uint32 flags) return NULL; } + data->efb_pixel_format = GX_PF_RGB8_Z24; data->current_blend_mode = SDL_BLENDMODE_NONE; data->vsync = true;