Bump color quality. Also removes output dithering.
This commit is contained in:
parent
2e8f7d92a5
commit
4316ad5c85
|
@ -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))
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue