- Code: Select all
signed int PRO_DisplayDatabase()
{
signed int v0; // esi@1
signed int v1; // edi@1
int v2; // ebx@1
int v3; // ecx@1
int v4; // eax@3
int v5; // eax@5
PRO_Viewport *v6; // ecx@7
PRO_Dynamic_Update *v7; // ecx@9
int v8; // eax@12
int v9; // edi@14
int v10; // ebx@14
__int32 v11; // ST00_4@15
PRO_Vertex *v12; // eax@15
v0 = 1;
v1 = 1;
v2 = *(_DWORD *)(*((_DWORD *)g_API_Data + 3) + 2316);
v3 = *((_DWORD *)g_API_Data + 4859);
if ( v3 )
{
v1 = *(_DWORD *)(v3 + 8);
PRO_Dynamic_Update::DoUpdate((PRO_Dynamic_Update *)v3);
}
v4 = PRO_API_Data::FormatUserTextures(g_API_Data);
if ( v4 != 1 )
v0 = v4;
v5 = PRO_API_Data::FormatUserMicroTextures(g_API_Data);
if ( v5 != 1 )
v0 = v5;
PRO_SetScroll(0);
PRO_ProcessAnimations();
v6 = (PRO_Viewport *)*((_DWORD *)g_API_Data + 47);
if ( v6 )
PRO_Viewport::UpdateSiblingPointers(v6);
PRO_Directional_Light_List::ProcessDirectionalLightList(*((PRO_Directional_Light_List **)g_API_Data + 323));
PRO_Range_Node_List::ProcessRangeLodNodeList(*((PRO_Range_Node_List **)g_API_Data + 324));
PRO_Memory_Manager::WriteDataToHardware(*((_DWORD *)g_API_Data + 2));
PRO_Memory_Manager::WriteDataToHardware(*((_DWORD *)g_API_Data + 1));
PRO_PingPong_Manager::WriteAllDataToHardware(*(_DWORD *)g_API_Data);
v7 = (PRO_Dynamic_Update *)*((_DWORD *)g_API_Data + 4859);
if ( v7 )
PRO_Dynamic_Update::DoIO(v7);
PRO_Flush();
if ( *(_DWORD *)(*((_DWORD *)g_API_Data + 3) + 2316) - v2 > 1 )
{
v0 = 4;
v8 = *((_DWORD *)g_API_Data + 4859);
if ( v8 )
++*(_DWORD *)(v8 + 4 * v1 + 1048);
}
v9 = 0;
v10 = *(_DWORD *)(*((_DWORD *)g_API_Data + 61) + 4);
if ( v10 > 0 )
{
do
{
v11 = v9++;
v12 = (PRO_Vertex *)PRO_Generic_List::GetEntryByIndex(*((PRO_Generic_List **)g_API_Data + 61), v11);
PRO_Vertex::ResetChangeAttributes(v12);
}
while ( v10 > v9 );
}
*(_DWORD *)(*((_DWORD *)g_API_Data + 61) + 4) = 0;
++*((_DWORD *)g_API_Data + 329);
++*((_DWORD *)g_API_Data + 330);
return v0;
}
The important lines are the memory order things get written
PRO_Memory_Manager::WriteDataToHardware(*((_DWORD *)g_API_Data + 2)); <--- Polygon ram update
PRO_Memory_Manager::WriteDataToHardware(*((_DWORD *)g_API_Data + 1)); <--- marked as '_static_MM'
PRO_PingPong_Manager::WriteAllDataToHardware(*(_DWORD *)g_API_Data); <--- Culling memory
So it should read as such ..
Polygon ram update
Culling memory update
SDL_SwapBuffers()
A lot of the games are coming out like this
WriteHighCullingRAM
flush 0x88000000 <- Swap buffers should happen here
WritePolygonRAM
SDL_SwapBuffers()
The culling memory updates are happening a frame late. I think this explains a lot of the mysterious bugs in daytona, magical truck, ocean hunter, and other games where things are visibly broken.
A lot of games are doing this as well
flush 88000000 < -- one swap buffer should happen
SDL_SwapBuffers() < -- same frame drawn twice
SDL_SwapBuffers()
WriteHighCullingRAM