X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=sys_sdl.c;h=cd769979c2753535a32c4b68d79707a25b5a9f4a;hb=a0465ad2ee16719587b0b7a80d4c1c2f7df1ac0e;hp=4b45b6de8e4a67c738523e39df90c1f9ab6c3ca6;hpb=ef4adee42c844523c889cbc6c19d2da940f00ec6;p=xonotic%2Fdarkplaces.git diff --git a/sys_sdl.c b/sys_sdl.c index 4b45b6de..cd769979 100644 --- a/sys_sdl.c +++ b/sys_sdl.c @@ -1,29 +1,30 @@ -#include "quakedef.h" #ifdef WIN32 +#ifdef _MSC_VER +#pragma comment(lib, "sdl.lib") +#pragma comment(lib, "sdlmain.lib") +#endif #include #include "conio.h" #else #include #include #include -#include #endif -#include +#ifdef __ANDROID__ +#include -#include +#ifndef FNDELAY +#define FNDELAY O_NDELAY +#endif +#endif -cvar_t sys_usenoclockbutbenchmark = {CVAR_SAVE, "sys_usenoclockbutbenchmark", "0", "don't use ANY real timing, and simulate a clock (for benchmarking); the game then runs as fast as possible. Run a QC mod with bots that does some stuff, then does a quit at the end, to benchmark a server. NEVER do this on a public server."}; -static unsigned long benchmark_time; +#include -#ifndef WIN32 -# ifndef MACOSX -cvar_t sys_useclockgettime = {CVAR_SAVE, "sys_useclockgettime", "0", "use POSIX clock_gettime function (which has issues if the system clock speed is far off, as it can't get fixed by NTP) for timing rather than gettimeofday (which has issues if the system time is stepped by ntpdate, or apparently on some Xen installations)"}; -# endif -cvar_t sys_usegettimeofday = {CVAR_SAVE, "sys_usegettimeofday", "0", "use gettimeofday (which has issues if the system time is stepped by ntpdate, or apparently on some Xen installations) which has microsecond precision rather than SDL_GetTicks (which has only millisecond precision)"}; -#endif +#include +#include "quakedef.h" // ======================================================================= // General routines @@ -31,6 +32,9 @@ cvar_t sys_usegettimeofday = {CVAR_SAVE, "sys_usegettimeofday", "0", "use gettim void Sys_Shutdown (void) { +#ifdef __ANDROID__ + Sys_AllowProfiling(false); +#endif #ifndef WIN32 fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); #endif @@ -59,91 +63,45 @@ void Sys_Error (const char *error, ...) exit (1); } +static int outfd = 1; void Sys_PrintToTerminal(const char *text) { -#ifndef WIN32 - // BUG: for some reason, NDELAY also affects stdout (1) when used on stdin (0). - int origflags = fcntl (1, F_GETFL, 0); - fcntl (1, F_SETFL, origflags & ~FNDELAY); +#ifdef __ANDROID__ + if (developer.integer > 0) + { + __android_log_write(ANDROID_LOG_DEBUG, com_argv[0], text); + } #else + if(outfd < 0) + return; +#ifdef FNDELAY + // BUG: for some reason, NDELAY also affects stdout (1) when used on stdin (0). + // this is because both go to /dev/tty by default! + { + int origflags = fcntl (outfd, F_GETFL, 0); + fcntl (outfd, F_SETFL, origflags & ~FNDELAY); +#endif +#ifdef WIN32 #define write _write #endif - while(*text) - { - int written = (int)write(1, text, (int)strlen(text)); - if(written <= 0) - break; // sorry, I cannot do anything about this error - without an output - text += written; + while(*text) + { + fs_offset_t written = (fs_offset_t)write(outfd, text, strlen(text)); + if(written <= 0) + break; // sorry, I cannot do anything about this error - without an output + text += written; + } +#ifdef FNDELAY + fcntl (outfd, F_SETFL, origflags); } -#ifndef WIN32 - fcntl (1, F_SETFL, origflags); #endif //fprintf(stdout, "%s", text); -} - -double Sys_DoubleTime (void) -{ - static int first = true; - static double oldtime = 0.0, curtime = 0.0; - double newtime; - if(sys_usenoclockbutbenchmark.integer) - { - benchmark_time += 1; - return ((double) benchmark_time) / 1e6; - } - // use higher precision timers on some platforms -#ifndef WIN32 -# ifndef MACOSX - if (sys_useclockgettime.integer) - { - struct timespec ts; -# ifdef SUNOS - clock_gettime(CLOCK_HIGHRES, &ts); -# else - clock_gettime(CLOCK_MONOTONIC, &ts); -# endif - newtime = (double) ts.tv_sec + ts.tv_nsec / 1000000000.0; - } - else if (sys_usegettimeofday.integer) -# endif - { - struct timeval tp; - gettimeofday(&tp, NULL); - newtime = (double) tp.tv_sec + tp.tv_usec / 1000000.0; - } - else #endif - { - newtime = (double) SDL_GetTicks() / 1000.0; - } - - - if (first) - { - first = false; - oldtime = newtime; - } - - if (newtime < oldtime) - { - // warn if it's significant - if (newtime - oldtime < -0.01) - Con_Printf("Sys_DoubleTime: time stepped backwards (went from %f to %f, difference %f)\n", oldtime, newtime, newtime - oldtime); - } - else if (newtime > oldtime + 1800) - { - Con_Printf("Sys_DoubleTime: time stepped forward (went from %f to %f, difference %f)\n", oldtime, newtime, newtime - oldtime); - } - else - curtime += newtime - oldtime; - oldtime = newtime; - - return curtime; } char *Sys_ConsoleInput(void) { - if (cls.state == ca_dedicated) +// if (cls.state == ca_dedicated) { static char text[MAX_INPUTLINE]; int len = 0; @@ -201,16 +159,6 @@ char *Sys_ConsoleInput(void) return NULL; } -void Sys_Sleep(int microseconds) -{ - if(sys_usenoclockbutbenchmark.integer) - { - benchmark_time += microseconds; - return; - } - SDL_Delay(microseconds / 1000); -} - char *Sys_GetClipboardData (void) { #ifdef WIN32 @@ -244,23 +192,26 @@ void Sys_InitConsole (void) { } -void Sys_Init_Commands (void) -{ - Cvar_RegisterVariable(&sys_usenoclockbutbenchmark); -#ifndef WIN32 -# ifndef MACOSX - Cvar_RegisterVariable(&sys_useclockgettime); -# endif - Cvar_RegisterVariable(&sys_usegettimeofday); -#endif -} - int main (int argc, char *argv[]) { signal(SIGFPE, SIG_IGN); +#ifdef __ANDROID__ + Sys_AllowProfiling(true); +#endif + com_argc = argc; com_argv = (const char **)argv; + Sys_ProvideSelfFD(); + + // COMMANDLINEOPTION: sdl: -noterminal disables console output on stdout + if(COM_CheckParm("-noterminal")) + outfd = -1; + // COMMANDLINEOPTION: sdl: -stderr moves console output to stderr + else if(COM_CheckParm("-stderr")) + outfd = 2; + else + outfd = 1; #ifndef WIN32 fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); @@ -273,3 +224,13 @@ int main (int argc, char *argv[]) return 0; } + +qboolean sys_supportsdlgetticks = true; +unsigned int Sys_SDL_GetTicks (void) +{ + return SDL_GetTicks(); +} +void Sys_SDL_Delay (unsigned int milliseconds) +{ + SDL_Delay(milliseconds); +}