1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +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"
"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);

View File

@ -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);

View File

@ -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;