From 27786f835df39aab4cf4e17e9dcc0e34d4a96fdb Mon Sep 17 00:00:00 2001 From: mtabachenko Date: Thu, 18 Dec 2008 00:36:54 +0000 Subject: [PATCH] core: - fix capture display (fixed blinking with both 3D screens ex.Sonic Rush, Metroid Prime etc) --- desmume/src/GPU.cpp | 97 ++++++++++++++++++++++----------------- desmume/src/NDSSystem.cpp | 5 +- 2 files changed, 57 insertions(+), 45 deletions(-) diff --git a/desmume/src/GPU.cpp b/desmume/src/GPU.cpp index ffd219bdb..27ee8395d 100644 --- a/desmume/src/GPU.cpp +++ b/desmume/src/GPU.cpp @@ -227,7 +227,7 @@ void GPU_DeInit(GPU * gpu) static void GPU_resortBGs(GPU *gpu) { - int i, j, prio; + int i, prio; struct _DISPCNT * cnt = &gpu->dispx_st->dispx_DISPCNT.bits; itemsForPriority_t * item; @@ -250,14 +250,13 @@ static void GPU_resortBGs(GPU *gpu) item->nbBGs=0; item->nbPixelsX=0; } - for (i=NB_BG,j=0; i>0; ) { + for (i=NB_BG; i>0; ) { i--; if (!gpu->LayersEnable[i]) continue; prio = (gpu->dispx_st)->dispx_BGxCNT[i].bits.Priority; item = &(gpu->itemsForPriority[prio]); item->BGs[item->nbBGs]=i; item->nbBGs++; - j++; } #if 0 @@ -345,14 +344,9 @@ void GPU_setVideoProp(GPU * gpu, u32 p) gpu->spriteRender = sprite2D; } - if(cnt->OBJ_BMP_1D_Bound && (gpu->core == GPU_MAIN)) - { - gpu->sprBMPBoundary = 8; - } - else - { - gpu->sprBMPBoundary = 7; - } + gpu->sprBMPBoundary = 128; + if(gpu->core == GPU_MAIN) + gpu->sprBMPBoundary = cnt->OBJ_BMP_1D_Bound * 256; gpu->sprEnable = cnt->OBJ_Enable; @@ -1072,7 +1066,6 @@ INLINE void extRotBG2(GPU * gpu, u8 num, u8 * dst, u16 H, s32 X, s32 Y, s16 PA, if (!tile) return; pal = ARM9Mem.ExtPal[gpu->core][gpu->BGExtPalSlot[num]]; if (!pal) return; - // 16 bit bgmap entries apply_rot_fun(gpu, num, dst, H,X,Y,PA,PB,PC,PD,LG, rot_tiled_16bit_entry, map, tile, pal); return; @@ -1561,11 +1554,7 @@ void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab) if (spriteInfo->Mode == 3) /* sprite is in BMP format */ { // TODO: fix it for sprite1D - /*if (spriteInfo->Depth) - src = (u8 *)MMU_RenderMapToLCD(gpu->sprMem + (((spriteInfo->TileIndex&0x3F0) * 64 + (spriteInfo->TileIndex&0x0F) *8 + ( y << 8)) << 1)); - else - src = (u8 *)MMU_RenderMapToLCD(gpu->sprMem + (((spriteInfo->TileIndex&0x3E0) * 64 + (spriteInfo->TileIndex&0x1F) *8 + ( y << 8)) << 1));*/ - src = (u8 *)MMU_RenderMapToLCD(gpu->sprMem + (spriteInfo->TileIndex<<4) + (y<sprBMPBoundary)); + src = (u8 *)MMU_RenderMapToLCD(gpu->sprMem + (((spriteInfo->TileIndex&0x3E0) * 64 + (spriteInfo->TileIndex&0x1F) *8 + ( y << 8)) << 1)); CHECK_SPRITE(1); render_sprite_BMP (gpu, l, dst, (u16*)src, prioTab, prio, lg, sprX, x, xdir); @@ -1829,10 +1818,10 @@ void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab) if (spriteInfo->Mode == 3) /* sprite is in BMP format */ { - if (spriteInfo->Depth) // 128 * 512 - src = (u8 *)MMU_RenderMapToLCD(gpu->sprMem + (((spriteInfo->TileIndex&0x3F0) * 64 + (spriteInfo->TileIndex&0x0F) *8 + ( y << 8)) << 1)); - else // 256*256 + if (dispCnt->OBJ_BMP_2D_dim) // 256*256 src = (u8 *)MMU_RenderMapToLCD(gpu->sprMem + (((spriteInfo->TileIndex&0x3E0) * 64 + (spriteInfo->TileIndex&0x1F) *8 + ( y << 8)) << 1)); + else // 128 * 512 + src = (u8 *)MMU_RenderMapToLCD(gpu->sprMem + (((spriteInfo->TileIndex&0x3F0) * 64 + (spriteInfo->TileIndex&0x0F) *8 + ( y << 8)) << 1)); CHECK_SPRITE(2); render_sprite_BMP (gpu, l, dst, (u16*)src, prioTab, prio, lg, sprX, x, xdir); @@ -2074,6 +2063,7 @@ static void calc_bright_colors() { #undef FORMULA_LESS } #endif + static INLINE void GPU_ligne_layer(NDS_Screen * screen, u16 l) { GPU * gpu = screen->gpu; @@ -2085,14 +2075,18 @@ static INLINE void GPU_ligne_layer(NDS_Screen * screen, u16 l) u8 prio; u16 i16; u32 c; - + BOOL BG_enabled = TRUE; + c = T1ReadWord(ARM9Mem.ARM9_VMEM, gpu->core * 0x400); - + for(int i = 0; i< 256; ++i) T2WriteWord(dst, i << 1, c); + + if (!gpu->LayersEnable[0] && !gpu->LayersEnable[1] && + !gpu->LayersEnable[2] && !gpu->LayersEnable[3] && + !gpu->LayersEnable[4]) return; + // init background color & priorities for(int i = 0; i< 256; ++i) { - T2WriteWord(dst, i << 1, c); - T2WriteWord(spr, i << 1, c); sprPrio[i]=0xFF; gpu->sprWin[l][i]=0; } @@ -2101,11 +2095,14 @@ static INLINE void GPU_ligne_layer(NDS_Screen * screen, u16 l) for (int i=0; iitemsForPriority[i].nbPixelsX = 0; } - + // for all the pixels in the line - if (gpu->LayersEnable[4]) { + if (gpu->LayersEnable[4]) + { + for(int i = 0; i< 256; ++i) T2WriteWord(spr, i << 1, c); gpu->spriteRender(gpu, l, spr, sprPrio); - for(int i = 0; i<256; i++) { + for(int i = 0; i<256; i++) + { // assign them to the good priority item prio = sprPrio[i]; if (prio >=4) continue; @@ -2116,6 +2113,10 @@ static INLINE void GPU_ligne_layer(NDS_Screen * screen, u16 l) } } + + if (!gpu->LayersEnable[0] && !gpu->LayersEnable[1] && !gpu->LayersEnable[2] && !gpu->LayersEnable[3]) + BG_enabled = FALSE; + // paint lower priorities fist // then higher priorities on top for(prio=NB_PRIORITIES; prio > 0; ) @@ -2123,25 +2124,33 @@ static INLINE void GPU_ligne_layer(NDS_Screen * screen, u16 l) prio--; item = &(gpu->itemsForPriority[prio]); // render BGs - for (int i=0; i < item->nbBGs; i++) + if (BG_enabled) { - i16 = item->BGs[i]; - - // If BG0, core A, and 3D is enabled, ask the gpu3D plugin for data - if (i16 == 0 && dispCnt->BG0_3D && gpu->core == 0) - { - gpu3D->NDS_3D_GetLine (l, (u16*)dst); - } - else + for (int i=0; i < item->nbBGs; i++) { + i16 = item->BGs[i]; if (gpu->LayersEnable[i16]) + { + if (gpu->core == GPU_MAIN) + { + if (i16 == 0 && dispCnt->BG0_3D) + { + gpu3D->NDS_3D_GetLine (l, (u16*)dst); + continue; + } + } modeRender[dispCnt->BG_Mode][i16](gpu, i16, l, dst); + } } } // render sprite Pixels - for (int i=0; i < item->nbPixelsX; i++) { - i16=item->PixelsX[i]; - T2WriteWord(dst, i16 << 1, T2ReadWord(spr, i16 << 1)); + if (gpu->LayersEnable[4]) + { + for (int i=0; i < item->nbPixelsX; i++) + { + i16=item->PixelsX[i]; + T2WriteWord(dst, i16 << 1, T2ReadWord(spr, i16 << 1)); + } } } } @@ -2180,7 +2189,9 @@ static INLINE void GPU_ligne_DispCapture(u16 l) { //INFO("Capture screen (BG + OBJ + 3D)\n"); u8 *src = (u8 *)(GPU_screen) + (MainScreen.offset + l) * 512; - memcpy(cap_dst, src, (gpu->dispCapCnt.capx<<1)); + for (int i = 0; i < gpu->dispCapCnt.capx; i++) + T2WriteWord(cap_dst, i << 1, T2ReadWord(src, i << 1) | (1<<15)); + } break; case 1: // Capture 3D @@ -2188,7 +2199,8 @@ static INLINE void GPU_ligne_DispCapture(u16 l) u16 cap3DLine[256]; //INFO("Capture 3D\n"); gpu3D->NDS_3D_GetLine (l, (u16*)cap3DLine); - memcpy(cap_dst, cap3DLine, (gpu->dispCapCnt.capx<<1)); + for (int i = 0; i < gpu->dispCapCnt.capx; i++) + T2WriteWord(cap_dst, i << 1, T2ReadWord((u8 *)cap3DLine, i << 1) | (1<<15)); } break; } @@ -2362,7 +2374,6 @@ void GPU_ligne(NDS_Screen * screen, u16 l) case 0: // Display Off(Display white) { u8 * dst = GPU_screen + (screen->offset + l) * 512; - for (int i=0; i<256; i++) T2WriteWord(dst, i << 1, 0x7FFF); } @@ -2376,7 +2387,7 @@ void GPU_ligne(NDS_Screen * screen, u16 l) { u8 * dst = GPU_screen + (screen->offset + l) * 512; u8 * src = gpu->VRAMaddr + (l*512); - memcpy(dst, gpu->VRAMaddr + (l*512), 512); + memcpy(dst, src, 512); } break; case 3: diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp index a3ebaadfa..6892c19c4 100644 --- a/desmume/src/NDSSystem.cpp +++ b/desmume/src/NDSSystem.cpp @@ -904,8 +904,6 @@ u32 NDS_exec(s32 nb) LOG(logbuf); } #endif - NDS_makeARM9Int(21); // GX geometry - for (i = 0; i < INSTRUCTIONS_PER_BATCH && (!FORCE) && (execute); i++) { if(NDS_ARM9.waitIRQ) { @@ -1549,6 +1547,9 @@ u32 NDS_exec(s32 nb) MMU.CheckDMAs &= ~(1<<(3+(1<<2))); } } + + if(MMU.reg_IE[0]&(1<<21)) + NDS_makeARM9Int(21); // GX geometry if((MMU.reg_IF[0]&MMU.reg_IE[0]) && (MMU.reg_IME[0])) {