Bump color quality. Also removes output dithering.

This commit is contained in:
profi200 2020-06-08 13:58:14 +02:00
parent 2e8f7d92a5
commit 4316ad5c85
No known key found for this signature in database
GPG Key ID: 17B42AE5911139F3
4 changed files with 52 additions and 46 deletions

View File

@ -2,22 +2,22 @@
// REG_LGYFB_CNT
#define LGYFB_ENABLE (1u)
#define LGYFB_VSCALE_E (1u<<1)
#define LGYFB_HSCALE_E (1u<<2)
#define LGYFB_DITHER_E (1u<<4)
#define LGYFB_DITHER2_E (1u<<5) // ?
#define LGYFB_OUT_FMT_8888 (0u)
#define LGYFB_OUT_FMT_8880 (1u<<8)
#define LGYFB_OUT_FMT_5551 (2u<<8)
#define LGYFB_OUT_FMT_5650 (3u<<8)
#define LGYFB_ROT_NONE (0u)
#define LGYFB_ROT_90CW (1u<<10)
#define LGYFB_ROT_180CW (2u<<10)
#define LGYFB_ROT_270CW (3u<<10)
#define LGYFB_OUT_SWIZZLE (1u<<12)
#define LGYFB_DMA_E (1u<<15)
#define LGYFB_IN_FMT (1u<<16) // Use input format but this bit does nothing?
#define LGYFB_ENABLE (1u)
#define LGYFB_VSCALE_E (1u<<1)
#define LGYFB_HSCALE_E (1u<<2)
#define LGYFB_SPATIAL_DITHER_E (1u<<4) // Unset behaves like weight 0xCCCC in both pattern regs.
#define LGYFB_TEMPORAL_DITHER_E (1u<<5) // Unset behaves like weight 0xCCCC in both pattern regs.
#define LGYFB_OUT_FMT_8888 (0u)
#define LGYFB_OUT_FMT_8880 (1u<<8)
#define LGYFB_OUT_FMT_5551 (2u<<8)
#define LGYFB_OUT_FMT_5650 (3u<<8)
#define LGYFB_ROT_NONE (0u)
#define LGYFB_ROT_90CW (1u<<10)
#define LGYFB_ROT_180CW (2u<<10)
#define LGYFB_ROT_270CW (3u<<10)
#define LGYFB_OUT_SWIZZLE (1u<<12)
#define LGYFB_DMA_E (1u<<15)
#define LGYFB_IN_FMT (1u<<16) // Use input format but this bit does nothing?
// REG_LGYFB_SIZE width and hight
#define LGYFB_SIZE(w, h) (((h) - 1)<<16 | ((w) - 1))

View File

@ -8,28 +8,34 @@
#include "lgyfb_dma330.h"
#define REG_LGYFB_TOP_CNT *((vu32*)(0x10111000))
#define REG_LGYFB_TOP_SIZE *((vu32*)(0x10111004))
#define REG_LGYFB_TOP_STAT *((vu32*)(0x10111008))
#define REG_LGYFB_TOP_IRQ *((vu32*)(0x1011100C))
#define REG_LGYFB_TOP_FLUSH *((vu32*)(0x10111010)) // Write 0 to flush LgyFb FIFO.
#define REG_LGYFB_TOP_ALPHA *((vu32*)(0x10111020))
#define REG_LGYFB_TOP_UNK_F0 *((vu32*)(0x101110F0))
// TODO: Add the missing regs.
#define LGYFB_TOP_FIFO *((vu32*)(0x10311000))
#define LGYFB_TOP_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x11000)
#define REG_LGYFB_TOP_CNT *((vu32*)(LGYFB_TOP_REGS_BASE + 0x000))
#define REG_LGYFB_TOP_SIZE *((vu32*)(LGYFB_TOP_REGS_BASE + 0x004))
#define REG_LGYFB_TOP_STAT *((vu32*)(LGYFB_TOP_REGS_BASE + 0x008))
#define REG_LGYFB_TOP_IRQ *((vu32*)(LGYFB_TOP_REGS_BASE + 0x00C))
#define REG_LGYFB_TOP_FLUSH *((vu32*)(LGYFB_TOP_REGS_BASE + 0x010)) // Write 0 to flush LgyFb FIFO.
#define REG_LGYFB_TOP_ALPHA *((vu32*)(LGYFB_TOP_REGS_BASE + 0x020))
#define REG_LGYFB_TOP_UNK_F0 *((vu32*)(LGYFB_TOP_REGS_BASE + 0x0F0))
#define REG_LGYFB_TOP_DITHPATT0 ((vu32*)(LGYFB_TOP_REGS_BASE + 0x100)) // 2 u32 regs with 4x2 pattern bits (mask 0xCCCC) each.
#define REG_LGYFB_TOP_DITHPATT1 ((vu32*)(LGYFB_TOP_REGS_BASE + 0x108)) // 2 u32 regs with 4x2 pattern bits (mask 0xCCCC) each.
// TODO: Missing scaling regs.
#define LGYFB_TOP_FIFO *((vu32*)(0x10311000))
#define REG_LGYFB_BOT_CNT *((vu32*)(0x10110000))
#define REG_LGYFB_BOT_SIZE *((vu32*)(0x10110004))
#define REG_LGYFB_BOT_STAT *((vu32*)(0x10110008))
#define REG_LGYFB_BOT_IRQ *((vu32*)(0x1011000C))
#define REG_LGYFB_BOT_FLUSH *((vu32*)(0x10110010)) // Write 0 to flush LgyFb FIFO.
#define REG_LGYFB_BOT_ALPHA *((vu32*)(0x10110020)) // 8 bit alpha for all pixels.
#define REG_LGYFB_BOT_UNK_F0 *((vu32*)(0x101100F0))
// TODO: Add the missing regs.
#define LGYFB_BOT_FIFO *((vu32*)(0x10310000))
#define LGYFB_BOT_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x10000)
#define REG_LGYFB_BOT_CNT *((vu32*)(LGYFB_BOT_REGS_BASE + 0x000))
#define REG_LGYFB_BOT_SIZE *((vu32*)(LGYFB_BOT_REGS_BASE + 0x004))
#define REG_LGYFB_BOT_STAT *((vu32*)(LGYFB_BOT_REGS_BASE + 0x008))
#define REG_LGYFB_BOT_IRQ *((vu32*)(LGYFB_BOT_REGS_BASE + 0x00C))
#define REG_LGYFB_BOT_FLUSH *((vu32*)(LGYFB_BOT_REGS_BASE + 0x010)) // Write 0 to flush LgyFb FIFO.
#define REG_LGYFB_BOT_ALPHA *((vu32*)(LGYFB_BOT_REGS_BASE + 0x020)) // 8 bit alpha for all pixels.
#define REG_LGYFB_BOT_UNK_F0 *((vu32*)(LGYFB_BOT_REGS_BASE + 0x0F0))
#define REG_LGYFB_BOT_DITHPATT0 ((vu32*)(LGYFB_BOT_REGS_BASE + 0x100)) // 2 u32 regs with 4x2 pattern bits (mask 0xCCCC) each.
#define REG_LGYFB_BOT_DITHPATT1 ((vu32*)(LGYFB_BOT_REGS_BASE + 0x108)) // 2 u32 regs with 4x2 pattern bits (mask 0xCCCC) each.
// TODO: Missing scaling regs.
#define LGYFB_BOT_FIFO *((vu32*)(0x10310000))
static bool flag = false;
static bool g_frameReady = false;
@ -46,7 +52,7 @@ static void lgyFbDmaIrqHandler(UNUSED u32 intSource)
else vtotal = 414; // Faster than GBA.
REG_LCD_PDC0_VTOTAL = vtotal;
atomic_store_explicit(&flag, true, memory_order_relaxed);
atomic_store_explicit(&g_frameReady, true, memory_order_relaxed);
}
void LGYFB_init(void)
@ -58,7 +64,7 @@ void LGYFB_init(void)
REG_LGYFB_TOP_STAT = LGYFB_IRQ_MASK;
REG_LGYFB_TOP_IRQ = 0;
REG_LGYFB_TOP_ALPHA = 0xFF;
REG_LGYFB_TOP_CNT = LGYFB_DMA_E | LGYFB_OUT_SWIZZLE | LGYFB_OUT_FMT_5551 | LGYFB_ENABLE;
REG_LGYFB_TOP_CNT = LGYFB_DMA_E | LGYFB_OUT_SWIZZLE | LGYFB_OUT_FMT_8880 | LGYFB_ENABLE;
IRQ_registerIsr(IRQ_CDMA_EVENT0, 13, 0, lgyFbDmaIrqHandler);
}
@ -70,7 +76,7 @@ alignas(16) static const u8 firstList[1136] =
0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x06, 0x03,
0x1C, 0x01, 0x2F, 0x80, 0x00, 0x00, 0x03, 0x03, 0xF0, 0xF0, 0x18, 0x01,
0xF0, 0xF0, 0x18, 0x01, 0x6E, 0x00, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00,
0x16, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x01, 0x0F, 0x00,
0x16, 0x01, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x17, 0x01, 0x0F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00,
0x12, 0x01, 0x3F, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x45, 0x00,
@ -115,7 +121,7 @@ alignas(16) static const u8 firstList[1136] =
0x18, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x81, 0x00, 0x4F, 0x80, 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x01, 0x00, 0x00, 0x00,
0x8E, 0x00, 0x0F, 0x00, 0x01, 0x10, 0x01, 0x00, 0x80, 0x00, 0x0B, 0x00,
0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
0x8B, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00,
@ -169,7 +175,7 @@ alignas(16) static const u8 secondList[448] =
0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x06, 0x03,
0x1C, 0x01, 0x2F, 0x80, 0x00, 0x00, 0x03, 0x03, 0xF0, 0xF0, 0x18, 0x01,
0xF0, 0xF0, 0x18, 0x01, 0x6E, 0x00, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00,
0x16, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x01, 0x0F, 0x00,
0x16, 0x01, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x17, 0x01, 0x0F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00,
0x12, 0x01, 0x3F, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x45, 0x00,
@ -223,16 +229,16 @@ alignas(16) static const u8 secondList[448] =
}
GX_processCommandList(listSize, list);
GFX_waitForP3D();
GX_displayTransfer((u32*)(0x18180000 + (16 * 240 * 2)), 368u<<16 | 240u,
GFX_getFramebuffer(SCREEN_TOP) + (16 * 240 * 2), 368u<<16 | 240u, 3u<<12 | 3u<<8);
GX_displayTransfer((u32*)(0x18180000 + (16 * 240 * 3)), 368u<<16 | 240u,
GFX_getFramebuffer(SCREEN_TOP) + (16 * 240 * 3), 368u<<16 | 240u, 1u<<12 | 1u<<8);
GFX_waitForPPF();
}
void LGYFB_processFrame(void)
{
if(atomic_load_explicit(&flag, memory_order_relaxed))
if(atomic_load_explicit(&g_frameReady, memory_order_relaxed))
{
atomic_store_explicit(&flag, false, memory_order_relaxed);
atomic_store_explicit(&g_frameReady, false, memory_order_relaxed);
// Rotate the 240x160 frame using the GPU.
rotateFrame();

View File

@ -16,7 +16,7 @@ LPFE
# LgyFb sometimes (at the end of each scanline?) sends
# single requests. Since we can transfer all 8 scanlines
# with bursts only we will ignore them.
LP 31
LP 47
LDB
STB
LPENDB

View File

@ -30,7 +30,7 @@
int main(void)
{
GFX_init(GFX_RGB5A1, GFX_RGB565);
GFX_init(GFX_BGR8, GFX_RGB565);
GFX_setBrightness(DEFAULT_BRIGHTNESS, DEFAULT_BRIGHTNESS);
consoleInit(SCREEN_BOT, NULL);
//CODEC_init();