Compare commits
9 commits
master
...
downscalin
Author | SHA1 | Date | |
---|---|---|---|
|
798c281453 | ||
|
bb08a08af0 | ||
|
5919c0e150 | ||
|
889cfd92fa | ||
|
ec0dbeca6b | ||
|
918037dd3e | ||
|
fa14a8b60a | ||
|
72549b9610 | ||
|
8b4f94dcd8 |
13 changed files with 145 additions and 23 deletions
1
inc/dd.h
1
inc/dd.h
|
@ -168,6 +168,7 @@ typedef struct CNCDDRAW
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
LONG frame_skip;
|
||||||
BOOL enabled;
|
BOOL enabled;
|
||||||
} zoom;
|
} zoom;
|
||||||
} CNCDDRAW;
|
} CNCDDRAW;
|
||||||
|
|
|
@ -58,6 +58,9 @@ typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT);
|
||||||
typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT);
|
typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT);
|
||||||
typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*);
|
typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*);
|
||||||
typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*);
|
typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*);
|
||||||
|
|
||||||
|
typedef BOOL(WINAPI* VALIDATERECTPROC)(HWND, const RECT*);
|
||||||
|
typedef BOOL(WINAPI* INVALIDATERECTPROC)(HWND, const RECT*, BOOL);
|
||||||
typedef SHORT(WINAPI* GETKEYSTATEPROC)(int);
|
typedef SHORT(WINAPI* GETKEYSTATEPROC)(int);
|
||||||
typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int);
|
typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int);
|
||||||
|
|
||||||
|
@ -109,6 +112,8 @@ extern PEEKMESSAGEAPROC real_PeekMessageA;
|
||||||
extern GETMESSAGEAPROC real_GetMessageA;
|
extern GETMESSAGEAPROC real_GetMessageA;
|
||||||
extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement;
|
extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement;
|
||||||
extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA;
|
extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA;
|
||||||
|
extern VALIDATERECTPROC real_ValidateRect;
|
||||||
|
extern INVALIDATERECTPROC real_InvalidateRect;
|
||||||
extern GETKEYSTATEPROC real_GetKeyState;
|
extern GETKEYSTATEPROC real_GetKeyState;
|
||||||
extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState;
|
extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState;
|
||||||
extern GETDEVICECAPSPROC real_GetDeviceCaps;
|
extern GETDEVICECAPSPROC real_GetDeviceCaps;
|
||||||
|
|
|
@ -34,6 +34,8 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w
|
||||||
BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
|
BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
|
||||||
BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl);
|
BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl);
|
||||||
BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode);
|
BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode);
|
||||||
|
BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect);
|
||||||
|
BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase);
|
||||||
SHORT WINAPI fake_GetKeyState(int nVirtKey);
|
SHORT WINAPI fake_GetKeyState(int nVirtKey);
|
||||||
SHORT WINAPI fake_GetAsyncKeyState(int vKey);
|
SHORT WINAPI fake_GetAsyncKeyState(int vKey);
|
||||||
int WINAPI fake_GetDeviceCaps(HDC hdc, int index);
|
int WINAPI fake_GetDeviceCaps(HDC hdc, int index);
|
||||||
|
|
|
@ -795,6 +795,7 @@ static void cfg_create_ini()
|
||||||
"; Emperor: Rise of the Middle Kingdom\n"
|
"; Emperor: Rise of the Middle Kingdom\n"
|
||||||
"[Emperor]\n"
|
"[Emperor]\n"
|
||||||
"nonexclusive=true\n"
|
"nonexclusive=true\n"
|
||||||
|
"adjmouse=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Enemy Infestation\n"
|
"; Enemy Infestation\n"
|
||||||
"[EI]\n"
|
"[EI]\n"
|
||||||
|
|
4
src/dd.c
4
src/dd.c
|
@ -642,8 +642,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
|
||||||
g_ddraw.height = dwHeight;
|
g_ddraw.height = dwHeight;
|
||||||
g_ddraw.bpp = dwBPP;
|
g_ddraw.bpp = dwBPP;
|
||||||
|
|
||||||
InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2);
|
//InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2);
|
||||||
InterlockedExchange((LONG*)&g_ddraw.cursor.y, dwHeight / 2);
|
//InterlockedExchange((LONG*)&g_ddraw.cursor.y, dwHeight / 2);
|
||||||
|
|
||||||
BOOL border = g_config.border;
|
BOOL border = g_config.border;
|
||||||
BOOL nonexclusive = FALSE;
|
BOOL nonexclusive = FALSE;
|
||||||
|
|
|
@ -418,6 +418,9 @@ HRESULT dds_Blt(
|
||||||
|
|
||||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
|
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
|
if (!(dwFlags & DDBLT_COLORFILL))
|
||||||
|
InterlockedExchange(&g_ddraw.zoom.frame_skip, 0);
|
||||||
|
|
||||||
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
||||||
|
|
||||||
if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime())
|
if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime())
|
||||||
|
|
|
@ -152,6 +152,7 @@ void DDEnableZoom()
|
||||||
TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress());
|
TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||||
|
|
||||||
g_ddraw.zoom.enabled = TRUE;
|
g_ddraw.zoom.enabled = TRUE;
|
||||||
|
InterlockedExchange(&g_ddraw.zoom.frame_skip, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL DDIsWindowed()
|
BOOL DDIsWindowed()
|
||||||
|
|
10
src/hook.c
10
src/hook.c
|
@ -51,6 +51,8 @@ PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA;
|
||||||
GETMESSAGEAPROC real_GetMessageA = GetMessageA;
|
GETMESSAGEAPROC real_GetMessageA = GetMessageA;
|
||||||
GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement;
|
GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement;
|
||||||
ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA;
|
ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA;
|
||||||
|
VALIDATERECTPROC real_ValidateRect = ValidateRect;
|
||||||
|
INVALIDATERECTPROC real_InvalidateRect = InvalidateRect;
|
||||||
GETKEYSTATEPROC real_GetKeyState = GetKeyState;
|
GETKEYSTATEPROC real_GetKeyState = GetKeyState;
|
||||||
GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState;
|
GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState;
|
||||||
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
|
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
|
||||||
|
@ -96,10 +98,12 @@ HOOKLIST g_hook_hooklist[] =
|
||||||
{ "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 },
|
{ "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 },
|
||||||
{ "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 },
|
{ "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 },
|
||||||
{ "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 },
|
{ "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 },
|
||||||
{ "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 },
|
//{ "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 },
|
||||||
{ "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 },
|
//{ "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 },
|
||||||
{ "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 },
|
{ "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 },
|
||||||
{ "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 },
|
{ "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 },
|
||||||
|
{ "ValidateRect", (PROC)fake_ValidateRect, (PROC*)&real_ValidateRect, 0 },
|
||||||
|
{ "InvalidateRect", (PROC)fake_InvalidateRect, (PROC*)&real_InvalidateRect, 0 },
|
||||||
{ "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 },
|
{ "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 },
|
||||||
{ "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 },
|
{ "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 },
|
||||||
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
|
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
|
||||||
|
@ -161,7 +165,7 @@ HOOKLIST g_hook_hooklist[] =
|
||||||
{
|
{
|
||||||
"kernel32.dll",
|
"kernel32.dll",
|
||||||
{
|
{
|
||||||
{ "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 },
|
//{ "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 },
|
||||||
{ "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, HOOK_SKIP_2 },
|
{ "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, HOOK_SKIP_2 },
|
||||||
{ "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 },
|
{ "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 },
|
||||||
{ "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 },
|
{ "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 },
|
||||||
|
|
31
src/mouse.c
31
src/mouse.c
|
@ -38,12 +38,35 @@ void mouse_lock()
|
||||||
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||||
OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y);
|
OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y);
|
||||||
|
|
||||||
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
POINT pt;
|
||||||
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
real_GetCursorPos(&pt);
|
||||||
|
|
||||||
|
if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))
|
||||||
|
{
|
||||||
|
if (pt.x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width ||
|
||||||
|
pt.x < g_ddraw.render.viewport.x ||
|
||||||
|
pt.y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height ||
|
||||||
|
pt.y < g_ddraw.render.viewport.y)
|
||||||
|
{
|
||||||
|
pt.x = g_ddraw.width / 2;
|
||||||
|
pt.y = g_ddraw.height / 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pt.x = (DWORD)((pt.x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
|
||||||
|
pt.y = (DWORD)((pt.y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
pt.x = min(pt.x, g_ddraw.width - 1);
|
||||||
|
pt.y = min(pt.y, g_ddraw.height - 1);
|
||||||
|
|
||||||
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, pt.x);
|
||||||
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, pt.y);
|
||||||
|
}
|
||||||
|
|
||||||
real_SetCursorPos(
|
real_SetCursorPos(
|
||||||
g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)) : rc.left + cur_x,
|
g_config.adjmouse ? (int)(rc.left + (pt.x * g_ddraw.mouse.scale_x)) : rc.left + pt.x,
|
||||||
g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)) : rc.top + cur_y);
|
g_config.adjmouse ? (int)(rc.top + (pt.y * g_ddraw.mouse.scale_y)) : rc.top + pt.y);
|
||||||
|
|
||||||
CopyRect(&rc, &g_ddraw.mouse.rc);
|
CopyRect(&rc, &g_ddraw.mouse.rc);
|
||||||
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||||
|
|
|
@ -540,7 +540,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
|
||||||
|
|
||||||
DWORD WINAPI d3d9_render_main(void)
|
DWORD WINAPI d3d9_render_main(void)
|
||||||
{
|
{
|
||||||
Sleep(250);
|
//Sleep(250);
|
||||||
|
|
||||||
fpsl_init();
|
fpsl_init();
|
||||||
|
|
||||||
|
@ -552,6 +552,9 @@ DWORD WINAPI d3d9_render_main(void)
|
||||||
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) &&
|
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) &&
|
||||||
g_ddraw.render.run)
|
g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
|
if (InterlockedDecrement(&g_ddraw.zoom.frame_skip) > 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
dbg_draw_frame_info_start();
|
dbg_draw_frame_info_start();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -37,6 +37,7 @@ DWORD WINAPI gdi_render_main(void)
|
||||||
Sleep(500);
|
Sleep(500);
|
||||||
|
|
||||||
fpsl_init();
|
fpsl_init();
|
||||||
|
SetStretchBltMode(g_ddraw.render.hdc, COLORONCOLOR);
|
||||||
|
|
||||||
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
|
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,44 @@ BOOL ogl_create()
|
||||||
g_ogl.hwnd = g_ddraw.hwnd;
|
g_ogl.hwnd = g_ddraw.hwnd;
|
||||||
g_ogl.hdc = g_ddraw.render.hdc;
|
g_ogl.hdc = g_ddraw.render.hdc;
|
||||||
|
|
||||||
|
GLenum err = GL_NO_ERROR;
|
||||||
|
BOOL made_current = FALSE;
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
if ((made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context)))
|
||||||
|
break;
|
||||||
|
|
||||||
|
Sleep(50);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (made_current && (err = glGetError()) == GL_NO_ERROR)
|
||||||
|
{
|
||||||
|
GL_CHECK(oglu_init());
|
||||||
|
|
||||||
|
TRACE("+--OpenGL-----------------------------------------\n");
|
||||||
|
TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION));
|
||||||
|
TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR));
|
||||||
|
TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER));
|
||||||
|
TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
|
||||||
|
TRACE("+------------------------------------------------\n");
|
||||||
|
|
||||||
|
GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TRACE("OpenGL error %08x, GetLastError %lu (xwglMakeCurrent())\n", err, GetLastError());
|
||||||
|
ogl_check_error("xwglMakeCurrent()");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
if (xwglMakeCurrent(NULL, NULL))
|
||||||
|
break;
|
||||||
|
|
||||||
|
Sleep(50);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +90,7 @@ BOOL ogl_create()
|
||||||
|
|
||||||
DWORD WINAPI ogl_render_main(void)
|
DWORD WINAPI ogl_render_main(void)
|
||||||
{
|
{
|
||||||
Sleep(250);
|
//Sleep(250);
|
||||||
g_ogl.got_error = g_ogl.use_opengl = FALSE;
|
g_ogl.got_error = g_ogl.use_opengl = FALSE;
|
||||||
GLenum err = GL_NO_ERROR;
|
GLenum err = GL_NO_ERROR;
|
||||||
BOOL made_current = FALSE;
|
BOOL made_current = FALSE;
|
||||||
|
@ -69,15 +107,6 @@ DWORD WINAPI ogl_render_main(void)
|
||||||
{
|
{
|
||||||
GL_CHECK(oglu_init());
|
GL_CHECK(oglu_init());
|
||||||
|
|
||||||
TRACE("+--OpenGL-----------------------------------------\n");
|
|
||||||
TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION));
|
|
||||||
TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR));
|
|
||||||
TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER));
|
|
||||||
TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
|
|
||||||
TRACE("+------------------------------------------------\n");
|
|
||||||
|
|
||||||
GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc));
|
|
||||||
|
|
||||||
BOOL got_swap_ctrl;
|
BOOL got_swap_ctrl;
|
||||||
GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc));
|
GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc));
|
||||||
|
|
||||||
|
@ -91,8 +120,8 @@ DWORD WINAPI ogl_render_main(void)
|
||||||
GL_CHECK(ogl_init_shader1_program());
|
GL_CHECK(ogl_init_shader1_program());
|
||||||
GL_CHECK(ogl_init_shader2_program());
|
GL_CHECK(ogl_init_shader2_program());
|
||||||
|
|
||||||
GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test());
|
//GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test());
|
||||||
GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test());
|
//GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test());
|
||||||
g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR;
|
g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR;
|
||||||
g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error;
|
g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error;
|
||||||
|
|
||||||
|
@ -108,7 +137,13 @@ DWORD WINAPI ogl_render_main(void)
|
||||||
ogl_check_error("xwglMakeCurrent()");
|
ogl_check_error("xwglMakeCurrent()");
|
||||||
}
|
}
|
||||||
|
|
||||||
xwglMakeCurrent(NULL, NULL);
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
if (xwglMakeCurrent(NULL, NULL))
|
||||||
|
break;
|
||||||
|
|
||||||
|
Sleep(50);
|
||||||
|
}
|
||||||
|
|
||||||
if (!g_ogl.use_opengl)
|
if (!g_ogl.use_opengl)
|
||||||
{
|
{
|
||||||
|
@ -887,6 +922,9 @@ static void ogl_render()
|
||||||
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) &&
|
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) &&
|
||||||
g_ddraw.render.run)
|
g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
|
if (InterlockedDecrement(&g_ddraw.zoom.frame_skip) > 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
dbg_draw_frame_info_start();
|
dbg_draw_frame_info_start();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -822,6 +822,46 @@ BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEV
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect)
|
||||||
|
{
|
||||||
|
if (!g_ddraw.ref || !g_ddraw.width || !g_ddraw.hwnd || hWnd != g_ddraw.hwnd || !lpRect)
|
||||||
|
return real_ValidateRect(hWnd, lpRect);
|
||||||
|
|
||||||
|
RECT dst_rc;
|
||||||
|
|
||||||
|
dst_rc.left = (LONG)(roundf(lpRect->left * g_ddraw.render.scale_w));
|
||||||
|
dst_rc.top = (LONG)(roundf(lpRect->top * g_ddraw.render.scale_h));
|
||||||
|
dst_rc.bottom = (LONG)(roundf(lpRect->bottom * g_ddraw.render.scale_h));
|
||||||
|
dst_rc.right = (LONG)(roundf(lpRect->right * g_ddraw.render.scale_w));
|
||||||
|
|
||||||
|
OffsetRect(
|
||||||
|
&dst_rc,
|
||||||
|
g_ddraw.render.viewport.x,
|
||||||
|
g_ddraw.render.viewport.y);
|
||||||
|
|
||||||
|
return real_ValidateRect(hWnd, &dst_rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase)
|
||||||
|
{
|
||||||
|
if (!g_ddraw.ref || !g_ddraw.width || !g_ddraw.hwnd || hWnd != g_ddraw.hwnd || !lpRect)
|
||||||
|
return real_InvalidateRect(hWnd, lpRect, bErase);
|
||||||
|
|
||||||
|
RECT dst_rc;
|
||||||
|
|
||||||
|
dst_rc.left = (LONG)(roundf(lpRect->left * g_ddraw.render.scale_w));
|
||||||
|
dst_rc.top = (LONG)(roundf(lpRect->top * g_ddraw.render.scale_h));
|
||||||
|
dst_rc.bottom = (LONG)(roundf(lpRect->bottom * g_ddraw.render.scale_h));
|
||||||
|
dst_rc.right = (LONG)(roundf(lpRect->right * g_ddraw.render.scale_w));
|
||||||
|
|
||||||
|
OffsetRect(
|
||||||
|
&dst_rc,
|
||||||
|
g_ddraw.render.viewport.x,
|
||||||
|
g_ddraw.render.viewport.y);
|
||||||
|
|
||||||
|
return real_InvalidateRect(hWnd, &dst_rc, bErase);
|
||||||
|
}
|
||||||
|
|
||||||
SHORT WINAPI fake_GetKeyState(int nVirtKey)
|
SHORT WINAPI fake_GetKeyState(int nVirtKey)
|
||||||
{
|
{
|
||||||
if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())
|
if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())
|
||||||
|
|
Loading…
Reference in a new issue