mirror of https://github.com/libsdl-org/SDL.git
3DS: Fixes for batching and uploading textures
Co-authored-by: asiekierka <asiekierka@users.noreply.github.com>
This commit is contained in:
parent
edcae12f40
commit
b15fc85a18
|
|
@ -40,8 +40,21 @@
|
||||||
*
|
*
|
||||||
* TODO:
|
* TODO:
|
||||||
* - Native SDL_PIXELFORMAT_RGB888 support (breaks with SDL_TEXTUREACCESS_STREAMING)
|
* - Native SDL_PIXELFORMAT_RGB888 support (breaks with SDL_TEXTUREACCESS_STREAMING)
|
||||||
|
* - Fix GX Display Transfer usage for offloading texture swizzling to hardware
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static u8 SwizzleLUT[64] =
|
||||||
|
{
|
||||||
|
0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15,
|
||||||
|
0x02, 0x03, 0x06, 0x07, 0x12, 0x13, 0x16, 0x17,
|
||||||
|
0x08, 0x09, 0x0c, 0x0d, 0x18, 0x19, 0x1c, 0x1d,
|
||||||
|
0x0a, 0x0b, 0x0e, 0x0f, 0x1a, 0x1b, 0x1e, 0x1f,
|
||||||
|
0x20, 0x21, 0x24, 0x25, 0x30, 0x31, 0x34, 0x35,
|
||||||
|
0x22, 0x23, 0x26, 0x27, 0x32, 0x33, 0x36, 0x37,
|
||||||
|
0x28, 0x29, 0x2c, 0x2d, 0x38, 0x39, 0x3c, 0x3d,
|
||||||
|
0x2a, 0x2b, 0x2e, 0x2f, 0x3a, 0x3b, 0x3e, 0x3f
|
||||||
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
PixelFormatToN3DSGPU(Uint32 format)
|
PixelFormatToN3DSGPU(Uint32 format)
|
||||||
{
|
{
|
||||||
|
|
@ -61,11 +74,7 @@ PixelFormatToN3DSGPU(Uint32 format)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define COL5650(r,g,b,a) ((b>>3) | ((g>>2)<<5) | ((r>>3)<<11))
|
|
||||||
#define COL5551(r,g,b,a) (((b>>3)<<1) | ((g>>3)<<6) | ((r>>3)<<11) | (a>0?1:0))
|
|
||||||
#define COL4444(r,g,b,a) ((a>>4) | ((b>>4)<<4) | ((g>>4)<<8) | ((r>>4)<<12))
|
|
||||||
#define COL8888(r,g,b,a) ((a) | ((b)<<8) | ((g)<<16) | ((r)<<24))
|
#define COL8888(r,g,b,a) ((a) | ((b)<<8) | ((g)<<16) | ((r)<<24))
|
||||||
#define COL888(r,g,b) ((b) | ((g)<<16) | ((r)<<24))
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|
@ -298,6 +307,8 @@ N3DS_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
|
|
||||||
/* We do whole texture updates, at least for now */
|
/* We do whole texture updates, at least for now */
|
||||||
GSPGPU_FlushDataCache(N3DS_texture->unswizzledBuffer, N3DS_texture->unswizzledSize);
|
GSPGPU_FlushDataCache(N3DS_texture->unswizzledBuffer, N3DS_texture->unswizzledSize);
|
||||||
|
|
||||||
|
/*
|
||||||
C3D_SyncDisplayTransfer(
|
C3D_SyncDisplayTransfer(
|
||||||
N3DS_texture->unswizzledBuffer,
|
N3DS_texture->unswizzledBuffer,
|
||||||
GX_BUFFER_DIM(N3DS_texture->unswizzledWidth, N3DS_texture->unswizzledHeight),
|
GX_BUFFER_DIM(N3DS_texture->unswizzledWidth, N3DS_texture->unswizzledHeight),
|
||||||
|
|
@ -307,6 +318,25 @@ N3DS_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
GX_TRANSFER_IN_FORMAT(N3DS_texture->texture.fmt) | GX_TRANSFER_OUT_FORMAT(N3DS_texture->texture.fmt) |
|
GX_TRANSFER_IN_FORMAT(N3DS_texture->texture.fmt) | GX_TRANSFER_OUT_FORMAT(N3DS_texture->texture.fmt) |
|
||||||
GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)
|
GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)
|
||||||
);
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (SDL_BYTESPERPIXEL(texture->format) == 4) {
|
||||||
|
uint32_t *dst = N3DS_texture->texture.data;
|
||||||
|
for (int y = 0; y < N3DS_texture->unswizzledHeight; y++) {
|
||||||
|
uint32_t *src = (uint32_t*) (N3DS_texture->unswizzledBuffer + (y * N3DS_texture->unswizzledPitch));
|
||||||
|
for (int x = 0; x < N3DS_texture->unswizzledWidth; x++, src++) {
|
||||||
|
dst[SwizzleLUT[(x & 7) + ((y & 7) << 3)] + ((x & (~7)) << 3) + ((y & (~7)) * N3DS_texture->texture.width)] = *src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (SDL_BYTESPERPIXEL(texture->format) == 2) {
|
||||||
|
uint16_t *dst = N3DS_texture->texture.data;
|
||||||
|
for (int y = 0; y < N3DS_texture->unswizzledHeight; y++) {
|
||||||
|
uint16_t *src = (uint16_t*) (N3DS_texture->unswizzledBuffer + (y * N3DS_texture->unswizzledPitch));
|
||||||
|
for (int x = 0; x < N3DS_texture->unswizzledWidth; x++, src++) {
|
||||||
|
dst[SwizzleLUT[(x & 7) + ((y & 7) << 3)] + ((x & (~7)) << 3) + ((y & (~7)) * N3DS_texture->texture.width)] = *src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -770,7 +800,7 @@ N3DS_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vert
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDL_RENDERCMD_FILL_RECTS: {
|
case SDL_RENDERCMD_FILL_RECTS: {
|
||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first / sizeof(VertVCT);
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
N3DS_BlendState state = {
|
N3DS_BlendState state = {
|
||||||
.texture = NULL,
|
.texture = NULL,
|
||||||
|
|
@ -783,7 +813,7 @@ N3DS_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vert
|
||||||
|
|
||||||
case SDL_RENDERCMD_COPY:
|
case SDL_RENDERCMD_COPY:
|
||||||
case SDL_RENDERCMD_COPY_EX: {
|
case SDL_RENDERCMD_COPY_EX: {
|
||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first / sizeof(VertVCT);
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
N3DS_BlendState state = {
|
N3DS_BlendState state = {
|
||||||
.texture = cmd->data.draw.texture,
|
.texture = cmd->data.draw.texture,
|
||||||
|
|
@ -795,7 +825,7 @@ N3DS_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vert
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDL_RENDERCMD_GEOMETRY: {
|
case SDL_RENDERCMD_GEOMETRY: {
|
||||||
const size_t first = cmd->data.draw.first;
|
const size_t first = cmd->data.draw.first / sizeof(VertVCT);
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
N3DS_BlendState state = {
|
N3DS_BlendState state = {
|
||||||
.texture = cmd->data.draw.texture,
|
.texture = cmd->data.draw.texture,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue