1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

prevent GPU from blocking main thread

This commit is contained in:
FunkyFr3sh 2018-05-10 14:45:39 +02:00
parent 09ada60736
commit d1fb484e80
3 changed files with 21 additions and 8 deletions

View File

@ -41,8 +41,8 @@ const GLchar *PaletteFragShaderSrc =
"\n" "\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec4 myindex = texture2D(SurfaceTex, TexCoord0); \n" " vec4 index = texture2D(SurfaceTex, TexCoord0); \n"
" vec4 texel = texture2D(PaletteTex, myindex.xy); \n" " vec4 texel = texture2D(PaletteTex, index.xy); \n"
" gl_FragColor = texel;\n" " gl_FragColor = texel;\n"
"}\n"; "}\n";
@ -51,6 +51,8 @@ BOOL detect_cutscene();
DWORD WINAPI render_main(void) DWORD WINAPI render_main(void)
{ {
Sleep(500);
HGLRC hRC = wglCreateContext(ddraw->render.hDC); HGLRC hRC = wglCreateContext(ddraw->render.hDC);
wglMakeCurrent(ddraw->render.hDC, hRC); wglMakeCurrent(ddraw->render.hDC, hRC);
@ -243,8 +245,6 @@ DWORD WINAPI render_main(void)
if (tick_end - tick_start < frame_len) if (tick_end - tick_start < frame_len)
Sleep(frame_len - (tick_end - tick_start)); Sleep(frame_len - (tick_end - tick_start));
} }
SetEvent(ddraw->render.ev);
} }
HeapFree(GetProcessHeap(), 0, tex); HeapFree(GetProcessHeap(), 0, tex);

View File

@ -56,6 +56,8 @@ BOOL detect_cutscene()
DWORD WINAPI render_soft_main(void) DWORD WINAPI render_soft_main(void)
{ {
Sleep(500);
PBITMAPINFO bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); PBITMAPINFO bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

View File

@ -22,6 +22,7 @@
void dump_ddscaps(DWORD dwCaps); void dump_ddscaps(DWORD dwCaps);
void dump_ddsd(DWORD dwFlags); void dump_ddsd(DWORD dwFlags);
DWORD WINAPI render_main(void);
HRESULT __stdcall ddraw_surface_QueryInterface(IDirectDrawSurfaceImpl *This, REFIID riid, void **obj) 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) if(This->caps & DDSCAPS_PRIMARYSURFACE && !(This->flags & DDSD_BACKBUFFERCOUNT) && ddraw->render.run)
{ {
ReleaseSemaphore(ddraw->render.sem, 1, NULL); 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);
ResetEvent(ddraw->render.ev);
}
else
SwitchToThread();
} }
return DD_OK; return DD_OK;
@ -203,9 +209,14 @@ HRESULT __stdcall ddraw_surface_Flip(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWS
if(This->caps & DDSCAPS_PRIMARYSURFACE && ddraw->render.run) if(This->caps & DDSCAPS_PRIMARYSURFACE && ddraw->render.run)
{ {
ResetEvent(ddraw->render.ev);
ReleaseSemaphore(ddraw->render.sem, 1, NULL); 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; return DD_OK;