-#if 0
-Window * RunEmu(void)
-{
-// extern uint32 * backbuffer;
- uint32 * overlayPixels = (uint32 *)sdlemuGetOverlayPixels();
- memset(overlayPixels, 0x00, 640 * 480 * 4); // Clear out overlay...
-
-//This is crappy... !!! FIX !!!
-// extern bool finished, showGUI;
-
- sdlemuDisableOverlay();
-
-// uint32 nFrame = 0, nFrameskip = 0;
- uint32 totalFrames = 0;
- finished = false;
- bool showMessage = true;
- uint32 showMsgFrames = 120;
- uint8 transparency = 0xFF;
- // Pass a message to the "joystick" code to debounce the ESC key...
- debounceRunKey = true;
-
- uint32 cartType = 4;
- if (jaguarRomSize == 0x200000)
- cartType = 0;
- else if (jaguarRomSize == 0x400000)
- cartType = 1;
- else if (jaguarMainRomCRC32 == 0x687068D5)
- cartType = 2;
- else if (jaguarMainRomCRC32 == 0x55A0669C)
- cartType = 3;
-
- const char * cartTypeName[5] = { "2M Cartridge", "4M Cartridge", "CD BIOS", "CD Dev BIOS", "Homebrew" };
- uint32 elapsedTicks = SDL_GetTicks(), frameCount = 0, framesPerSecond = 0;
-
- while (!finished)
- {
- // Set up new backbuffer with new pixels and data
- JaguarExecuteNew();
- totalFrames++;
-//WriteLog("Frame #%u...\n", totalFrames);
-//extern bool doDSPDis;
-//if (totalFrames == 373)
-// doDSPDis = true;
-
-//Problem: Need to do this *only* when the state changes from visible to not...
-//Also, need to clear out the GUI when not on (when showMessage is active...)
-if (showGUI || showMessage)
- sdlemuEnableOverlay();
-else
- sdlemuDisableOverlay();
-
-//Add in a new function for clearing patches of screen (ClearOverlayRect)
-
-// Also: Take frame rate into account when calculating fade time...
-
- // Some QnD GUI stuff here...
- if (showGUI)
- {
- FillScreenRectangle(overlayPixels, 8, 1*FONT_HEIGHT, 128, 4*FONT_HEIGHT, 0x00000000);
- extern uint32 gpu_pc, dsp_pc;
- DrawString(overlayPixels, 8, 1*FONT_HEIGHT, false, "GPU PC: %08X", gpu_pc);
- DrawString(overlayPixels, 8, 2*FONT_HEIGHT, false, "DSP PC: %08X", dsp_pc);
- DrawString(overlayPixels, 8, 4*FONT_HEIGHT, false, "%u FPS", framesPerSecond);
- }
-
- if (showMessage)
- {
- DrawString2(overlayPixels, 8, 24*FONT_HEIGHT, 0x007F63FF, transparency, "Running...");
- DrawString2(overlayPixels, 8, 26*FONT_HEIGHT, 0x001FFF3F, transparency, "%s, run address: %06X", cartTypeName[cartType], jaguarRunAddress);
- DrawString2(overlayPixels, 8, 27*FONT_HEIGHT, 0x001FFF3F, transparency, "CRC: %08X", jaguarMainRomCRC32);
-
- if (showMsgFrames == 0)
- {
- transparency--;
-
- if (transparency == 0)
-{
- showMessage = false;
-/*extern bool doGPUDis;
-doGPUDis = true;//*/
+ // FPS handling
+ // Approach: We use a ring buffer to store times (in ms) over a given
+ // amount of frames, then sum them to figure out the FPS.
+ uint32_t timestamp = SDL_GetTicks();
+ // This assumes the ring buffer size is a power of 2
+// ringBufferPointer = (ringBufferPointer + 1) & (RING_BUFFER_SIZE - 1);
+ // Doing it this way is better. Ring buffer size can be arbitrary then.
+ ringBufferPointer = (ringBufferPointer + 1) % RING_BUFFER_SIZE;
+ ringBuffer[ringBufferPointer] = timestamp - oldTimestamp;
+ uint32_t elapsedTime = 0;
+
+ for(uint32_t i=0; i<RING_BUFFER_SIZE; i++)
+ elapsedTime += ringBuffer[i];
+
+ // elapsedTime must be non-zero
+ if (elapsedTime == 0)
+ elapsedTime = 1;
+
+ // This is in frames per 10 seconds, so we can have 1 decimal
+ uint32_t framesPerSecond = (uint32_t)(((float)RING_BUFFER_SIZE / (float)elapsedTime) * 10000.0);
+ uint32_t fpsIntegerPart = framesPerSecond / 10;
+ uint32_t fpsDecimalPart = framesPerSecond % 10;
+ // If this is updated too frequently to be useful, we can throttle it down
+ // so that it only updates every 10th frame or so
+ statusBar()->showMessage(QString("%1.%2 FPS").arg(fpsIntegerPart).arg(fpsDecimalPart));
+ oldTimestamp = timestamp;