修复居中不严谨和下屏撕裂

This commit is contained in:
root 2023-07-04 20:57:56 +08:00
parent fc4d244e67
commit 6a9343d59f

View File

@ -691,16 +691,16 @@ static void gbaGfxHandler(void *args)
// 所以GPU做的事情就是将18200000的数据逆时针旋转90° // 所以GPU做的事情就是将18200000的数据逆时针旋转90°
if( g_oafConfig.scaler == 0 ) // 上屏无缩放 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 // 但是gpu的transfer engine只支持16字节对齐的地址。所以只能选择16和3的公约数就是48,96,144,192,240
GX_displayTransfer((u32*)(0x18180000 + 16*240*3), 368u<<16 | 240u, GX_displayTransfer((u32*)(0x18180000), 240u<<16 | 240u,
GFX_getFramebuffer(SCREEN_TOP) + 16*240*3 + base_offset, 368u<<16 | 240u, 1u<<12 | 1u<<8); GFX_getFramebuffer(SCREEN_TOP) + base_offset, 240u<<16 | 240u, 1u<<12 | 1u<<8);
} }
else if( g_oafConfig.scaler == 3 )//下屏无缩放 else if( g_oafConfig.scaler == 3 )//下屏无缩放
{ {
int base_offset = 16*240*3; int base_offset = 28800;
GX_displayTransfer((u32*)(0x18180000), 320u<<16 | 240u, GX_displayTransfer((u32*)(0x18180000), 240u<<16 | 240u,
GFX_getFramebuffer(SCREEN_BOT), 320u<<16 | 240u, 1u<<12 | 1u<<8); GFX_getFramebuffer(SCREEN_BOT) + base_offset, 240u<<16 | 240u, 1u<<12 | 1u<<8);
} }
else GX_displayTransfer((u32*)(0x18180000 + 16*240*3), 368u<<16 | 240u, 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); 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大小的纹理 LGYFB_init(frameReadyEvent, g_oafConfig.scaler); // 这里把GBA的输出转换成0x18200000处512x512大小的纹理
patchGbaGpuCmdList(g_oafConfig.scaler); 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); createTask(0x800, 3, gbaGfxHandler, (void*)frameReadyEvent);
g_frameReadyEvent = frameReadyEvent; g_frameReadyEvent = frameReadyEvent;