From d1fb484e807ffeb55fd0d66707f3193fbb5a31fe Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Thu, 10 May 2018 14:45:39 +0200
Subject: [PATCH] prevent GPU from blocking main thread

---
 src/render.c      |  8 ++++----
 src/render_soft.c |  2 ++
 src/surface.c     | 19 +++++++++++++++----
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/render.c b/src/render.c
index 8b9dd1b..56670e8 100644
--- a/src/render.c
+++ b/src/render.c
@@ -41,8 +41,8 @@ const GLchar *PaletteFragShaderSrc =
     "\n"
     "void main()\n"
     "{\n"
-    "   vec4 myindex = texture2D(SurfaceTex, TexCoord0); \n"
-    "   vec4 texel = texture2D(PaletteTex, myindex.xy); \n"
+    "   vec4 index = texture2D(SurfaceTex, TexCoord0); \n"
+    "   vec4 texel = texture2D(PaletteTex, index.xy); \n"
     "   gl_FragColor = texel;\n"
     "}\n";
 
@@ -51,6 +51,8 @@ BOOL detect_cutscene();
 
 DWORD WINAPI render_main(void)
 {
+    Sleep(500);
+
     HGLRC hRC = wglCreateContext(ddraw->render.hDC);
     wglMakeCurrent(ddraw->render.hDC, hRC);
 
@@ -243,8 +245,6 @@ DWORD WINAPI render_main(void)
             if (tick_end - tick_start < frame_len)
                 Sleep(frame_len - (tick_end - tick_start));
         }
-
-        SetEvent(ddraw->render.ev);
     }
 
     HeapFree(GetProcessHeap(), 0, tex);
diff --git a/src/render_soft.c b/src/render_soft.c
index 6770ff9..3e54212 100644
--- a/src/render_soft.c
+++ b/src/render_soft.c
@@ -56,6 +56,8 @@ BOOL detect_cutscene()
 
 DWORD WINAPI render_soft_main(void)
 {
+    Sleep(500);
+
     PBITMAPINFO bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
 
     bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
diff --git a/src/surface.c b/src/surface.c
index c8b4e42..9120dfe 100644
--- a/src/surface.c
+++ b/src/surface.c
@@ -22,6 +22,7 @@
 
 void dump_ddscaps(DWORD dwCaps);
 void dump_ddsd(DWORD dwFlags);
+DWORD WINAPI render_main(void);
 
 HRESULT __stdcall ddraw_surface_QueryInterface(IDirectDrawSurfaceImpl *This, REFIID riid, void **obj)
 {
@@ -123,8 +124,13 @@ HRESULT __stdcall ddraw_surface_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestR
     if(This->caps & DDSCAPS_PRIMARYSURFACE && !(This->flags & DDSD_BACKBUFFERCOUNT) && ddraw->render.run)
     {
         ReleaseSemaphore(ddraw->render.sem, 1, NULL);
-        WaitForSingleObject(ddraw->render.ev, INFINITE);
-        ResetEvent(ddraw->render.ev);
+        if (ddraw->renderer != render_main)
+        {
+            WaitForSingleObject(ddraw->render.ev, INFINITE);
+            ResetEvent(ddraw->render.ev);
+        }
+        else
+            SwitchToThread();
     }
 
     return DD_OK;
@@ -203,9 +209,14 @@ HRESULT __stdcall ddraw_surface_Flip(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWS
 
     if(This->caps & DDSCAPS_PRIMARYSURFACE && ddraw->render.run)
     {
-        ResetEvent(ddraw->render.ev);
         ReleaseSemaphore(ddraw->render.sem, 1, NULL);
-        WaitForSingleObject(ddraw->render.ev, INFINITE);
+        if (ddraw->renderer != render_main)
+        {
+            ResetEvent(ddraw->render.ev);
+            WaitForSingleObject(ddraw->render.ev, INFINITE);
+        }
+        else
+            SwitchToThread();
     }
 
     return DD_OK;