diff --git a/src/render_ogl.c b/src/render_ogl.c
index a37ef07..ab2453a 100644
--- a/src/render_ogl.c
+++ b/src/render_ogl.c
@@ -187,6 +187,24 @@ static void ogl_build_programs()
 
         if (g_ogl.main_program)
         {
+            static WIN32_FIND_DATA findFileData;
+            static HANDLE hFind;
+
+            if (!hFind)
+            {
+                hFind = FindFirstFile("Shaders\\*.glsl", &findFileData);
+            }
+            else if (hFind != INVALID_HANDLE_VALUE)
+            {
+                FindNextFile(hFind, &findFileData);
+            }
+
+            if (hFind != INVALID_HANDLE_VALUE)
+            {
+                strcpy(g_ddraw->shader, "Shaders\\");
+                strcat(g_ddraw->shader, findFileData.cFileName);
+            }
+
             g_ogl.scale_program = oglu_build_program_from_file(g_ddraw->shader);
         }
         else
@@ -595,9 +613,17 @@ static void ogl_render()
     while (g_ogl.use_opengl && g_ddraw->render.run &&
         (g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED))
     {
-#if _DEBUG
         dbg_draw_frame_info_start();
-#endif
+
+        RECT debugrc = { 0, 0, g_ddraw->width, g_ddraw->height };
+
+        if (g_ddraw->primary)
+        {
+            if (g_ddraw->primary->palette && g_ddraw->primary->palette->data_rgb)
+                SetDIBColorTable(g_ddraw->primary->hdc, 0, 256, g_ddraw->primary->palette->data_rgb);
+
+            DrawText(g_ddraw->primary->hdc, g_ddraw->shader, -1, &debugrc, DT_NOCLIP | DT_RIGHT);
+        }
 
         g_ogl.scale_w = (float)g_ddraw->width / g_ogl.surface_tex_width;
         g_ogl.scale_h = (float)g_ddraw->height / g_ogl.surface_tex_height;
@@ -832,9 +858,7 @@ static void ogl_render()
 
         SwapBuffers(g_ddraw->render.hdc);
 
-#if _DEBUG
         dbg_draw_frame_info_end();
-#endif
 
         if (g_ddraw->fps_limiter.tick_length > 0)
         {
diff --git a/src/wndproc.c b/src/wndproc.c
index 3cbc95c..68c0e9e 100644
--- a/src/wndproc.c
+++ b/src/wndproc.c
@@ -487,6 +487,26 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
         }
         case WM_KEYDOWN:
         {
+            if (wParam == VK_F11)
+            {
+                if (g_ddraw->render.thread)
+                {
+                    EnterCriticalSection(&g_ddraw->cs);
+                    g_ddraw->render.run = FALSE;
+                    ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
+                    LeaveCriticalSection(&g_ddraw->cs);
+                    WaitForSingleObject(g_ddraw->render.thread, INFINITE);
+
+                    InterlockedExchange(&g_ddraw->render.palette_updated, TRUE);
+                    InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
+                    ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
+                    g_ddraw->render.run = TRUE;
+                    g_ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw->renderer, NULL, 0, NULL);
+                }
+
+                return 0;
+            }
+
             if (wParam == VK_CONTROL || wParam == VK_TAB)
             {
                 if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(VK_TAB) & 0x8000)