/* Copyright (C) 1996-2001 Id Software, Inc. Copyright (C) 2002-2005 John Fitzgibbons and others Copyright (C) 2007-2008 Kristian Duske Copyright (C) 2010-2014 QuakeSpasm developers This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "q_defs.h" #include #include /* need at least SDL_2.0.0 */ #define SDL_MIN_X 2 #define SDL_MIN_Y 0 #define SDL_MIN_Z 0 #define SDL_REQUIREDVERSION (SDL_VERSIONNUM(SDL_MIN_X,SDL_MIN_Y,SDL_MIN_Z)) #define SDL_NEW_VERSION_REJECT (SDL_VERSIONNUM(3,0,0)) static void Sys_AtExit(void) { SDL_Quit(); } static void Sys_InitSDL(void) { SDL_version v; SDL_version *sdl_version = &v; SDL_GetVersion(&v); Sys_Printf("SDL version %" PRIi32 ".%" PRIi32 ".%" PRIi32 "\n", sdl_version->major, sdl_version->minor, sdl_version->patch); if(SDL_VERSIONNUM(sdl_version->major, sdl_version->minor, sdl_version->patch) < SDL_REQUIREDVERSION) Sys_Error("Need at least v%" PRIi32 ".%" PRIi32 ".%" PRIi32 " of SDL to run. Exiting.", SDL_MIN_X, SDL_MIN_Y, SDL_MIN_Z); if(SDL_VERSIONNUM(sdl_version->major, sdl_version->minor, sdl_version->patch) >= SDL_NEW_VERSION_REJECT) Sys_Error("Detected SDL is too new. Exiting."); if(SDL_Init(0) < 0) Sys_Error("Couldn't init SDL: %s", SDL_GetError()); atexit(Sys_AtExit); } #define DEFAULT_MEMORY (256 * 1024 * 1024) // ericw -- was 72MB (64-bit) / 64MB (32-bit) static quakeparms_t parms; // On OS X we call SDL_main from the launcher, but SDL2 doesn't redefine main // as SDL_main on OS X anymore, so we do it ourselves. #if PLATFORM_IS(OSX) #define main SDL_main #endif int32_t main(int32_t argc, char *argv[]) { int32_t t; double time, oldtime, newtime; host_parms = &parms; parms.basedir = "."; parms.argc = argc; parms.argv = argv; parms.errstate = 0; COM_InitArgv(parms.argc, parms.argv); isDedicated = (COM_CheckParm("-dedicated") != 0); Sys_InitSDL(); Sys_Init(); parms.memsize = DEFAULT_MEMORY; if(COM_CheckParm("-heapsize")) { t = COM_CheckParm("-heapsize") + 1; if(t < com_argc) parms.memsize = atoi(com_argv[t]) * 1024; } parms.membase = malloc(parms.memsize); if(!parms.membase) Sys_Error("Not enough memory free for heap. You need 256MiB.\n"); Sys_Printf(ENGINE_NAME " " VERSION " (c) id Software, John Fitzgibbons, " "SleepwalkR, Baker, Ozkan Sezer, Eric Wasylishen, " "Alison G. Watson, et al.\n"); Host_Init(); oldtime = Sys_DoubleTime(); if(isDedicated) { while(1) { newtime = Sys_DoubleTime(); time = newtime - oldtime; while(time < sys_ticrate.value) { SDL_Delay(1); newtime = Sys_DoubleTime(); time = newtime - oldtime; } Host_Frame(time); oldtime = newtime; } } else while(1) { /* If we have no input focus at all, sleep a bit */ if(!VID_HasMouseOrInputFocus() || cl.paused) { SDL_Delay(16); } /* If we're minimised, sleep a bit more */ if(VID_IsMinimized()) { scr_skipupdate = 1; SDL_Delay(32); } else { scr_skipupdate = 0; } newtime = Sys_DoubleTime(); time = newtime - oldtime; Host_Frame(time); if(time < sys_throttle.value && !cls.timedemo) SDL_Delay(1); oldtime = newtime; } return 0; }