mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
temporarily revert rendering changes - need to find a better solution later
This commit is contained in:
parent
8f3b947eb1
commit
d0cf60b618
8
ddraw.rc
8
ddraw.rc
@ -1,6 +1,6 @@
|
|||||||
1 VERSIONINFO
|
1 VERSIONINFO
|
||||||
FILEVERSION 1,1,1,0
|
FILEVERSION 1,1,2,0
|
||||||
PRODUCTVERSION 1,1,1,0
|
PRODUCTVERSION 1,1,2,0
|
||||||
{
|
{
|
||||||
BLOCK "StringFileInfo"
|
BLOCK "StringFileInfo"
|
||||||
{
|
{
|
||||||
@ -8,13 +8,13 @@ PRODUCTVERSION 1,1,1,0
|
|||||||
{
|
{
|
||||||
VALUE "CompanyName", "cncnet.org"
|
VALUE "CompanyName", "cncnet.org"
|
||||||
VALUE "FileDescription", "DirectDraw replacement for C&C95 and Red Alert"
|
VALUE "FileDescription", "DirectDraw replacement for C&C95 and Red Alert"
|
||||||
VALUE "FileVersion", "1.1.1.0"
|
VALUE "FileVersion", "1.1.2.0"
|
||||||
VALUE "InternalName", "ddraw"
|
VALUE "InternalName", "ddraw"
|
||||||
VALUE "LegalCopyright", "Copyright (c) 2010-2017"
|
VALUE "LegalCopyright", "Copyright (c) 2010-2017"
|
||||||
VALUE "LegalTrademarks", ""
|
VALUE "LegalTrademarks", ""
|
||||||
VALUE "OriginalFileName", "ddraw.dll"
|
VALUE "OriginalFileName", "ddraw.dll"
|
||||||
VALUE "ProductName", "DirectDraw replacement for C&C95 and Red Alert"
|
VALUE "ProductName", "DirectDraw replacement for C&C95 and Red Alert"
|
||||||
VALUE "ProductVersion", "1.1.1.0"
|
VALUE "ProductVersion", "1.1.2.0"
|
||||||
VALUE "Comments", "https://cncnet.org"
|
VALUE "Comments", "https://cncnet.org"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
39
src/main.c
39
src/main.c
@ -191,6 +191,18 @@ HRESULT __stdcall ddraw_RestoreDisplayMode(IDirectDrawImpl *This)
|
|||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* only stop drawing in GL mode when minimized */
|
||||||
|
if (This->renderer == render_main)
|
||||||
|
{
|
||||||
|
EnterCriticalSection(&This->cs);
|
||||||
|
This->render.run = FALSE;
|
||||||
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
|
LeaveCriticalSection(&This->cs);
|
||||||
|
|
||||||
|
WaitForSingleObject(This->render.thread, INFINITE);
|
||||||
|
This->render.thread = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if(!ddraw->windowed)
|
if(!ddraw->windowed)
|
||||||
{
|
{
|
||||||
ChangeDisplaySettings(&This->mode, 0);
|
ChangeDisplaySettings(&This->mode, 0);
|
||||||
@ -237,7 +249,7 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
|
|||||||
if(This->render.thread == NULL)
|
if(This->render.thread == NULL)
|
||||||
{
|
{
|
||||||
This->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)This->renderer, NULL, 0, NULL);
|
This->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)This->renderer, NULL, 0, NULL);
|
||||||
SetThreadPriority(This->render.thread, THREAD_PRIORITY_BELOW_NORMAL);
|
//SetThreadPriority(This->render.thread, THREAD_PRIORITY_BELOW_NORMAL);
|
||||||
}
|
}
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
@ -303,7 +315,7 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
|
|||||||
if(This->render.thread == NULL)
|
if(This->render.thread == NULL)
|
||||||
{
|
{
|
||||||
This->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)This->renderer, NULL, 0, NULL);
|
This->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)This->renderer, NULL, 0, NULL);
|
||||||
SetThreadPriority(This->render.thread, THREAD_PRIORITY_BELOW_NORMAL);
|
//SetThreadPriority(This->render.thread, THREAD_PRIORITY_BELOW_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
@ -653,15 +665,15 @@ ULONG __stdcall ddraw_Release(IDirectDrawImpl *This)
|
|||||||
PostMessage(This->hWnd, WM_USER, 0, 0);
|
PostMessage(This->hWnd, WM_USER, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (This->render.thread)
|
if(This->render.run)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&This->cs);
|
EnterCriticalSection(&This->cs);
|
||||||
HANDLE thread = This->render.thread;
|
This->render.run = FALSE;
|
||||||
This->render.thread = NULL;
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
ReleaseSemaphore(This->render.sem, 1, NULL);
|
|
||||||
LeaveCriticalSection(&This->cs);
|
LeaveCriticalSection(&This->cs);
|
||||||
|
|
||||||
WaitForSingleObject(thread, INFINITE);
|
WaitForSingleObject(This->render.thread, INFINITE);
|
||||||
|
This->render.thread = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(This->render.hDC)
|
if(This->render.hDC)
|
||||||
@ -669,6 +681,12 @@ ULONG __stdcall ddraw_Release(IDirectDrawImpl *This)
|
|||||||
ReleaseDC(This->hWnd, This->render.hDC);
|
ReleaseDC(This->hWnd, This->render.hDC);
|
||||||
This->render.hDC = NULL;
|
This->render.hDC = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(This->render.ev)
|
||||||
|
{
|
||||||
|
CloseHandle(This->render.ev);
|
||||||
|
ddraw->render.ev = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if(This->real_dll)
|
if(This->real_dll)
|
||||||
{
|
{
|
||||||
@ -771,6 +789,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
|
|||||||
}
|
}
|
||||||
|
|
||||||
InitializeCriticalSection(&This->cs);
|
InitializeCriticalSection(&This->cs);
|
||||||
|
This->render.ev = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
This->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
|
This->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
|
||||||
|
|
||||||
/* load configuration options from ddraw.ini */
|
/* load configuration options from ddraw.ini */
|
||||||
@ -795,7 +814,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
|
|||||||
"; use letter- or windowboxing to make a best fit (GDI only!)\n"
|
"; use letter- or windowboxing to make a best fit (GDI only!)\n"
|
||||||
"boxing=false\n"
|
"boxing=false\n"
|
||||||
"; real rendering rate, -1 = screen rate, 0 = unlimited, n = cap\n"
|
"; real rendering rate, -1 = screen rate, 0 = unlimited, n = cap\n"
|
||||||
"max_fps=120\n"
|
"maxfps=0\n"
|
||||||
"; vertical synchronization, enable if you get tearing (OpenGL only)\n"
|
"; vertical synchronization, enable if you get tearing (OpenGL only)\n"
|
||||||
"vsync=false\n"
|
"vsync=false\n"
|
||||||
"; scaling filter, nearest = sharp, linear = smooth (OpenGL only)\n"
|
"; scaling filter, nearest = sharp, linear = smooth (OpenGL only)\n"
|
||||||
@ -866,7 +885,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
|
|||||||
GetPrivateProfileStringA("ddraw", "screenshotKey", "G", tmp, sizeof(tmp), SettingsIniPath);
|
GetPrivateProfileStringA("ddraw", "screenshotKey", "G", tmp, sizeof(tmp), SettingsIniPath);
|
||||||
ddraw->screenshotKey = toupper(tmp[0]);
|
ddraw->screenshotKey = toupper(tmp[0]);
|
||||||
|
|
||||||
This->render.maxfps = GetPrivateProfileIntA("ddraw", "max_fps", 120, SettingsIniPath);
|
This->render.maxfps = GetPrivateProfileIntA("ddraw", "maxfps", 0, SettingsIniPath);
|
||||||
This->render.width = GetPrivateProfileIntA("ddraw", "width", 0, SettingsIniPath);
|
This->render.width = GetPrivateProfileIntA("ddraw", "width", 0, SettingsIniPath);
|
||||||
This->render.height = GetPrivateProfileIntA("ddraw", "height", 0, SettingsIniPath);
|
This->render.height = GetPrivateProfileIntA("ddraw", "height", 0, SettingsIniPath);
|
||||||
WindowPosX = GetPrivateProfileIntA("ddraw", "posX", -1, SettingsIniPath);
|
WindowPosX = GetPrivateProfileIntA("ddraw", "posX", -1, SettingsIniPath);
|
||||||
|
@ -60,7 +60,7 @@ HRESULT __stdcall ddraw_palette_SetEntries(IDirectDrawPaletteImpl *This, DWORD d
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: only refresh the screen when the primary palette is changed */
|
/* FIXME: only refresh the screen when the primary palette is changed */
|
||||||
if(ddraw->primary)
|
if(ddraw->primary && ddraw->render.run)
|
||||||
{
|
{
|
||||||
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
}
|
}
|
||||||
|
@ -52,8 +52,6 @@ BOOL detect_cutscene();
|
|||||||
|
|
||||||
DWORD WINAPI render_main(void)
|
DWORD WINAPI render_main(void)
|
||||||
{
|
{
|
||||||
Sleep(500);
|
|
||||||
|
|
||||||
int i,j;
|
int i,j;
|
||||||
HGLRC hRC;
|
HGLRC hRC;
|
||||||
|
|
||||||
@ -147,7 +145,7 @@ DWORD WINAPI render_main(void)
|
|||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
|
||||||
while(ddraw->render.thread && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
|
while(ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
|
||||||
{
|
{
|
||||||
static int index = 0;
|
static int index = 0;
|
||||||
scale_w = (float)ddraw->width/tex_width;
|
scale_w = (float)ddraw->width/tex_width;
|
||||||
@ -229,7 +227,6 @@ DWORD WINAPI render_main(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaveCriticalSection(&ddraw->cs);
|
LeaveCriticalSection(&ddraw->cs);
|
||||||
@ -260,6 +257,8 @@ DWORD WINAPI render_main(void)
|
|||||||
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);
|
||||||
|
@ -51,8 +51,6 @@ 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);
|
||||||
@ -97,7 +95,7 @@ DWORD WINAPI render_soft_main(void)
|
|||||||
frame_len = 1000.0f / ddraw->render.maxfps;
|
frame_len = 1000.0f / ddraw->render.maxfps;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (ddraw->render.thread && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
|
while (ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
|
||||||
{
|
{
|
||||||
if(ddraw->render.maxfps > 0)
|
if(ddraw->render.maxfps > 0)
|
||||||
{
|
{
|
||||||
@ -159,6 +157,8 @@ DWORD WINAPI render_soft_main(void)
|
|||||||
Sleep( frame_len - (tick_end - tick_start));
|
Sleep( frame_len - (tick_end - tick_start));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetEvent(ddraw->render.ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, bmi);
|
HeapFree(GetProcessHeap(), 0, bmi);
|
||||||
|
@ -113,23 +113,18 @@ HRESULT __stdcall ddraw_surface_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestR
|
|||||||
unsigned char* from=Source->surface + y0*Source->width + x0;
|
unsigned char* from=Source->surface + y0*Source->width + x0;
|
||||||
int s = x1-x0;
|
int s = x1-x0;
|
||||||
|
|
||||||
if((This->caps & DDSCAPS_PRIMARYSURFACE) && !(This->flags & DDSD_BACKBUFFERCOUNT))
|
int y;
|
||||||
{
|
for(y=y0; y<y1; ++y, to+=This->width, from+=Source->width)
|
||||||
EnterCriticalSection(&ddraw->cs);
|
{
|
||||||
|
memcpy(to, from, s);
|
||||||
int y;
|
}
|
||||||
for(y=y0; y<y1; ++y, to+=This->width, from+=Source->width)
|
}
|
||||||
memcpy(to, from, s);
|
|
||||||
|
if(This->caps & DDSCAPS_PRIMARYSURFACE && !(This->flags & DDSD_BACKBUFFERCOUNT) && ddraw->render.run)
|
||||||
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
{
|
||||||
LeaveCriticalSection(&ddraw->cs);
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
}
|
WaitForSingleObject(ddraw->render.ev, INFINITE);
|
||||||
else
|
ResetEvent(ddraw->render.ev);
|
||||||
{
|
|
||||||
int y;
|
|
||||||
for(y=y0; y<y1; ++y, to+=This->width, from+=Source->width)
|
|
||||||
memcpy(to, from, s);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
@ -206,9 +201,11 @@ HRESULT __stdcall ddraw_surface_Flip(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWS
|
|||||||
printf("IDirectDrawSurface::Flip(This=%p, ...)\n", This);
|
printf("IDirectDrawSurface::Flip(This=%p, ...)\n", This);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(This->caps & DDSCAPS_PRIMARYSURFACE)
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
@ -374,7 +371,7 @@ HRESULT __stdcall ddraw_surface_Unlock(IDirectDrawSurfaceImpl *This, LPVOID lpRe
|
|||||||
printf("DirectDrawSurface::Unlock(This=%p, lpRect=%p)\n", This, lpRect);
|
printf("DirectDrawSurface::Unlock(This=%p, lpRect=%p)\n", This, lpRect);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(This->caps & DDSCAPS_PRIMARYSURFACE && !(This->flags & DDSD_BACKBUFFERCOUNT))
|
if(This->caps & DDSCAPS_PRIMARYSURFACE && !(This->flags & DDSD_BACKBUFFERCOUNT) && ddraw->render.run)
|
||||||
{
|
{
|
||||||
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user