X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=sys_shared.c;h=298de87d385349cb93c0432d159c78952b0aced1;hb=94a5be97432b0a538c0200cd0c837253b65633bf;hp=903bee1e6868edbe8363ea1791f2f5fdefccfcd8;hpb=68cb8232d851614b32389d634a7f4fa4576c8d58;p=xonotic%2Fdarkplaces.git diff --git a/sys_shared.c b/sys_shared.c index 903bee1e..298de87d 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -1,12 +1,14 @@ +#ifdef WIN32 +# ifndef DONT_USE_SETDLLDIRECTORY +# define _WIN32_WINNT 0x0502 +# endif +#endif + #include "quakedef.h" #define SUPPORTDLL #ifdef WIN32 -# ifdef _WIN64 -# define _WIN32_WINNT 0x0502 - // for SetDllDirectory -# endif # include # include // timeGetTime # include // localtime @@ -131,13 +133,15 @@ notfound: { Con_DPrintf (" \"%s\"", dllnames[i]); #ifdef WIN32 -# ifdef _WIN64 +# ifndef DONT_USE_SETDLLDIRECTORY +# ifdef _WIN64 SetDllDirectory("bin64"); +# else + SetDllDirectory("bin32"); +# endif # endif dllhandle = LoadLibrary (dllnames[i]); -# ifdef _WIN64 - SetDllDirectory(NULL); -# endif + // no need to unset this - we want ALL dlls to be loaded from there, anyway #else dllhandle = dlopen (dllnames[i], RTLD_LAZY | RTLD_GLOBAL); #endif @@ -232,8 +236,12 @@ void* Sys_GetProcAddress (dllhandle_t handle, const char* name) # define HAVE_GETTIMEOFDAY 1 #endif -#ifdef FD_SET -# define HAVE_SELECT 1 +#ifndef WIN32 +// on Win32, select() cannot be used with all three FD list args being NULL according to MSDN +// (so much for POSIX...) +# ifdef FD_SET +# define HAVE_SELECT 1 +# endif #endif #ifndef WIN32 @@ -504,3 +512,61 @@ void Sys_ProvideSelfFD(void) return; com_selffd = FS_SysOpenFD(Sys_FindExecutableName(), "rb", false); } + +// for x86 cpus only... (x64 has SSE2_PRESENT) +#if defined(SSE_POSSIBLE) && !defined(SSE2_PRESENT) +// code from SDL, shortened as we can expect CPUID to work +static int CPUID_Features(void) +{ + int features = 0; +# if defined(__GNUC__) && defined(__i386__) + __asm__ ( +" movl %%ebx,%%edi\n" +" xorl %%eax,%%eax \n" +" incl %%eax \n" +" cpuid # Get family/model/stepping/features\n" +" movl %%edx,%0 \n" +" movl %%edi,%%ebx\n" + : "=m" (features) + : + : "%eax", "%ecx", "%edx", "%edi" + ); +# elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) + __asm { + xor eax, eax + inc eax + cpuid ; Get family/model/stepping/features + mov features, edx + } +# else +# error SSE_POSSIBLE set but no CPUID implementation +# endif + return features; +} + +qboolean Sys_HaveSSE(void) +{ + // COMMANDLINEOPTION: SSE: -nosse disables SSE support and detection + if(COM_CheckParm("-nosse")) + return false; + // COMMANDLINEOPTION: SSE: -forcesse enables SSE support and disables detection + if(COM_CheckParm("-forcesse") || COM_CheckParm("-forcesse2")) + return true; + if(CPUID_Features() & (1 << 25)) + return true; + return false; +} + +qboolean Sys_HaveSSE2(void) +{ + // COMMANDLINEOPTION: SSE2: -nosse2 disables SSE2 support and detection + if(COM_CheckParm("-nosse") || COM_CheckParm("-nosse2")) + return false; + // COMMANDLINEOPTION: SSE2: -forcesse2 enables SSE2 support and disables detection + if(COM_CheckParm("-forcesse2")) + return true; + if((CPUID_Features() & (3 << 25)) == (3 << 25)) // SSE is 1<<25, SSE2 is 1<<26 + return true; + return false; +} +#endif