From ca85c4d27b40166046590429ea190f553de98b91 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Thu, 13 Dec 2012 20:37:55 +0100 Subject: [PATCH] Added changes to compile for Win64 --- neo/CMakeLists.txt | 5 +- neo/cmake-vs2010-64bit.bat | 6 ++ neo/cmake-vs2012-64bit.bat | 6 ++ neo/sys/win32/win_cpu.cpp | 116 +++++++++++++++++++++++++++++------ neo/sys/win32/win_main.cpp | 25 +++++--- neo/sys/win32/win_syscon.cpp | 8 ++- 6 files changed, 139 insertions(+), 27 deletions(-) create mode 100644 neo/cmake-vs2010-64bit.bat create mode 100644 neo/cmake-vs2012-64bit.bat diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 7310e1e0..1895b2f9 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -81,11 +81,14 @@ elseif(MSVC) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS - -D_USE_32BIT_TIME_T -D_MBCS #-DUSE_OPENAL -DUSE_EXCEPTIONS) + if(NOT CMAKE_CL_64) + add_definitions(-D_USE_32BIT_TIME_T) + endif() + if(USE_MFC_TOOLS) add_definitions(-D_AFXDLL) diff --git a/neo/cmake-vs2010-64bit.bat b/neo/cmake-vs2010-64bit.bat new file mode 100644 index 00000000..aa2514c8 --- /dev/null +++ b/neo/cmake-vs2010-64bit.bat @@ -0,0 +1,6 @@ +cd .. +del /s /q build +mkdir build +cd build +cmake -G "Visual Studio 10 Win64" ../neo +pause \ No newline at end of file diff --git a/neo/cmake-vs2012-64bit.bat b/neo/cmake-vs2012-64bit.bat new file mode 100644 index 00000000..6f719d30 --- /dev/null +++ b/neo/cmake-vs2012-64bit.bat @@ -0,0 +1,6 @@ +cd .. +del /s /q build +mkdir build +cd build +cmake -G "Visual Studio 11 Win64" ../neo +pause \ No newline at end of file diff --git a/neo/sys/win32/win_cpu.cpp b/neo/sys/win32/win_cpu.cpp index 274a572f..0e8182d5 100644 --- a/neo/sys/win32/win_cpu.cpp +++ b/neo/sys/win32/win_cpu.cpp @@ -2,7 +2,8 @@ =========================================================================== Doom 3 BFG Edition GPL Source Code -Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2012 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -47,17 +48,18 @@ If you have questions concerning this license or the applicable additional terms Sys_GetClockTicks ================ */ -double Sys_GetClockTicks() { -#if 0 +double Sys_GetClockTicks() +{ +// RB begin +#if defined(_WIN64) LARGE_INTEGER li; QueryPerformanceCounter( &li ); - return = (double ) li.LowPart + (double) 0xFFFFFFFF * li.HighPart; + return (double ) li.LowPart + (double) 0xFFFFFFFF * li.HighPart; #else - // RB begin #if defined(_MSC_VER) unsigned long lo, hi; @@ -88,9 +90,9 @@ double Sys_GetClockTicks() { #else #error unsupported CPU #endif - // RB end #endif + // RB end } /* @@ -151,6 +153,8 @@ double Sys_ClockTicksPerSecond() { HasCPUID ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool HasCPUID() { __asm { @@ -182,6 +186,7 @@ err: good: return true; } +#endif #define _REG_EAX 0 #define _REG_EBX 1 @@ -193,6 +198,8 @@ good: CPUID ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static void CPUID( int func, unsigned regs[4] ) { unsigned regEAX, regEBX, regECX, regEDX; @@ -211,13 +218,15 @@ static void CPUID( int func, unsigned regs[4] ) { regs[_REG_ECX] = regECX; regs[_REG_EDX] = regEDX; } - +#endif /* ================ IsAMD ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool IsAMD() { char pstring[16]; char processorString[13]; @@ -243,12 +252,15 @@ static bool IsAMD() { } return false; } +#endif /* ================ HasCMOV ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool HasCMOV() { unsigned regs[4]; @@ -261,12 +273,15 @@ static bool HasCMOV() { } return false; } +#endif /* ================ Has3DNow ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool Has3DNow() { unsigned regs[4]; @@ -284,12 +299,15 @@ static bool Has3DNow() { return false; } +#endif /* ================ HasMMX ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool HasMMX() { unsigned regs[4]; @@ -302,12 +320,15 @@ static bool HasMMX() { } return false; } +#endif /* ================ HasSSE ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool HasSSE() { unsigned regs[4]; @@ -320,12 +341,15 @@ static bool HasSSE() { } return false; } +#endif /* ================ HasSSE2 ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool HasSSE2() { unsigned regs[4]; @@ -338,12 +362,15 @@ static bool HasSSE2() { } return false; } +#endif /* ================ HasSSE3 ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool HasSSE3() { unsigned regs[4]; @@ -356,12 +383,15 @@ static bool HasSSE3() { } return false; } +#endif /* ================ LogicalProcPerPhysicalProc ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) #define NUM_LOGICAL_BITS 0x00FF0000 // EBX[23:16] Bit 16-23 in ebx contains the number of logical // processors per physical processor when execute cpuid with // eax set to 1 @@ -374,12 +404,15 @@ static unsigned char LogicalProcPerPhysicalProc() { } return (unsigned char) ((regebx & NUM_LOGICAL_BITS) >> 16); } +#endif /* ================ GetAPIC_ID ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) #define INITIAL_APIC_ID_BITS 0xFF000000 // EBX[31:24] Bits 24-31 (8 bits) return the 8-bit unique // initial APIC ID for the processor this code is running on. // Default value = 0xff if HT is not supported @@ -392,6 +425,7 @@ static unsigned char GetAPIC_ID() { } return (unsigned char) ((regebx & INITIAL_APIC_ID_BITS) >> 24); } +#endif /* ================ @@ -402,6 +436,8 @@ CPUCount returns one of the HT_* flags ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) #define HT_NOT_CAPABLE 0 #define HT_ENABLED 1 #define HT_DISABLED 2 @@ -493,12 +529,15 @@ int CPUCount( int &logicalNum, int &physicalNum ) { } return statusFlag; } +#endif /* ================ HasHTT ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool HasHTT() { unsigned regs[4]; int logicalNum, physicalNum, HTStatusFlag; @@ -517,12 +556,15 @@ static bool HasHTT() { } return true; } +#endif /* ================ -HasHTT +HasDAZ ================ */ +// RB: no checks on Win64 +#if !defined(_WIN64) static bool HasDAZ() { __declspec(align(16)) unsigned char FXSaveArea[512]; unsigned char *FXArea = FXSaveArea; @@ -547,6 +589,7 @@ static bool HasDAZ() { dwMask = *(DWORD *)&FXArea[28]; // Read the MXCSR Mask return ( ( dwMask & ( 1 << 6 ) ) == ( 1 << 6 ) ); // Return if the DAZ bit is set } +#endif /* ================================================================================================ @@ -726,11 +769,21 @@ void Sys_CPUCount( int & numLogicalCPUCores, int & numPhysicalCPUCores, int & nu Sys_GetCPUId ================ */ -cpuid_t Sys_GetCPUId() { +cpuid_t Sys_GetCPUId() +{ + // RB: we assume a modern x86 chip +#if defined(_WIN64) + int flags = CPUID_GENERIC; + + flags |= CPUID_SSE; + flags |= CPUID_SSE2; + + return (cpuid_t)flags; +#else int flags; // verify we're at least a Pentium or 486 with CPUID support - if ( !HasCPUID() ) { + if ( !HasCPUID() ){ return CPUID_UNSUPPORTED; } @@ -782,6 +835,7 @@ cpuid_t Sys_GetCPUId() { } return (cpuid_t)flags; +#endif } @@ -875,7 +929,9 @@ int Sys_FPU_PrintStateFlags( char *ptr, int ctrl, int stat, int tags, int inof, Sys_FPU_StackIsEmpty =============== */ -bool Sys_FPU_StackIsEmpty() { +bool Sys_FPU_StackIsEmpty() +{ +#if !defined(_WIN64) __asm { mov eax, statePtr fnstenv [eax] @@ -886,6 +942,7 @@ bool Sys_FPU_StackIsEmpty() { } return false; empty: +#endif return true; } @@ -894,7 +951,9 @@ empty: Sys_FPU_ClearStack =============== */ -void Sys_FPU_ClearStack() { +void Sys_FPU_ClearStack() +{ +#if !defined(_WIN64) __asm { mov eax, statePtr fnstenv [eax] @@ -910,6 +969,7 @@ void Sys_FPU_ClearStack() { jmp emptyStack done: } +#endif } /* @@ -919,7 +979,11 @@ Sys_FPU_GetState gets the FPU state without changing the state =============== */ -const char *Sys_FPU_GetState() { +const char *Sys_FPU_GetState() +{ +#if defined(_WIN64) + return "TODO Sys_FPU_GetState()"; +#else double fpuStack[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; double *fpuStackPtr = fpuStack; int i, numValues; @@ -1016,6 +1080,7 @@ const char *Sys_FPU_GetState() { Sys_FPU_PrintStateFlags( ptr, ctrl, stat, tags, inof, inse, opof, opse ); return fpuString; +#endif } /* @@ -1023,7 +1088,9 @@ const char *Sys_FPU_GetState() { Sys_FPU_EnableExceptions =============== */ -void Sys_FPU_EnableExceptions( int exceptions ) { +void Sys_FPU_EnableExceptions( int exceptions ) +{ +#if !defined(_WIN64) __asm { mov eax, statePtr mov ecx, exceptions @@ -1036,6 +1103,7 @@ void Sys_FPU_EnableExceptions( int exceptions ) { mov word ptr [eax], bx fldcw word ptr [eax] } +#endif } /* @@ -1043,7 +1111,9 @@ void Sys_FPU_EnableExceptions( int exceptions ) { Sys_FPU_SetPrecision =============== */ -void Sys_FPU_SetPrecision( int precision ) { +void Sys_FPU_SetPrecision( int precision ) +{ +#if !defined(_WIN64) short precisionBitTable[4] = { 0, 1, 3, 0 }; short precisionBits = precisionBitTable[precision & 3] << 8; short precisionMask = ~( ( 1 << 9 ) | ( 1 << 8 ) ); @@ -1058,6 +1128,7 @@ void Sys_FPU_SetPrecision( int precision ) { mov word ptr [eax], bx fldcw word ptr [eax] } +#endif } /* @@ -1065,7 +1136,9 @@ void Sys_FPU_SetPrecision( int precision ) { Sys_FPU_SetRounding ================ */ -void Sys_FPU_SetRounding( int rounding ) { +void Sys_FPU_SetRounding( int rounding ) +{ +#if !defined(_WIN64) short roundingBitTable[4] = { 0, 1, 2, 3 }; short roundingBits = roundingBitTable[rounding & 3] << 10; short roundingMask = ~( ( 1 << 11 ) | ( 1 << 10 ) ); @@ -1080,6 +1153,7 @@ void Sys_FPU_SetRounding( int rounding ) { mov word ptr [eax], bx fldcw word ptr [eax] } +#endif } /* @@ -1087,7 +1161,9 @@ void Sys_FPU_SetRounding( int rounding ) { Sys_FPU_SetDAZ ================ */ -void Sys_FPU_SetDAZ( bool enable ) { +void Sys_FPU_SetDAZ( bool enable ) +{ +#if !defined(_WIN64) DWORD dwData; _asm { @@ -1101,6 +1177,7 @@ void Sys_FPU_SetDAZ( bool enable ) { mov dwData, eax LDMXCSR dword ptr dwData } +#endif } /* @@ -1108,7 +1185,9 @@ void Sys_FPU_SetDAZ( bool enable ) { Sys_FPU_SetFTZ ================ */ -void Sys_FPU_SetFTZ( bool enable ) { +void Sys_FPU_SetFTZ( bool enable ) +{ +#if !defined(_WIN64) DWORD dwData; _asm { @@ -1122,4 +1201,5 @@ void Sys_FPU_SetFTZ( bool enable ) { mov dwData, eax LDMXCSR dword ptr dwData } +#endif } diff --git a/neo/sys/win32/win_main.cpp b/neo/sys/win32/win_main.cpp index 67817b65..4be68718 100644 --- a/neo/sys/win32/win_main.cpp +++ b/neo/sys/win32/win_main.cpp @@ -585,7 +585,9 @@ Sys_ListFiles int Sys_ListFiles( const char *directory, const char *extension, idStrList &list ) { idStr search; struct _finddata_t findinfo; - int findhandle; + // RB: 64 bit fixes, changed int to intptr_t + intptr_t findhandle; + // RB end int flag; if ( !extension) { @@ -862,7 +864,9 @@ DLL Loading Sys_DLL_Load ===================== */ -int Sys_DLL_Load( const char *dllName ) { +// RB: 64 bit fixes, changed int to intptr_t +intptr_t Sys_DLL_Load( const char *dllName ) +{ HINSTANCE libHandle = LoadLibrary( dllName ); return (int)libHandle; } @@ -872,7 +876,8 @@ int Sys_DLL_Load( const char *dllName ) { Sys_DLL_GetProcAddress ===================== */ -void *Sys_DLL_GetProcAddress( int dllHandle, const char *procName ) { +void *Sys_DLL_GetProcAddress( intptr_t dllHandle, const char *procName ) +{ // RB: added missing cast return ( void* ) GetProcAddress( (HINSTANCE)dllHandle, procName ); } @@ -882,11 +887,15 @@ void *Sys_DLL_GetProcAddress( int dllHandle, const char *procName ) { Sys_DLL_Unload ===================== */ -void Sys_DLL_Unload( int dllHandle ) { - if ( !dllHandle ) { +void Sys_DLL_Unload( intptr_t dllHandle ) +{ + if( !dllHandle ) + { return; } - if ( FreeLibrary( (HINSTANCE)dllHandle ) == 0 ) { + + if( FreeLibrary( (HINSTANCE)dllHandle ) == 0 ) + { int lastError = GetLastError(); LPVOID lpMsgBuf; FormatMessage( @@ -898,9 +907,11 @@ void Sys_DLL_Unload( int dllHandle ) { 0, NULL ); + Sys_Error( "Sys_DLL_Unload: FreeLibrary failed - %s (%d)", lpMsgBuf, lastError ); } } +// RB end /* ======================================================================== @@ -1361,7 +1372,7 @@ void EmailCrashReport( LPSTR messageText ) { } // RB: disabled unused FPU exception debugging -#if !defined(__MINGW32__) +#if !defined(__MINGW32__) && !defined(_WIN64) int Sys_FPU_PrintStateFlags( char *ptr, int ctrl, int stat, int tags, int inof, int inse, int opof, int opse ); diff --git a/neo/sys/win32/win_syscon.cpp b/neo/sys/win32/win_syscon.cpp index 3ac84f22..67cc5ed8 100644 --- a/neo/sys/win32/win_syscon.cpp +++ b/neo/sys/win32/win_syscon.cpp @@ -426,7 +426,13 @@ void Sys_CreateConsole() win32.hInstance, NULL ); SendMessage( s_wcd.hwndBuffer, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); - s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLong( s_wcd.hwndInputLine, GWL_WNDPROC, ( long ) InputLineWndProc ); + // RB begin +#if defined(_WIN64) + s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLong( s_wcd.hwndInputLine, GWLP_WNDPROC, ( LONG_PTR ) InputLineWndProc ); +#else + s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLong( s_wcd.hwndInputLine, GWL_WNDPROC, ( LONG ) InputLineWndProc ); +#endif + // RB end SendMessage( s_wcd.hwndInputLine, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 ); // don't show it now that we have a splash screen up