From 6a9343d59f583b90aaff91bbf530f4195c798221 Mon Sep 17 00:00:00 2001 From: root <182859762@qq.com> Date: Tue, 4 Jul 2023 20:57:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B1=85=E4=B8=AD=E4=B8=8D?= =?UTF-8?q?=E4=B8=A5=E8=B0=A8=E5=92=8C=E4=B8=8B=E5=B1=8F=E6=92=95=E8=A3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/arm11/open_agb_firm.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/source/arm11/open_agb_firm.c b/source/arm11/open_agb_firm.c index 059dde4..5cbf95c 100644 --- a/source/arm11/open_agb_firm.c +++ b/source/arm11/open_agb_firm.c @@ -691,16 +691,16 @@ static void gbaGfxHandler(void *args) // 所以GPU做的事情就是将18200000的数据逆时针旋转90° if( g_oafConfig.scaler == 0 ) // 上屏无缩放 { - int base_offset = 96; // 3ds高240, gba高160,居中需要平移40个像素,rgb888每个像素3字节,共120字节 + int base_offset = 57600; // 3ds高240, gba高160,居中需要平移40个像素,rgb888每个像素3字节,共120字节 // 但是,gpu的transfer engine只支持16字节对齐的地址。所以只能选择16和3的公约数,就是48,96,144,192,240 - GX_displayTransfer((u32*)(0x18180000 + 16*240*3), 368u<<16 | 240u, - GFX_getFramebuffer(SCREEN_TOP) + 16*240*3 + base_offset, 368u<<16 | 240u, 1u<<12 | 1u<<8); + GX_displayTransfer((u32*)(0x18180000), 240u<<16 | 240u, + GFX_getFramebuffer(SCREEN_TOP) + base_offset, 240u<<16 | 240u, 1u<<12 | 1u<<8); } else if( g_oafConfig.scaler == 3 )//下屏无缩放 { - int base_offset = 16*240*3; - GX_displayTransfer((u32*)(0x18180000), 320u<<16 | 240u, - GFX_getFramebuffer(SCREEN_BOT), 320u<<16 | 240u, 1u<<12 | 1u<<8); + int base_offset = 28800; + GX_displayTransfer((u32*)(0x18180000), 240u<<16 | 240u, + GFX_getFramebuffer(SCREEN_BOT) + base_offset, 240u<<16 | 240u, 1u<<12 | 1u<<8); } else GX_displayTransfer((u32*)(0x18180000 + 16*240*3), 368u<<16 | 240u, GFX_getFramebuffer(SCREEN_TOP) + 16*240*3, 368u<<16 | 240u, 1u<<12 | 1u<<8); @@ -941,7 +941,12 @@ Result oafInitAndRun(void) { LGYFB_init(frameReadyEvent, g_oafConfig.scaler); // 这里把GBA的输出转换成0x18200000处512x512大小的纹理 patchGbaGpuCmdList(g_oafConfig.scaler); - if( g_oafConfig.scaler == 3u ) GFX_setFramebufFmt(GFX_BGR8, GFX_BGR8); + if( g_oafConfig.scaler == 3u ) + { + memset(consoleGet()->frameBuffer, 0, 320*240*2); + GFX_setDoubleBuffering( SCREEN_BOT, true ); + GFX_setFramebufFmt(GFX_BGR8, GFX_BGR8); + } } createTask(0x800, 3, gbaGfxHandler, (void*)frameReadyEvent); g_frameReadyEvent = frameReadyEvent;