void DLParser_Process() { dlistMtxCount = 0; bHalfTxtScale = false; if ( CRender::g_pRender == NULL) { TriggerDPInterrupt(); return; } status.bScreenIsDrawn = true; DebuggerPauseCountN( NEXT_DLIST ); status.gRDPTime = timeGetTime(); status.gDlistCount++; OSTask * pTask = (OSTask *)(g_GraphicsInfo.DMEM + 0x0FC0); u32 code_base = (u32)pTask->t.ucode & 0x1fffffff; u32 code_size = pTask->t.ucode_size; u32 data_base = (u32)pTask->t.ucode_data & 0x1fffffff; u32 data_size = pTask->t.ucode_data_size; u32 stack_size = pTask->t.dram_stack_size >> 6; if (gLastUcodeBase != code_base) { DLParser_InitMicrocode(code_base, code_size, data_base, data_size); } // Initialize stack status.bN64FrameBufferIsUsed = false; gDlistStackPointer=0; gDlistStack[gDlistStackPointer].pc = (uint32)pTask->t.data_ptr; gDlistStack[gDlistStackPointer].countdown = MAX_DL_COUNT; DEBUGGER_PAUSE_AT_COND_AND_DUMP_COUNT_N((gDlistStack[gDlistStackPointer].pc == 0 && pauseAtNext && eventToPause==NEXT_UNKNOWN_OP), {DebuggerAppendMsg("Start Task without DLIST: ucode=%08X, data=%08X", (uint32)pTask->t.ucode, (uint32)pTask->t.ucode_data);});
//***************************************************************************** // //***************************************************************************** u32 DLParser_Process(u32 instruction_limit, DLDebugOutput * debug_output) { DAEDALUS_PROFILE( "DLParser_Process" ); if ( !CGraphicsContext::Get()->IsInitialised() || !gRenderer ) { return 0; } // Shut down the debug console when we start rendering // TODO: Clear the front/backbuffer the first time this function is called // to remove any stuff lingering on the screen. if(gFirstCall) { CGraphicsContext::Get()->ClearAllSurfaces(); gFirstCall = false; } // Update Screen only when something is drawn, otherwise several games ex Army Men will flash or shake. if( g_ROM.GameHacks != CHAMELEON_TWIST_2 ) gGraphicsPlugin->UpdateScreen(); OSTask * pTask = (OSTask *)(g_pu8SpMemBase + 0x0FC0); u32 code_base = (u32)pTask->t.ucode & 0x1fffffff; u32 code_size = pTask->t.ucode_size; u32 data_base = (u32)pTask->t.ucode_data & 0x1fffffff; u32 data_size = pTask->t.ucode_data_size; u32 stack_size = pTask->t.dram_stack_size >> 6; if ( gLastUcodeBase != code_base ) { DLParser_InitMicrocode( code_base, code_size, data_base, data_size ); } // // Not sure what to init this with. We should probably read it from the dmem // gRDPOtherMode.L = 0x00500001; gRDPOtherMode.H = 0; gRDPFrame++; CTextureCache::Get()->PurgeOldTextures(); // Initialise stack gDlistStackPointer=0; gDlistStack.address[0] = (u32)pTask->t.data_ptr; gDlistStack.limit = -1; gRDPStateManager.Reset(); #ifdef DAEDALUS_DEBUG_DISPLAYLIST gNumDListsCulled = 0; gNumVertices = 0; gNumRectsClipped = 0; if (debug_output) DLDebug_SetOutput(debug_output); DLDebug_DumpTaskInfo( pTask ); #endif DL_PF("DP: Firing up RDP!"); u32 count = 0; if(!gFrameskipActive) { gRenderer->SetVIScales(); gRenderer->ResetMatrices(stack_size); gRenderer->Reset(); gRenderer->BeginScene(); count = DLParser_ProcessDList(instruction_limit); gRenderer->EndScene(); } // Hack for Chameleon Twist 2, only works if screen is update at last // if( g_ROM.GameHacks == CHAMELEON_TWIST_2 ) gGraphicsPlugin->UpdateScreen(); // Do this regardless! FinishRDPJob(); #ifdef DAEDALUS_DEBUG_DISPLAYLIST DLDebug_SetOutput(NULL); // NB: only update gNumInstructionsExecuted when we rendered something. // I'd really like to get rid of gNumInstructionsExecuted. if (!gFrameskipActive) gNumInstructionsExecuted = count; #endif #ifdef DAEDALUS_BATCH_TEST_ENABLED CBatchTestEventHandler * handler( BatchTest_GetHandler() ); if( handler ) handler->OnDisplayListComplete(); #endif return count; }