From d066962617d753e70e229eab42dc52cffbb850e7 Mon Sep 17 00:00:00 2001 From: Toni Spets Date: Wed, 17 Nov 2010 22:12:19 +0200 Subject: [PATCH] Add vsync ini option, controls GL_EXT_swap_control, default disabled --- main.c | 14 +++++++++++++- main.h | 1 + render.c | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index ca08e4f..a758598 100644 --- a/main.c +++ b/main.c @@ -515,8 +515,10 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk "; bits per pixel, possible values: 16, 24 and 32, 0 = auto\n" "bpp=0\n" "windowed=true\n" - "; real rendering rate, -1 = vsync, 0 = unlimited, n = cap\n" + "; real rendering rate, -1 = screen rate, 0 = unlimited, n = cap\n" "maxfps=120\n" + "; vertical synchronization, enable if you get tearing\n" + "vsync=false\n" "; scaling filter, nearest = sharp, linear = smooth\n" "filter=nearest\n" "; mouse sensitivity scaling\n" @@ -596,6 +598,16 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->devmode = FALSE; } + GetPrivateProfileStringA("ddraw", "vsync", "FALSE", tmp, sizeof(tmp), ini_path); + if(tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tmp[0] == '1') + { + This->vsync = TRUE; + } + else + { + This->vsync = FALSE; + } + This->Ref = 0; ddraw_AddRef(This); diff --git a/main.h b/main.h index 12abe93..59d7348 100644 --- a/main.h +++ b/main.h @@ -73,6 +73,7 @@ typedef struct IDirectDrawImpl BOOL adjmouse; BOOL mhack; BOOL devmode; + BOOL vsync; } IDirectDrawImpl; diff --git a/render.c b/render.c index 9c38805..8530003 100644 --- a/render.c +++ b/render.c @@ -34,6 +34,24 @@ DWORD WINAPI render_main(void) hRC = wglCreateContext( ddraw->render.hDC ); wglMakeCurrent( ddraw->render.hDC, hRC ); + char *glext = (char *)glGetString(GL_EXTENSIONS); + + if(glext && strstr(glext, "WGL_EXT_swap_control")) + { + BOOL (APIENTRY *wglSwapIntervalEXT)(int) = (BOOL (APIENTRY *)(int))wglGetProcAddress("wglSwapIntervalEXT"); + if(wglSwapIntervalEXT) + { + if(ddraw->vsync) + { + wglSwapIntervalEXT(1); + } + else + { + wglSwapIntervalEXT(0); + } + } + } + DWORD tick_start; DWORD tick_end; DWORD frame_len;