diff --git a/inc/opengl.h b/inc/opengl.h index 394c1ae..0176cd0 100644 --- a/inc/opengl.h +++ b/inc/opengl.h @@ -4,11 +4,12 @@ #include "glext.h" void OpenGL_Init(); -BOOL OpenGL_ExtExists(char *ext); +BOOL OpenGL_ExtExists(char *ext, HDC hdc); GLuint OpenGL_BuildProgram(const GLchar *vertSource, const GLchar *fragSource); GLuint OpenGL_BuildProgramFromFile(const char *filePath); typedef void (APIENTRYP PFNWGLSWAPINTERVALEXT) (int interval); +typedef const char* (WINAPI *PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc); extern PFNGLCREATEPROGRAMPROC glCreateProgram; extern PFNGLDELETEPROGRAMPROC glDeleteProgram; @@ -70,5 +71,6 @@ extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; extern PFNWGLSWAPINTERVALEXT wglSwapIntervalEXT; +extern PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB; extern PFNGLTEXBUFFERPROC glTexBuffer; diff --git a/src/main.c b/src/main.c index e2d43ec..ff12519 100644 --- a/src/main.c +++ b/src/main.c @@ -662,6 +662,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) #endif break; +#ifdef HAVE_LIBPNG + case WM_KEYUP: + if (wParam == VK_SNAPSHOT) + screenshot(ddraw->primary); + + break; +#endif + + /* button up messages reactivate cursor lock */ case WM_LBUTTONUP: case WM_RBUTTONUP: diff --git a/src/opengl.c b/src/opengl.c index be8cbcc..d1a3aad 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -64,6 +64,7 @@ PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL; PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL; PFNWGLSWAPINTERVALEXT wglSwapIntervalEXT = NULL; +PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = NULL; PFNGLTEXBUFFERPROC glTexBuffer = NULL; @@ -128,11 +129,12 @@ void OpenGL_Init() glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers"); wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXT)wglGetProcAddress("wglSwapIntervalEXT"); + wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB"); glTexBuffer = (PFNGLTEXBUFFERPROC)wglGetProcAddress("glTexBuffer"); } -BOOL OpenGL_ExtExists(char *ext) +BOOL OpenGL_ExtExists(char *ext, HDC hdc) { char *glext = (char *)glGetString(GL_EXTENSIONS); if (glext) @@ -140,6 +142,17 @@ BOOL OpenGL_ExtExists(char *ext) if (strstr(glext, ext)) return TRUE; } + + if (wglGetExtensionsStringARB) + { + char *wglext = (char *)wglGetExtensionsStringARB(hdc); + if (wglext) + { + if (strstr(wglext, ext)) + return TRUE; + } + } + return FALSE; } diff --git a/src/render.c b/src/render.c index 1e6202e..be218c7 100644 --- a/src/render.c +++ b/src/render.c @@ -56,12 +56,30 @@ DWORD WINAPI render_main(void) OpenGL_Init(); - if (OpenGL_ExtExists("WGL_EXT_swap_control")) + int maxfps = ddraw->render.maxfps; + + if (OpenGL_ExtExists("WGL_EXT_swap_control_tear", ddraw->render.hDC)) + { + if (wglSwapIntervalEXT) + { + if (ddraw->vsync) + { + wglSwapIntervalEXT(-1); + maxfps = 1000; + } + else + wglSwapIntervalEXT(0); + } + } + else if (OpenGL_ExtExists("WGL_EXT_swap_control", ddraw->render.hDC)) { if (wglSwapIntervalEXT) { if (ddraw->vsync) + { wglSwapIntervalEXT(1); + maxfps = 1000; + } else wglSwapIntervalEXT(0); } @@ -70,7 +88,6 @@ DWORD WINAPI render_main(void) DWORD tick_start = 0; DWORD tick_end = 0; DWORD frame_len = 0; - int maxfps = ddraw->render.maxfps; if (maxfps < 0) maxfps = ddraw->mode.dmDisplayFrequency;