Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/test/d3d9main.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/test/d3d9main.cpp	(revision 84663)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/test/d3d9main.cpp	(revision 84664)
@@ -18,4 +18,6 @@
 #include "d3d9render.h"
 
+#include <stdio.h>
+
 #define D3D9TEST_MAX_DEVICES 2
 
@@ -39,5 +41,10 @@
 
     int miRenderId;
-    int miRenderStep;
+    enum
+    {
+        RenderModeStep = 0,
+        RenderModeContinuous = 1,
+        RenderModeFPS = 2
+    } miRenderMode;
     HWND mHwnd;
     IDirect3D9Ex *mpD3D9;
@@ -56,5 +63,5 @@
     mpRender(0),
     miRenderId(3),
-    miRenderStep(1)
+    miRenderMode(RenderModeStep)
 {
     memset(&mpaDevices, 0, sizeof(mpaDevices));
@@ -243,6 +250,13 @@
          return;
 
-    /* Second number is the step mode. */
-    miRenderStep = atoi(p);
+    /* Second number is the render/step mode. */
+    int i = atoi(p);
+    switch (i)
+    {
+        default:
+        case 0: miRenderMode = RenderModeStep;       break;
+        case 1: miRenderMode = RenderModeContinuous; break;
+        case 2: miRenderMode = RenderModeFPS;        break;
+    }
 }
 
@@ -283,8 +297,19 @@
     bool fFirst = true;
     MSG msg;
+
+    LARGE_INTEGER PerfFreq;
+    QueryPerformanceFrequency(&PerfFreq);
+    float const PerfPeriod = 1.0f / PerfFreq.QuadPart; /* Period in seconds. */
+
+    LARGE_INTEGER PrevTS;
+    QueryPerformanceCounter(&PrevTS);
+
+    int cFrames = 0;
+    float elapsed = 0;
+
     do
     {
         BOOL fGotMessage;
-        if (miRenderStep)
+        if (miRenderMode == RenderModeStep)
         {
             fGotMessage = GetMessageA(&msg, 0, 0, 0);
@@ -301,8 +326,6 @@
         }
 
-        float dt = 0.0f; /* Time in seconds since last render step. @todo Measure. */
-
         BOOL fDoRender = FALSE;
-        if (miRenderStep)
+        if (miRenderMode == RenderModeStep)
         {
             if (msg.message == WM_CHAR)
@@ -321,5 +344,9 @@
         if (fDoRender)
         {
-            dt = fFirst ? 0.0f : 0.1f; /* 0.1 second increment per step. */
+            LARGE_INTEGER CurrTS;
+            QueryPerformanceCounter(&CurrTS);
+
+            /* Time in seconds since the previous render step. */
+            float dt = fFirst ? 0.0f : (CurrTS.QuadPart - PrevTS.QuadPart) * PerfPeriod;
             if (mpRender)
             {
@@ -328,4 +355,22 @@
                 fFirst = false;
             }
+
+            if (miRenderMode == RenderModeFPS)
+            {
+                ++cFrames;
+                elapsed += dt;
+                if (elapsed > 1.0f)
+                {
+                    float msPerFrame = elapsed * 1000.0f / cFrames;
+                    char sz[256];
+                    _snprintf(sz, sizeof(sz), "D3D9 Test FPS %d Frame Time %fms", cFrames, msPerFrame);
+                    SetWindowTextA(mHwnd, sz);
+
+                    cFrames = 0;
+                    elapsed = 0.0f;
+                }
+            }
+
+            PrevTS = CurrTS;
         }
     } while (msg.message != WM_QUIT);
