diff --git a/src/render/wiiu/SDL_render_wiiu.c b/src/render/wiiu/SDL_render_wiiu.c index 616fbf88f..b40da5a06 100644 --- a/src/render/wiiu/SDL_render_wiiu.c +++ b/src/render/wiiu/SDL_render_wiiu.c @@ -210,13 +210,36 @@ SDL_RenderDriver WIIU_RenderDriver = { .info = { .name = "WiiU GX2", .flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE, - .num_texture_formats = 1, //5, + .num_texture_formats = 13, //21, .texture_formats = { + /* TODO: Alpha-less (X) formats */ SDL_PIXELFORMAT_RGBA8888, -/* SDL_PIXELFORMAT_RGBA4444, +// SDL_PIXELFORMAT_RGBX8888, + +// SDL_PIXELFORMAT_RGB444, + SDL_PIXELFORMAT_ARGB4444, + SDL_PIXELFORMAT_RGBA4444, + SDL_PIXELFORMAT_ABGR4444, + SDL_PIXELFORMAT_BGRA4444, + +// SDL_PIXELFORMAT_RGB555, + SDL_PIXELFORMAT_ARGB1555, +// SDL_PIXELFORMAT_BGR555, SDL_PIXELFORMAT_ABGR1555, SDL_PIXELFORMAT_RGBA5551, - SDL_PIXELFORMAT_RGB565,*/ + SDL_PIXELFORMAT_BGRA5551, + + /* TODO: RGB565 doesn't seem to work right, endian issue? */ +// SDL_PIXELFORMAT_RGB565, +// SDL_PIXELFORMAT_BGR565, + + SDL_PIXELFORMAT_ARGB8888, + SDL_PIXELFORMAT_BGRA8888, +// SDL_PIXELFORMAT_BGRX8888, + SDL_PIXELFORMAT_ABGR8888, +// SDL_PIXELFORMAT_BGR888, + + SDL_PIXELFORMAT_ARGB2101010, }, .max_texture_width = 0, .max_texture_height = 0, diff --git a/src/render/wiiu/SDL_render_wiiu.h b/src/render/wiiu/SDL_render_wiiu.h index e1ee1e677..22726e7da 100644 --- a/src/render/wiiu/SDL_render_wiiu.h +++ b/src/render/wiiu/SDL_render_wiiu.h @@ -26,6 +26,7 @@ #define SDL_render_wiiu_h #include "../SDL_sysrender.h" +#include "SDL_pixels.h" #include #include @@ -117,24 +118,113 @@ static inline Uint32 TextureNextPow2(Uint32 w) { return n; } -//TODO: This could return a compMap to support stuff like ARGB or ABGR -static inline GX2SurfaceFormat PixelFormatToWIIUFMT(Uint32 format) { +typedef struct WIIUPixFmt { + GX2SurfaceFormat fmt; + uint32_t compMap; +} WIIUPixFmt; + +static inline WIIUPixFmt SDLFormatToWIIUFormat(Uint32 format) { + WIIUPixFmt outFmt = { /* sane defaults? */ + .fmt = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, + .compMap = 0x00010203, + }; switch (format) { + /* packed16 formats: 4 bits/channel */ + case SDL_PIXELFORMAT_RGB444: /* aka XRGB4444 */ + case SDL_PIXELFORMAT_ARGB4444: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R4_G4_B4_A4; + outFmt.compMap = 0x01020300; + break; + } + case SDL_PIXELFORMAT_RGBA4444: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R4_G4_B4_A4; + outFmt.compMap = 0x00010203; + break; + } + case SDL_PIXELFORMAT_ABGR4444: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R4_G4_B4_A4; + outFmt.compMap = 0x03020100; + break; + } + case SDL_PIXELFORMAT_BGRA4444: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R4_G4_B4_A4; + outFmt.compMap = 0x02010003; + break; + } + + /* packed16 formats: 5 bits/channel */ + case SDL_PIXELFORMAT_RGB555: /* aka XRGB1555 */ + case SDL_PIXELFORMAT_ARGB1555: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1; + outFmt.compMap = 0x01020300; + break; + } + case SDL_PIXELFORMAT_BGR555: /* aka XRGB1555 */ + case SDL_PIXELFORMAT_ABGR1555: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1; + outFmt.compMap = 0x03020100; + break; + } + case SDL_PIXELFORMAT_RGBA5551: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1; + outFmt.compMap = 0x00010203; + break; + } + case SDL_PIXELFORMAT_BGRA5551: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1; + outFmt.compMap = 0x02010003; + break; + } + + /* packed16 formats: 565 */ + case SDL_PIXELFORMAT_RGB565: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R5_G6_B5; + outFmt.compMap = 0x00010203; + break; + } + case SDL_PIXELFORMAT_BGR565: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R5_G6_B5; + outFmt.compMap = 0x02010003; + break; + } + + /* packed32 formats */ case SDL_PIXELFORMAT_RGBA8888: - return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; - case SDL_PIXELFORMAT_RGBA4444: - return GX2_SURFACE_FORMAT_UNORM_R4_G4_B4_A4; - case SDL_PIXELFORMAT_ABGR1555: - return GX2_SURFACE_FORMAT_UNORM_A1_B5_G5_R5; - case SDL_PIXELFORMAT_RGBA5551: - return GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1; - case SDL_PIXELFORMAT_RGB565: - return GX2_SURFACE_FORMAT_UNORM_R5_G6_B5; - default: - return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + case SDL_PIXELFORMAT_RGBX8888: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + outFmt.compMap = 0x00010203; + break; + } + case SDL_PIXELFORMAT_ARGB8888: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + outFmt.compMap = 0x01020300; + break; + } + case SDL_PIXELFORMAT_BGRA8888: + case SDL_PIXELFORMAT_BGRX8888: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + outFmt.compMap = 0x02010003; + break; + } + case SDL_PIXELFORMAT_ABGR8888: + case SDL_PIXELFORMAT_BGR888: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + outFmt.compMap = 0x03020100; + break; + } + case SDL_PIXELFORMAT_ARGB2101010: { + outFmt.fmt = GX2_SURFACE_FORMAT_UNORM_R10_G10_B10_A2; + outFmt.compMap = 0x01020300; + break; + } + default: { + /* TODO return an error */ + printf("SDL: WiiU format not recognised (SDL: %08X)\n", format); + break; + } } - return GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + + return outFmt; } - #endif //SDL_render_wiiu_h diff --git a/src/render/wiiu/SDL_rtexture_wiiu.c b/src/render/wiiu/SDL_rtexture_wiiu.c index 101553ccd..3ffead1ce 100644 --- a/src/render/wiiu/SDL_rtexture_wiiu.c +++ b/src/render/wiiu/SDL_rtexture_wiiu.c @@ -42,6 +42,7 @@ int WIIU_SDL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) { + WIIUPixFmt gx2_fmt; WIIU_TextureData *tdata = (WIIU_TextureData *) SDL_calloc(1, sizeof(*tdata)); if (!tdata) return SDL_OutOfMemory(); @@ -49,9 +50,13 @@ int WIIU_SDL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) // Setup sampler GX2InitSampler(&tdata->sampler, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_LINEAR); + gx2_fmt = SDLFormatToWIIUFormat(texture->format); + + printf("Tex %s, using GX2 %08X %08X\n", SDL_GetPixelFormatName(texture->format), gx2_fmt.fmt, gx2_fmt.compMap); + tdata->texture.surface.width = texture->w; tdata->texture.surface.height = texture->h; - tdata->texture.surface.format = PixelFormatToWIIUFMT(texture->format); + tdata->texture.surface.format = gx2_fmt.fmt; tdata->texture.surface.depth = 1; //? tdata->texture.surface.dim = GX2_SURFACE_DIM_TEXTURE_2D; tdata->texture.surface.tileMode = GX2_TILE_MODE_LINEAR_ALIGNED; @@ -59,7 +64,7 @@ int WIIU_SDL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) tdata->texture.surface.mipLevels = 1; tdata->texture.viewNumMips = 1; tdata->texture.viewNumSlices = 1; - tdata->texture.compMap = 0x00010203; + tdata->texture.compMap = gx2_fmt.compMap; GX2CalcSurfaceSizeAndAlignment(&tdata->texture.surface); GX2InitTextureRegs(&tdata->texture);