From d1fb484e807ffeb55fd0d66707f3193fbb5a31fe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh 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;