X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=sys_win.c;h=10226f3a577659386859f2b1e8d380915e468fd8;hb=50749f7e6a4d2cfc27b95774a67045a87c98b5da;hp=8452c9ae2f92acdde19a63645dfa965c8e81554c;hpb=4d162c39ec059b7f3191fbb4fb18304bc9b1db59;p=xonotic%2Fdarkplaces.git diff --git a/sys_win.c b/sys_win.c index 8452c9ae..10226f3a 100644 --- a/sys_win.c +++ b/sys_win.c @@ -19,6 +19,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // sys_win.c -- Win32 system interface code +#define WIN32_USETIMEGETTIME 0 + #include "quakedef.h" #include "winquake.h" #include "errno.h" @@ -33,67 +35,28 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. int starttime; qboolean ActiveApp, Minimized; -qboolean WinNT; -static double pfreq; -static double curtime = 0.0; -static double lastcurtime = 0.0; -static int lowshift; -qboolean isDedicated; static qboolean sc_return_on_enter = false; HANDLE hinput, houtput; -static char *tracking_tag = "Clams & Mooses"; +//static char *tracking_tag = "Clams & Mooses"; static HANDLE tevent; static HANDLE hFile; static HANDLE heventParent; static HANDLE heventChild; -void Sys_InitFloatTime (void); - -volatile int sys_checksum; - - -/* -================ -Sys_PageIn -================ -*/ -/* -void Sys_PageIn (void *ptr, int size) -{ - byte *x; - int m, n; - -// touch all the memory to make sure it's there. The 16-page skip is to -// keep Win 95 from thinking we're trying to page ourselves in (we are -// doing that, of course, but there's no reason we shouldn't) - x = (byte *)ptr; - - for (n=0 ; n<4 ; n++) - { - for (m=0 ; m<(size - 16 * 0x1000) ; m += 4) - { - sys_checksum += *(int *)&x[m]; - sys_checksum += *(int *)&x[m + 16 * 0x1000]; - } - } -} -*/ - - /* =============================================================================== -FILE IO +QFile IO =============================================================================== */ // LordHavoc: 256 pak files (was 10) #define MAX_HANDLES 256 -FILE *sys_handles[MAX_HANDLES]; +QFile *sys_handles[MAX_HANDLES]; int findhandle (void) { @@ -108,30 +71,30 @@ int findhandle (void) /* ================ -filelength +Sys_FileLength ================ */ -int filelength (FILE *f) +int Sys_FileLength (QFile *f) { int pos; int end; - pos = ftell (f); - fseek (f, 0, SEEK_END); - end = ftell (f); - fseek (f, pos, SEEK_SET); + pos = Qtell (f); + Qseek (f, 0, SEEK_END); + end = Qtell (f); + Qseek (f, pos, SEEK_SET); return end; } int Sys_FileOpenRead (char *path, int *hndl) { - FILE *f; + QFile *f; int i, retval; i = findhandle (); - f = fopen(path, "rb"); + f = Qopen(path, "rbz"); if (!f) { @@ -142,7 +105,7 @@ int Sys_FileOpenRead (char *path, int *hndl) { sys_handles[i] = f; *hndl = i; - retval = filelength(f); + retval = Sys_FileLength(f); } return retval; @@ -150,14 +113,17 @@ int Sys_FileOpenRead (char *path, int *hndl) int Sys_FileOpenWrite (char *path) { - FILE *f; + QFile *f; int i; i = findhandle (); - f = fopen(path, "wb"); + f = Qopen(path, "wb"); if (!f) - Host_Error ("Error opening %s: %s", path,strerror(errno)); + { + Con_Printf("Sys_FileOpenWrite: Error opening %s: %s", path, strerror(errno)); + return 0; + } sys_handles[i] = f; return i; @@ -165,33 +131,33 @@ int Sys_FileOpenWrite (char *path) void Sys_FileClose (int handle) { - fclose (sys_handles[handle]); + Qclose (sys_handles[handle]); sys_handles[handle] = NULL; } void Sys_FileSeek (int handle, int position) { - fseek (sys_handles[handle], position, SEEK_SET); + Qseek (sys_handles[handle], position, SEEK_SET); } int Sys_FileRead (int handle, void *dest, int count) { - return fread (dest, 1, count, sys_handles[handle]); + return Qread (sys_handles[handle], dest, count); } int Sys_FileWrite (int handle, void *data, int count) { - return fwrite (data, 1, count, sys_handles[handle]); + return Qwrite (sys_handles[handle], data, count); } int Sys_FileTime (char *path) { - FILE *f; + QFile *f; - f = fopen(path, "rb"); + f = Qopen(path, "rb"); if (f) { - fclose(f); + Qclose(f); return 1; } @@ -212,75 +178,6 @@ SYSTEM IO =============================================================================== */ -/* -================ -Sys_MakeCodeWriteable -================ -*/ -void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length) -{ - DWORD flOldProtect; - - if (!VirtualProtect((LPVOID)startaddr, length, PAGE_READWRITE, &flOldProtect)) - Sys_Error("Protection change failed\n"); -} - - -/* -================ -Sys_Init -================ -*/ -void Sys_Init (void) -{ - LARGE_INTEGER PerformanceFreq; - unsigned int lowpart, highpart; - OSVERSIONINFO vinfo; - - if (!QueryPerformanceFrequency (&PerformanceFreq)) - Sys_Error ("No hardware timer available"); - -// get 32 out of the 64 time bits such that we have around -// 1 microsecond resolution -#ifdef __BORLANDC__ - lowpart = (unsigned int)PerformanceFreq.u.LowPart; - highpart = (unsigned int)PerformanceFreq.u.HighPart; -#else - lowpart = (unsigned int)PerformanceFreq.LowPart; - highpart = (unsigned int)PerformanceFreq.HighPart; -#endif - lowshift = 0; - - while (highpart || (lowpart > 2000000.0)) - { - lowshift++; - lowpart >>= 1; - lowpart |= (highpart & 1) << 31; - highpart >>= 1; - } - - pfreq = 1.0 / (double)lowpart; - - Sys_InitFloatTime (); - - vinfo.dwOSVersionInfoSize = sizeof(vinfo); - - if (!GetVersionEx (&vinfo)) - Sys_Error ("Couldn't get OS info"); - - if ((vinfo.dwMajorVersion < 4) || - (vinfo.dwPlatformId == VER_PLATFORM_WIN32s)) - { - Sys_Error ("WinQuake requires at least Win95 or NT 4.0"); - } - - if (vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) - WinNT = true; - else - WinNT = false; -} - - void Sys_Error (char *error, ...) { va_list argptr; @@ -302,7 +199,7 @@ void Sys_Error (char *error, ...) vsprintf (text, error, argptr); va_end (argptr); - if (isDedicated) + if (cls.state == ca_dedicated) { va_start (argptr, error); vsprintf (text, error, argptr); @@ -316,11 +213,10 @@ void Sys_Error (char *error, ...) WriteFile (houtput, text4, strlen (text4), &dummy, NULL); - starttime = Sys_FloatTime (); + starttime = Sys_DoubleTime (); sc_return_on_enter = true; // so Enter will get us out of here - while (!Sys_ConsoleInput () && - ((Sys_FloatTime () - starttime) < CONSOLE_ERROR_TIMEOUT)) + while (!Sys_ConsoleInput () && ((Sys_DoubleTime () - starttime) < CONSOLE_ERROR_TIMEOUT)) { } } @@ -332,13 +228,11 @@ void Sys_Error (char *error, ...) { in_sys_error0 = 1; VID_SetDefaultMode (); - MessageBox(NULL, text, "Quake Error", - MB_OK | MB_SETFOREGROUND | MB_ICONSTOP); + MessageBox(NULL, text, "Quake Error", MB_OK | MB_SETFOREGROUND | MB_ICONSTOP); } else { - MessageBox(NULL, text, "Double Quake Error", - MB_OK | MB_SETFOREGROUND | MB_ICONSTOP); + MessageBox(NULL, text, "Double Quake Error", MB_OK | MB_SETFOREGROUND | MB_ICONSTOP); } } @@ -358,22 +252,6 @@ void Sys_Error (char *error, ...) exit (1); } -void Sys_Printf (char *fmt, ...) -{ - va_list argptr; - char text[1024]; - DWORD dummy; - - if (isDedicated) - { - va_start (argptr,fmt); - vsprintf (text, fmt, argptr); - va_end (argptr); - - WriteFile(houtput, text, strlen (text), &dummy, NULL); - } -} - void Sys_Quit (void) { @@ -382,7 +260,7 @@ void Sys_Quit (void) if (tevent) CloseHandle (tevent); - if (isDedicated) + if (cls.state == ca_dedicated) FreeConsole (); // shut down QHOST hooks if necessary @@ -394,107 +272,109 @@ void Sys_Quit (void) /* ================ -Sys_FloatTime +Sys_DoubleTime ================ */ -double Sys_FloatTime (void) +double Sys_DoubleTime (void) { - static int sametimecount; - static unsigned int oldtime; - static int first = 1; - LARGE_INTEGER PerformanceCount; - unsigned int temp, t2; - double time; - - QueryPerformanceCounter (&PerformanceCount); - -#ifdef __BORLANDC__ - temp = ((unsigned int)PerformanceCount.u.LowPart >> lowshift) | - ((unsigned int)PerformanceCount.u.HighPart << (32 - lowshift)); -#else + // LordHavoc: note to people modifying this code, DWORD is specifically defined as an unsigned 32bit number, therefore the 65536.0 * 65536.0 is fine. +#if WIN32_USETIMEGETTIME + // timeGetTime + // platform: + // Windows 95/98/ME/NT/2000 + // features: + // reasonable accuracy (millisecond) + // issues: + // none known + static int first = true; + static double oldtime = 0.0, basetime = 0.0, old = 0.0; + double newtime, now; + + now = (double) timeGetTime () + basetime; - temp = ((unsigned int)PerformanceCount.LowPart >> lowshift) | - ((unsigned int)PerformanceCount.HighPart << (32 - lowshift)); -#endif if (first) { - oldtime = temp; - first = 0; + first = false; + basetime = now; + now = 0; } - else - { - // check for turnover or backward time - if ((temp <= oldtime) && ((oldtime - temp) < 0x10000000)) - { - oldtime = temp; // so we can't get stuck - } - else - { - t2 = temp - oldtime; - time = (double)t2 * pfreq; - oldtime = temp; - - curtime += time; + if (now < old) + { + // wrapped + basetime += (65536.0 * 65536.0); + now += (65536.0 * 65536.0); + } + old = now; - if (curtime == lastcurtime) - { - sametimecount++; + newtime = now / 1000.0; - if (sametimecount > 100000) - { - curtime += 1.0; - sametimecount = 0; - } - } - else - { - sametimecount = 0; - } + if (newtime < oldtime) + Sys_Error("Sys_DoubleTime: time running backwards??\n"); - lastcurtime = curtime; - } - } + oldtime = newtime; - return curtime; -} + return newtime; +#else + // QueryPerformanceCounter + // platform: + // Windows 95/98/ME/NT/2000 + // features: + // very accurate (CPU cycles) + // known issues: + // does not necessarily match realtime too well (tends to get faster and faster in win98) + static int first = true; + static double oldtime = 0.0, basetime = 0.0, timescale = 0.0; + double newtime; + LARGE_INTEGER PerformanceFreq; + LARGE_INTEGER PerformanceCount; + if (first) + { + if (!QueryPerformanceFrequency (&PerformanceFreq)) + Sys_Error ("No hardware timer available"); -/* -================ -Sys_InitFloatTime -================ -*/ -void Sys_InitFloatTime (void) -{ - int j; +#ifdef __BORLANDC__ + timescale = 1.0 / ((double) PerformanceFreq.u.LowPart + (double) PerformanceFreq.u.HighPart * 65536.0 * 65536.0); +#else + timescale = 1.0 / ((double) PerformanceFreq.LowPart + (double) PerformanceFreq.HighPart * 65536.0 * 65536.0); +#endif + } - Sys_FloatTime (); + QueryPerformanceCounter (&PerformanceCount); - j = COM_CheckParm("-starttime"); +#ifdef __BORLANDC__ + newtime = ((double) PerformanceCount.u.LowPart + (double) PerformanceCount.u.HighPart * 65536.0 * 65536.0) * timescale - basetime; +#else + newtime = ((double) PerformanceCount.LowPart + (double) PerformanceCount.HighPart * 65536.0 * 65536.0) * timescale - basetime; +#endif - if (j) - { - curtime = (double) (atof(com_argv[j+1])); - } - else + if (first) { - curtime = 0.0; + first = false; + basetime = newtime; + newtime = 0; } - lastcurtime = curtime; + if (newtime < oldtime) + Sys_Error("Sys_DoubleTime: time running backwards??\n"); + + oldtime = newtime; + + return newtime; +#endif } char *Sys_ConsoleInput (void) { - static char text[256]; - static int len; - INPUT_RECORD recs[1024]; - int dummy; - int ch, numread, numevents; + static char text[256]; + static int len; + INPUT_RECORD recs[1024]; + int ch; + DWORD numread, numevents, dummy; - if (!isDedicated) + if (cls.state != ca_dedicated) return NULL; @@ -622,7 +502,7 @@ static char *empty_string = ""; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - double time, oldtime, newtime/*, timediff*/; + double oldtime, newtime; MEMORYSTATUS lpBuffer; static char cwd[1024]; int t; @@ -643,8 +523,9 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin if (cwd[strlen(cwd)-1] == '/') cwd[strlen(cwd)-1] = 0; + memset(&host_parms, 0, sizeof(host_parms)); + host_parms.basedir = cwd; - host_parms.cachedir = NULL; host_parms.argc = 1; argv[0] = empty_string; @@ -667,7 +548,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin *lpCmdLine = 0; lpCmdLine++; } - + } } @@ -678,37 +559,19 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin host_parms.argc = com_argc; host_parms.argv = com_argv; - isDedicated = (COM_CheckParm ("-dedicated") != 0); - -// take the greater of all the available memory or half the total memory, -// but at least 8 Mb and no more than 16 Mb, unless they explicitly -// request otherwise - /* - host_parms.memsize = lpBuffer.dwAvailPhys; - - if (host_parms.memsize < MINIMUM_WIN_MEMORY) - host_parms.memsize = MINIMUM_WIN_MEMORY; - - if (host_parms.memsize < (lpBuffer.dwTotalPhys >> 1)) - host_parms.memsize = lpBuffer.dwTotalPhys >> 1; - - if (host_parms.memsize > MAXIMUM_WIN_MEMORY) - host_parms.memsize = MAXIMUM_WIN_MEMORY; - */ - -// Sys_PageIn (parms.membase, parms.memsize); + Sys_Shared_EarlyInit(); tevent = CreateEvent(NULL, false, false, NULL); if (!tevent) Sys_Error ("Couldn't create event"); - if (isDedicated) + // LordHavoc: can't check cls.state because it hasn't been initialized yet + // if (cls.state == ca_dedicated) + if (COM_CheckParm("-dedicated")) { if (!AllocConsole ()) - { Sys_Error ("Couldn't create dedicated server console"); - } hinput = GetStdHandle (STD_INPUT_HANDLE); houtput = GetStdHandle (STD_OUTPUT_HANDLE); @@ -719,13 +582,13 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin if (t < com_argc) hFile = (HANDLE)atoi (com_argv[t+1]); } - + if ((t = COM_CheckParm ("-HPARENT")) > 0) { if (t < com_argc) heventParent = (HANDLE)atoi (com_argv[t+1]); } - + if ((t = COM_CheckParm ("-HCHILD")) > 0) { if (t < com_argc) @@ -735,63 +598,41 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin InitConProc (hFile, heventParent, heventChild); } - Sys_Init (); - // because sound is off until we become active S_BlockSound (); - Sys_Printf ("Host_Init\n"); +#if WIN32_USETIMEGETTIME + // make sure the timer is high precision, otherwise NT gets 18ms resolution + // LordHavoc: + // Windows 2000 Advanced Server (and possibly other versions) + // apparently have a broken timer, because it runs at more like 10x speed + // if this isn't used, heh + timeBeginPeriod (1); +#endif + Host_Init (); - oldtime = Sys_FloatTime (); + Sys_Shared_LateInit(); + + oldtime = Sys_DoubleTime (); /* main window message loop */ while (1) { - if (isDedicated) - { - newtime = Sys_FloatTime (); - time = newtime - oldtime; - - while (time < sys_ticrate.value ) - { - Sys_Sleep(); - newtime = Sys_FloatTime (); - time = newtime - oldtime; - } - } - else + if (cls.state != ca_dedicated) { // yield the CPU for a little while when paused, minimized, or not the focus - if ((cl.paused && (!ActiveApp && !DDActive)) || Minimized) + if ((cl.paused && !ActiveApp) || Minimized) { SleepUntilInput (PAUSE_SLEEP); scr_skipupdate = 1; // no point in bothering to draw } - else if (!ActiveApp && !DDActive) - { + else if (!ActiveApp) SleepUntilInput (NOT_FOCUS_SLEEP); - } - /* - else if (!cls.timedemo && time < (timediff = 1.0 / maxfps.value)) - { - newtime = Sys_FloatTime (); - time = newtime - oldtime; - - while (time < timediff) - { - Sys_Sleep(); - newtime = Sys_FloatTime (); - time = newtime - oldtime; - } - } - */ - - newtime = Sys_FloatTime (); - time = newtime - oldtime; } - Host_Frame (time); + newtime = Sys_DoubleTime (); + Host_Frame (newtime - oldtime); oldtime = newtime; }