render: Add loads of GX2 texture formats

This commit is contained in:
Ash Logan 2019-01-03 17:04:26 +11:00
parent 81a111c5c0
commit df73c8d08b
3 changed files with 138 additions and 20 deletions

View File

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

View File

@ -26,6 +26,7 @@
#define SDL_render_wiiu_h
#include "../SDL_sysrender.h"
#include "SDL_pixels.h"
#include <gx2/context.h>
#include <gx2/sampler.h>
@ -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

View File

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