diff --git a/src/sdl/hardware.cpp b/src/sdl/hardware.cpp index ee907e601..352fe8558 100644 --- a/src/sdl/hardware.cpp +++ b/src/sdl/hardware.cpp @@ -190,10 +190,10 @@ void I_ClosestResolution (int *width, int *height, int bits) // Pass a negative value for the limit to use the value of vid_maxfps. // //========================================================================== - + EXTERN_CVAR(Int, vid_maxfps); EXTERN_CVAR(Bool, cl_capfps); - + #ifndef __APPLE__ Semaphore FPSLimitSemaphore; @@ -245,13 +245,13 @@ void I_SetFPSLimit(int limit) Printf("Failed to set FPS limitter timer\n"); DPrintf("FPS timer set to %u ms\n", (unsigned int) period.it_interval.tv_nsec / 1000000); } -} -#else -// So Apple doesn't support POSIX timers and I can't find a good substitute short of -// having Objective-C Cocoa events or something like that. -void I_SetFPSLimit(int limit) -{ -} +} +#else +// So Apple doesn't support POSIX timers and I can't find a good substitute short of +// having Objective-C Cocoa events or something like that. +void I_SetFPSLimit(int limit) +{ +} #endif CUSTOM_CVAR (Int, vid_maxfps, 200, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) diff --git a/src/sdl/hardware.h b/src/sdl/hardware.h index 04d02c9bf..6544f1498 100644 --- a/src/sdl/hardware.h +++ b/src/sdl/hardware.h @@ -53,7 +53,13 @@ typedef semaphore_t Semaphore; #include typedef sem_t Semaphore; #define SEMAPHORE_WAIT(sem) \ - while(sem_wait(&sem) != 0); + do { \ + while(sem_wait(&sem) != 0); \ + int semValue; \ + sem_getvalue(&sem, &semValue); \ + if(semValue < 1) \ + break; \ + } while(true); #define SEMAPHORE_SIGNAL(sem) \ sem_post(&sem); #define SEMAPHORE_INIT(sem, shared, value) \ diff --git a/src/sdl/sdlvideo.cpp b/src/sdl/sdlvideo.cpp index cba5c4cf7..2f11b8bbd 100644 --- a/src/sdl/sdlvideo.cpp +++ b/src/sdl/sdlvideo.cpp @@ -81,6 +81,7 @@ extern bool GUICapture; EXTERN_CVAR (Float, Gamma) EXTERN_CVAR (Int, vid_maxfps) +EXTERN_CVAR (Bool, cl_capfps) // PUBLIC DATA DEFINITIONS ------------------------------------------------- @@ -374,12 +375,12 @@ void SDLFB::Update () } DrawRateStuff (); - + #ifndef __APPLE__ - if(vid_maxfps) + if(vid_maxfps && !cl_capfps) { SEMAPHORE_WAIT(FPSLimitSemaphore) - } + } #endif Buffer = NULL;