PCSX2 Documentation/The PCSX2 Program Flow

From PCSX2 Wiki
Jump to navigation Jump to search

The following article is a very general overview of the flow of the PCSX2 application. It's a bit sloppy right now, I will clean it up more as I go along.

AppMain.cpp - It all starts here

There is a lot that happens under the hood with wxWidgets. We don't need to worry about that. All we need to worry about is this this line of code:

in AppMain.cpp

IMPLEMENT_APP(Pcsx2App)

This macro tells the wxWidgets framework that we want to fire up Pcsx2App. Easy, right?

Pcsx2App - the part we care about

Next, Let's take a look at this code here.


in App.h

class Pcsx2App : public wxAppWithHelpers{}

You can see here that the Pcsx2App class is an extension of the wxAppWithHelpers class. WxWidgets applications are defined as classes, which are instantiated into an object when we start the program. Pcsx2App contains methods that wxWidgets is going to call upon at various times. So what gets called when we fire up Pcsx2App? That would be OnInit(). Let's take a look, I have written some notes on what happens here:


in AppInit.cpp

bool Pcsx2App::OnInit()
{
	EnableAllLogging();
	Console.WriteLn("Interface is initializing.  Entering Pcsx2App::OnInit!");

Here we enable logging to the pcsx2 frame, and write some messages in it.


InitCPUTicks();

Misc. windows performance benchmarking, defined here.


pxDoAssert	= AppDoAssert;
pxDoOutOfMemory	= SysOutOfMemory_EmergencyResponse;

These are function pointers for the pxThread, which is the main threading class for the PCSX2 virtual machine. Basically here we are telling pxThread how to handle certain function calls. For example, if pxDoAssert is called, then we will actually call AppDoAssert, which defined here. Similarly, pxDoOutOfMemory will actually call SysOutOfMemory_EmergencyResponse, defined here.


wxInitAllImageHandlers();

Console.WriteLn("Applying operating system default language...");
i18n_SetLanguage( wxLANGUAGE_DEFAULT );

Console.WriteLn("Command line parsing...");
if( !_parent::OnInit() ) return false;
Console.WriteLn("Command line parsed!");

i18n_SetLanguagePath();

This is really straightforward. We're just doing some more initialization for the gui. We're creating an instance of AppConfig, which contains all kinds of options for wxWidgets. The declarations are here. We're also setting the PCSX2 language to whatever the operating system language is.

WxWidgets Frames

In addition to Application classes, there are also Frame classes. So when we call the OpenMainFrame function, what happens? Take a look at this code:

in pcsx2/gui/AppInit.cpp

void Pcsx2App::OpenMainFrame()
{
	if( AppRpc_TryInvokeAsync( &Pcsx2App::OpenMainFrame ) ) return;

	if( GetMainFramePtr() != NULL ) return;

	MainEmuFrame* mainFrame = new MainEmuFrame( NULL, pxGetAppName() );

...
}

Here we're creating an instance of the MainEmuFrame class. That class contains members for all the cool GUI elements, buttons, menus, stuff like that. So let's take a step further. Suppose we want to boot up a game. When we select Boot DVD in the pcsx2 menus, we are calling upon this function here:

in MainMenuClicks.cpp

void MainEmuFrame::_DoBootCdvd()

Into The Core

OK, this is where things start to get a little complicated. PCSX2 is basically divided up into a few different parts:

SysExecutorThread

Handles the PCSX2 "Core" (Virtual Machine, GUI, etc). Instance of ExecutorThread, which is a "proxy". It basically queues up jobs and then distributes them to a worker thread.

SysMtgsThread

Handles the Graphics Synthesizer (GSdx or other plugins).