From fc4d244e6774f6d21ffce6d780aa9e1098f9d38e Mon Sep 17 00:00:00 2001 From: anod <182859762@qq.com> Date: Tue, 4 Jul 2023 06:18:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9gpu=5Fcmd=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=8C=E8=AE=A9=E5=85=B6=E5=AE=B9=E6=98=93=E9=98=85?= =?UTF-8?q?=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/arm11/gpu_cmd_lists.c | 97 +++++++++++++++++++++++++----------- source/arm11/open_agb_firm.c | 4 +- 2 files changed, 70 insertions(+), 31 deletions(-) diff --git a/source/arm11/gpu_cmd_lists.c b/source/arm11/gpu_cmd_lists.c index 164b2a9..a2f19b0 100644 --- a/source/arm11/gpu_cmd_lists.c +++ b/source/arm11/gpu_cmd_lists.c @@ -508,7 +508,7 @@ alignas(16) u8 gbaGpuInitList[1136] = // 74 @0960 GPUREG_FIXEDATTRIB_DATA0 0,3e10,0 0x00, 0x00, 0x00, 0x00, 0x33, 0x02, 0x2f, 0x80, - 0x10, 0x3e, 0x00, 0x00, + 0x10, 0x3e, 0x00, 0x00, // <---- 968 003e10改为003e60 0x00, 0x00, 0x00, 0x00, // 75 @0976 GPUREG_FIXEDATTRIB_DATA0 3f00003e,0,477c00 @@ -520,8 +520,8 @@ alignas(16) u8 gbaGpuInitList[1136] = // 76 @0992 GPUREG_FIXEDATTRIB_DATA0 0,3e10,3e6800 0x00, 0x00, 0x00, 0x00, 0x33, 0x02, 0x2f, 0x80, - 0x10, 0x3e, 0x00, 0x00, - 0x00, 0x68, 0x3e, 0x00, + 0x10, 0x3e, 0x00, 0x00, // <---- 1000 003e10改为003e60 + 0x00, 0x68, 0x3e, 0x00, // <---- 1004 3e6800改为3de000 // 77 @1008 GPUREG_FIXEDATTRIB_DATA0 3f00003e,46e0,434000 0x3e, 0x00, 0x00, 0x3f, @@ -545,7 +545,7 @@ alignas(16) u8 gbaGpuInitList[1136] = 0x00, 0x00, 0x00, 0x00, 0x33, 0x02, 0x2f, 0x80, 0x00, 0x3f, 0x00, 0x00, - 0x00, 0x68, 0x3e, 0x00, + 0x00, 0x68, 0x3e, 0x00, // <---- 1068 3e6800改为3de000 // 81 @1072 GPUREG_START_DRAW_FUNC0 1 0x01, 0x00, 0x00, 0x00, @@ -731,7 +731,7 @@ alignas(16) u8 gbaGpuList2[448] = // 20 @0272 GPUREG_FIXEDATTRIB_DATA0 0,3e10,0 0x00, 0x00, 0x00, 0x00, 0x33, 0x02, 0x2f, 0x80, - 0x10, 0x3e, 0x00, 0x00, + 0x10, 0x3e, 0x00, 0x00, // <---- 280 003e10改为003e60 0x00, 0x00, 0x00, 0x00, // 21 @0288 GPUREG_FIXEDATTRIB_DATA0 3f00003e,0,477c00 @@ -743,8 +743,8 @@ alignas(16) u8 gbaGpuList2[448] = // 22 @0304 GPUREG_FIXEDATTRIB_DATA0 0,3e10,3e6800 0x00, 0x00, 0x00, 0x00, 0x33, 0x02, 0x2f, 0x80, - 0x10, 0x3e, 0x00, 0x00, - 0x00, 0x68, 0x3e, 0x00, + 0x10, 0x3e, 0x00, 0x00, // <---- 312 003e10改为003e60 + 0x00, 0x68, 0x3e, 0x00, // <---- 316 3e6800改为3de000 // 23 @0320 GPUREG_FIXEDATTRIB_DATA0 3f00003e,46e0,434000 0x3e, 0x00, 0x00, 0x3f, @@ -768,7 +768,7 @@ alignas(16) u8 gbaGpuList2[448] = 0x00, 0x00, 0x00, 0x00, 0x33, 0x02, 0x2f, 0x80, 0x00, 0x3f, 0x00, 0x00, - 0x00, 0x68, 0x3e, 0x00, + 0x00, 0x68, 0x3e, 0x00, // <---- 380 3e6800改为3de000 // 27 @0384 GPUREG_START_DRAW_FUNC0 1 0x01, 0x00, 0x00, 0x00, @@ -803,35 +803,74 @@ alignas(16) u8 gbaGpuList2[448] = 0x10, 0x00, 0x0f, 0x00 }; +#define LB_INDEX1 (944/4) +#define RB_INDEX1 (976/4) +#define LT_INDEX1 (1008/4) +#define RT_INDEX1 (1040/4) + +#define LB_INDEX2 (256/4) +#define RB_INDEX2 (288/4) +#define LT_INDEX2 (320/4) +#define RT_INDEX2 (352/4) + +static void patchCoord( u32 *initarr, u32 *updatearr ) +{ + initarr[LB_INDEX1] = updatearr[LB_INDEX2] = 0x3f00003e; + initarr[LB_INDEX1+2] = updatearr[LB_INDEX2+2] = 0x4440; + initarr[LB_INDEX1+3] = updatearr[LB_INDEX2+3] = 0; + + initarr[RB_INDEX1] = updatearr[RB_INDEX2] = 0x3f00003e; + initarr[RB_INDEX1+2] = updatearr[RB_INDEX2+2] = 0x4440; + initarr[RB_INDEX1+3] = updatearr[RB_INDEX2+3] = 0x46e000; + + initarr[LT_INDEX1] = updatearr[LT_INDEX2] = 0x3f00003e; + initarr[LT_INDEX1+2] = updatearr[LT_INDEX2+2] = 0x4690; + initarr[LT_INDEX1+3] = updatearr[LT_INDEX2+3] = 0; + + initarr[RT_INDEX1] = updatearr[RT_INDEX2] = 0x3f00003e; + initarr[RT_INDEX1+2] = updatearr[RT_INDEX2+2] = 0x4690; + initarr[RT_INDEX1+3] = updatearr[RT_INDEX2+3] = 0x46e000; +} + void patchGbaGpuCmdList(u8 scaleType) { + // 73 75 77 79 | 19 21 23 25 coord + // 74 76 78 80 | 20 22 24 26 texuv if(scaleType == 0u || scaleType == 3u) { - gbaGpuInitList[958] = 0x45u; - gbaGpuInitList[968] = 0x60u; - gbaGpuInitList[989] = 0x40u; - gbaGpuInitList[1000] = 0x60u; - *((u32*)&gbaGpuInitList[1004]) = 0x003DE000u; - gbaGpuInitList[1016] = 0x40u; - gbaGpuInitList[1022] = 0x45u; - gbaGpuInitList[1048] = 0x40u; - gbaGpuInitList[1053] = 0x40u; - *((u32*)&gbaGpuInitList[1068]) = 0x003DE000u; +/* // 这部分修改quad坐标,可以干掉了! + gbaGpuInitList[958] = 0x45u; // 73 + gbaGpuInitList[989] = 0x40u; // 75 + gbaGpuInitList[1016] = 0x40u; // 77 + gbaGpuInitList[1022] = 0x45u; // 77 + gbaGpuInitList[1048] = 0x40u; // 79 + gbaGpuInitList[1053] = 0x40u; // 79 - gbaGpuList2[270] = 0x45u; - gbaGpuList2[280] = 0x60u; - gbaGpuList2[301] = 0x40u; - gbaGpuList2[312] = 0x60u; - *((u32*)&gbaGpuList2[316]) = 0x003DE000u; - gbaGpuList2[328] = 0x40u; - gbaGpuList2[334] = 0x45u; - gbaGpuList2[360] = 0x40u; - gbaGpuList2[365] = 0x40u; - *((u32*)&gbaGpuList2[380]) = 0x003DE000u; + gbaGpuList2[270] = 0x45u; // 19 + gbaGpuList2[301] = 0x40u; // 21 + gbaGpuList2[328] = 0x40u; // 23 + gbaGpuList2[334] = 0x45u; // 23 + gbaGpuList2[360] = 0x40u; // 25 + gbaGpuList2[365] = 0x40u; // 25 +*/ + patchCoord( gbaGpuInitList, gbaGpuList2 ); + + // 以下8行代码修正纹理坐标 + gbaGpuInitList[968] = 0x60u; // 74 + gbaGpuInitList[1000] = 0x60u; // 76 + *((u32*)&gbaGpuInitList[1004]) = 0x003DE000u; // 76 + *((u32*)&gbaGpuInitList[1068]) = 0x003DE000u; // 80 + + gbaGpuList2[280] = 0x60u; // 20 + gbaGpuList2[312] = 0x60u; // 22 + *((u32*)&gbaGpuList2[316]) = 0x003DE000u; // 22 + *((u32*)&gbaGpuList2[380]) = 0x003DE000u; // 26 } else if(scaleType == 1u) { - gbaGpuInitList[572] = 0x02u; + gbaGpuInitList[572] = 0x02u; // 49 + + // 以下8行代码修正纹理坐标 gbaGpuInitList[968] = 0x60u; gbaGpuInitList[1000] = 0x60u; *((u32*)&gbaGpuInitList[1004]) = 0x003DE000u; diff --git a/source/arm11/open_agb_firm.c b/source/arm11/open_agb_firm.c index 8c58119..059dde4 100644 --- a/source/arm11/open_agb_firm.c +++ b/source/arm11/open_agb_firm.c @@ -689,14 +689,14 @@ static void gbaGfxHandler(void *args) // 地址0x18180000保存的是400x240大小的贴图数据rgb888(序列:↑↘↑) // 地址0x18200000保存的是512x512大小的GBA的240x160贴图数据(序列:→↙→) // 所以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字节 // 但是,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); } - else */if( g_oafConfig.scaler == 3 )//下屏无缩放 + else if( g_oafConfig.scaler == 3 )//下屏无缩放 { int base_offset = 16*240*3; GX_displayTransfer((u32*)(0x18180000), 320u<<16 | 240u,