From 53bd92f7a87d7eb0cfc76b387ab53a20eb4df837 Mon Sep 17 00:00:00 2001 From: Er2 Date: Thu, 24 Nov 2022 22:04:29 +0300 Subject: [PATCH] BSD: Add support (#140) * BSD: Add support * BSD: other fixes There is still a bug when vgui haven't got text, maybe because of resources. Also there is bug where when trying to start new game caption names shows wrong. * BSD: Debugging * BSD: modify preprocessor and fix windows * BSD: Remove debugging and fix labels in gameui * BSD: Remove disabling some DX9 commands * BSD: Remove -g flag --- .gitignore | 2 + appframework/glmdisplaydb_linuxwin.inl | 4 +- appframework/sdlmgr.cpp | 4 +- common/freetype/config/ftconfig.h | 2 +- common/vgui_surfacelib/FontManager.h | 6 +-- common/vgui_surfacelib/vguifont.h | 4 +- engine/bugreporter.cpp | 17 ++++-- engine/host.cpp | 2 +- engine/sv_main.cpp | 8 +++ engine/sv_uploadgamestats.cpp | 6 ++- engine/sys_dll.cpp | 21 ++++---- engine/sys_dll2.cpp | 11 ++-- engine/sys_mainwind.cpp | 8 +-- filesystem/basefilesystem.cpp | 2 +- filesystem/filesystem_async.cpp | 2 +- filesystem/filesystem_stdio.cpp | 6 +-- gameui/BasePanel.cpp | 6 +-- gameui/VGuiSystemModuleLoader.cpp | 2 +- ivp | 2 +- launcher/launcher.cpp | 20 +++---- materialsystem/stdshaders/occlusion_dx9.cpp | 2 +- mathlib/3dnow.cpp | 4 +- mathlib/mathlib_base.cpp | 2 +- public/appframework/AppFramework.h | 2 +- public/appframework/ilaunchermgr.h | 2 +- public/tier0/basetypes.h | 6 ++- public/tier0/platform.h | 46 ++++++++++------ public/tier0/threadtools.h | 4 +- public/tier1/interface.h | 2 +- scripts/waifulib/compiler_optimizations.py | 4 +- serverbrowser/ServerBrowserDialog.cpp | 2 +- tier0/cpu.cpp | 17 +++--- tier0/cpu_posix.cpp | 37 +++++++------ tier0/platform_posix.cpp | 60 +++++++++------------ tier0/threadtools.cpp | 7 ++- tier1/KeyValues.cpp | 2 +- tier1/strtools.cpp | 2 +- togl/linuxwin/dxabstract.cpp | 2 +- togl/linuxwin/glentrypoints.cpp | 4 +- togles/linuxwin/dxabstract.cpp | 2 +- togles/linuxwin/glentrypoints.cpp | 2 +- vgui2/src/system_posix.cpp | 10 ++-- vgui2/vgui_surfacelib/FontManager.cpp | 12 ++--- vgui2/vgui_surfacelib/wscript | 2 +- vguimatsurface/FontTextureCache.cpp | 2 +- vguimatsurface/MatSystemSurface.cpp | 8 +-- vguimatsurface/MatSystemSurface.h | 2 +- video/videoservices.cpp | 6 +-- wscript | 11 ++++ 49 files changed, 221 insertions(+), 178 deletions(-) diff --git a/.gitignore b/.gitignore index 717bd12d..37d8b4c9 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ waf3*/ .vscode/ .depproj/ source-engine.sln +hl2/ + diff --git a/appframework/glmdisplaydb_linuxwin.inl b/appframework/glmdisplaydb_linuxwin.inl index daa28d85..fe743b19 100644 --- a/appframework/glmdisplaydb_linuxwin.inl +++ b/appframework/glmdisplaydb_linuxwin.inl @@ -631,8 +631,8 @@ void GLMDisplayInfo::Dump( int which ) { SDLAPP_FUNC; - GLMPRINTF(("\n #%d: GLMDisplayInfo @ %08x, pixwidth=%d pixheight=%d", - which, (int)this, m_info.m_displayPixelWidth, m_info.m_displayPixelHeight )); + GLMPRINTF(("\n #%d: GLMDisplayInfo @ %p, pixwidth=%d pixheight=%d", + which, this, m_info.m_displayPixelWidth, m_info.m_displayPixelHeight )); FOR_EACH_VEC( *m_modes, i ) { diff --git a/appframework/sdlmgr.cpp b/appframework/sdlmgr.cpp index 5c820f6f..84de467c 100644 --- a/appframework/sdlmgr.cpp +++ b/appframework/sdlmgr.cpp @@ -270,7 +270,7 @@ public: // Get the next N events. The function returns the number of events that were filled into your array. virtual int GetEvents( CCocoaEvent *pEvents, int nMaxEventsToReturn, bool debugEvents = false ); -#ifdef LINUX +#if defined(LINUX) || defined(BSD) virtual int PeekAndRemoveKeyboardEvents( bool *pbEsc, bool *pbReturn, bool *pbSpace, bool debugEvent = false ); #endif @@ -1004,7 +1004,7 @@ int CSDLMgr::GetEvents( CCocoaEvent *pEvents, int nMaxEventsToReturn, bool debug return nToWrite; } -#ifdef LINUX +#if defined(LINUX) || defined(BSD) int CSDLMgr::PeekAndRemoveKeyboardEvents( bool *pbEsc, bool *pbReturn, bool *pbSpace, bool debugEvent ) { diff --git a/common/freetype/config/ftconfig.h b/common/freetype/config/ftconfig.h index 200dd57f..f83aa8db 100644 --- a/common/freetype/config/ftconfig.h +++ b/common/freetype/config/ftconfig.h @@ -3,7 +3,7 @@ #ifdef ANDROID #include -#elif defined(OSX) +#elif defined(OSX) || defined(BSD) #include #else #include diff --git a/common/vgui_surfacelib/FontManager.h b/common/vgui_surfacelib/FontManager.h index 0d7d1e58..b6b10b81 100644 --- a/common/vgui_surfacelib/FontManager.h +++ b/common/vgui_surfacelib/FontManager.h @@ -17,7 +17,7 @@ #include "filesystem.h" #include "vguifont.h" -#if defined(LINUX) || defined(OSX) +#ifdef POSIX #include #include FT_FREETYPE_H typedef void *(*FontDataHelper)( const char *pchFontName, int &size, const char *fontFileName ); @@ -71,7 +71,7 @@ public: IFileSystem *FileSystem() { return m_pFileSystem; } IMaterialSystem *MaterialSystem() { return m_pMaterialSystem; } -#if defined(LINUX) || defined(OSX) +#ifdef POSIX FT_Library GetFontLibraryHandle() { return library; } void SetFontDataHelper( FontDataHelper helper ) { m_pFontDataHelper = helper; } #endif @@ -96,7 +96,7 @@ private: CUtlVector m_FontAmalgams; CUtlVector m_Win32Fonts; -#if defined(LINUX) || defined(OSX) +#ifdef POSIX FT_Library library; FontDataHelper m_pFontDataHelper; #endif diff --git a/common/vgui_surfacelib/vguifont.h b/common/vgui_surfacelib/vguifont.h index 02374f36..0ab9cd44 100644 --- a/common/vgui_surfacelib/vguifont.h +++ b/common/vgui_surfacelib/vguifont.h @@ -23,7 +23,7 @@ struct newChar_t #ifdef WIN32 #include "Win32Font.h" typedef CWin32Font font_t; -#elif defined(LINUX) || defined(OSX) +#elif defined(POSIX) #include "linuxfont.h" typedef CLinuxFont font_t; #else @@ -31,4 +31,4 @@ typedef CLinuxFont font_t; #endif -#endif //VGUIFONT_H \ No newline at end of file +#endif //VGUIFONT_H diff --git a/engine/bugreporter.cpp b/engine/bugreporter.cpp index 25a5b4f3..1caf4fcf 100644 --- a/engine/bugreporter.cpp +++ b/engine/bugreporter.cpp @@ -20,6 +20,11 @@ #include #import #import +#elif defined(BSD) +# include +# include +# include +# define HW_MEMSIZE HW_PHYSMEM #elif defined(LINUX) #include #include @@ -105,7 +110,7 @@ #define BUG_REPOSITORY_URL "\\\\fileserver\\bugs" #elif defined(OSX) #define BUG_REPOSITORY_URL "/Volumes/bugs" -#elif defined(LINUX) +#elif defined(LINUX) || defined(BSD) #define BUG_REPOSITORY_URL "\\\\fileserver\\bugs" #else //#error @@ -139,7 +144,7 @@ unsigned long GetRam() MEMORYSTATUS stat; GlobalMemoryStatus( &stat ); return (stat.dwTotalPhys / (1024 * 1024)); -#elif defined(OSX) +#elif defined(OSX) || defined(BSD) int mib[2] = { CTL_HW, HW_MEMSIZE }; u_int namelen = sizeof(mib) / sizeof(mib[0]); uint64_t memsize; @@ -340,6 +345,12 @@ void DisplaySystemVersion( char *osversion, int maxlen ) fclose( fpKernelVer ); } +#elif BSD + #ifdef __FreeBSD__ + osversion = (char *)"FreeBSD"; + #else + osversion = (char *)"*BSD"; + #endif #endif } @@ -2246,7 +2257,7 @@ void NonFileSystem_CreatePath (const char *path) } } -#ifdef LINUX +#if defined(LINUX) || defined(BSD) #define COPYFILE_ALL 0 #define BSIZE 65535 int copyfile( const char *local, const char *remote, void *ignored, int ignoredFlags ) diff --git a/engine/host.cpp b/engine/host.cpp index 9ddc96b6..9ebdc928 100644 --- a/engine/host.cpp +++ b/engine/host.cpp @@ -3947,7 +3947,7 @@ bool DLL_LOCAL Host_IsValidSignature( const char *pFilename, bool bAllowUnknown #if defined( SWDS ) || defined(_X360) return true; #else - if ( sv.IsDedicated() || IsOSX() || IsLinux() ) + if ( sv.IsDedicated() || IsOSX() || IsLinux() || IsBSD() ) { // dedicated servers and Mac and Linux binaries don't check signatures return true; diff --git a/engine/sv_main.cpp b/engine/sv_main.cpp index 58c395ed..000da522 100644 --- a/engine/sv_main.cpp +++ b/engine/sv_main.cpp @@ -2714,6 +2714,14 @@ bool CGameServer::SpawnServer( const char *szMapName, const char *szMapFile, con event->SetString( "os", "LINUX" ); #elif defined ( OSX ) event->SetString( "os", "OSX" ); +#elif defined(BSD) + event->SetString("os", +# ifdef __FreeBSD__ + "FreeBSD" +# else + "BSD" +# endif + ); #else #error #endif diff --git a/engine/sv_uploadgamestats.cpp b/engine/sv_uploadgamestats.cpp index f4836600..01c110bf 100644 --- a/engine/sv_uploadgamestats.cpp +++ b/engine/sv_uploadgamestats.cpp @@ -21,9 +21,10 @@ #include #include //$ #include -typedef unsigned char uuid_t[16]; #ifdef OSX #include +#elif defined(BSD) +#include #else typedef unsigned char uuid_t[16]; #endif @@ -397,6 +398,9 @@ public: uuid_t newId; #ifdef OSX uuid_generate( newId ); +#elif defined(BSD) + uint32_t status; + uuid_create( &newId, &status ); #endif #else #error diff --git a/engine/sys_dll.cpp b/engine/sys_dll.cpp index 2d8b30e2..04ff6689 100644 --- a/engine/sys_dll.cpp +++ b/engine/sys_dll.cpp @@ -12,6 +12,10 @@ #elif defined(OSX) #include #include +#elif defined(BSD) +#include +#include +#define HW_MEMSIZE HW_PHYSMEM #endif #if defined(LINUX) #include @@ -456,21 +460,14 @@ void Sys_Error_Internal( bool bMinidump, const char *error, va_list argsList ) // We always get here because the above filter evaluates to EXCEPTION_EXECUTE_HANDLER } -#elif defined( OSX ) +#elif defined(POSIX) // Doing this doesn't quite work the way we want because there is no "crashing" thread // and we see "No thread was identified as the cause of the crash; No signature could be created because we do not know which thread crashed" on the back end //SteamAPI_WriteMiniDump( 0, NULL, build_number() ); printf("\n ##### Sys_Error: %s", text ); fflush(stdout ); - int *p = 0; - *p = 0xdeadbeef; -#elif defined( LINUX ) - // Doing this doesn't quite work the way we want because there is no "crashing" thread - // and we see "No thread was identified as the cause of the crash; No signature could be created because we do not know which thread crashed" on the back end - //SteamAPI_WriteMiniDump( 0, NULL, build_number() ); - int *p = 0; - *p = 0xdeadbeef; + raise(SIGTRAP); #else #warning "need minidump impl on sys_error" #endif @@ -671,7 +668,7 @@ void Sys_InitMemory( void ) #elif defined(POSIX) uint64_t memsize = ONE_HUNDRED_TWENTY_EIGHT_MB; -#if defined(OSX) +#if defined(OSX) || defined(BSD) int mib[2] = { CTL_HW, HW_MEMSIZE }; u_int namelen = sizeof(mib) / sizeof(mib[0]); size_t len = sizeof(memsize); @@ -1589,7 +1586,9 @@ CON_COMMAND( star_memory, "Dump memory stats" ) struct mstats memstats = mstats( ); Msg( "Available %.2f MB, Used: %.2f MB, #mallocs = %lu\n", memstats.bytes_free / ( 1024.0 * 1024.0), memstats.bytes_used / ( 1024.0 * 1024.0 ), memstats.chunks_used ); -#else +#elif BSD +# warning TODO: Implement memory stats (peace of sheet of course) +#else // Win32 MEMORYSTATUS stat; GlobalMemoryStatus( &stat ); Msg( "Available: %.2f MB, Used: %.2f MB, Free: %.2f MB\n", diff --git a/engine/sys_dll2.cpp b/engine/sys_dll2.cpp index 087d398e..0a65cbd0 100644 --- a/engine/sys_dll2.cpp +++ b/engine/sys_dll2.cpp @@ -15,7 +15,7 @@ #include #endif -#if defined( OSX ) +#if defined( OSX ) || defined(BSD) #include #endif @@ -278,7 +278,7 @@ static void posix_signal_handler( int i ) #define DO_TRY if ( sigsetjmp( g_mark, 1 ) == 0 ) #define DO_CATCH else -#if defined( OSX ) +#if defined( OSX ) || defined(BSD) #define __sighandler_t sig_t #endif @@ -537,7 +537,7 @@ public: FreeLibrary( hInst ); } -#elif defined( OSX ) +#elif defined( OSX ) || defined(BSD) static const struct { @@ -548,8 +548,13 @@ public: #define _XTAG( _x ) { _x, #_x } _XTAG( HW_PHYSMEM ), _XTAG( HW_USERMEM ), +#ifdef BSD + _XTAG( HW_PHYSMEM ), + _XTAG( HW_NCPU ), +#else _XTAG( HW_MEMSIZE ), _XTAG( HW_AVAILCPU ), +#endif #undef _XTAG }; diff --git a/engine/sys_mainwind.cpp b/engine/sys_mainwind.cpp index c3bb3acf..b8fc98d7 100644 --- a/engine/sys_mainwind.cpp +++ b/engine/sys_mainwind.cpp @@ -25,7 +25,7 @@ #elif defined(_X360) // nothing to include for 360 #elif defined(OSX) -#elif defined(LINUX) +#elif defined(LINUX) || defined(BSD) #include "tier0/dynfunction.h" #elif defined(_WIN32) #include "tier0/dynfunction.h" @@ -833,11 +833,7 @@ LRESULT CGame::WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) // return 0 if handled message, 1 if not return lRet; } -#elif defined(OSX) - -#elif defined(LINUX) - -#elif defined(_WIN32) +#elif defined(OSX) || defined(LINUX) || defined(_WIN32) || defined(BSD) #else #error diff --git a/filesystem/basefilesystem.cpp b/filesystem/basefilesystem.cpp index 16179b9b..35f34f23 100644 --- a/filesystem/basefilesystem.cpp +++ b/filesystem/basefilesystem.cpp @@ -2841,7 +2841,7 @@ time_t CBaseFileSystem::FastFileTime( const CSearchPath *path, const char *pFile { return buf.st_mtime; } -#ifdef LINUX +#if defined(LINUX) || defined(BSD) char caseFixedName[ MAX_PATH ]; bool found = findFileInDirCaseInsensitive_safe( pTmpFileName, caseFixedName ); if ( found && FS_stat( caseFixedName, &buf ) != -1 ) diff --git a/filesystem/filesystem_async.cpp b/filesystem/filesystem_async.cpp index adce661c..27216b74 100644 --- a/filesystem/filesystem_async.cpp +++ b/filesystem/filesystem_async.cpp @@ -1527,7 +1527,7 @@ void CBaseFileSystem::DoAsyncCallback( const FileAsyncRequest_t &request, void * if ( pDataToFree ) { Assert( !request.pfnAlloc ); -#if defined( OSX ) || defined( LINUX ) +#if defined( OSX ) || defined( LINUX ) || defined(BSD) // The ugly delete[] (void*) method generates a compile warning on osx, as it should. free( pDataToFree ); #else diff --git a/filesystem/filesystem_stdio.cpp b/filesystem/filesystem_stdio.cpp index 3bb7c5b5..dcb9ad9d 100644 --- a/filesystem/filesystem_stdio.cpp +++ b/filesystem/filesystem_stdio.cpp @@ -579,7 +579,7 @@ int CFileSystem_Stdio::FS_chmod( const char *pathT, int pmode ) CBaseFileSystem::FixUpPath ( pathT, path, sizeof( path ) ); int rt = _chmod( path, pmode ); -#if defined(LINUX) +#if defined(LINUX) || defined(BSD) if (rt==-1) { char caseFixedName[ MAX_PATH ]; @@ -707,7 +707,7 @@ int CFileSystem_Stdio::FS_stat( const char *pathT, struct _stat *buf, bool *pbLo } #endif // defined(_WIN32) && defined(FILESYSTEM_MSVC2015_STAT_BUG_WORKAROUND) -#if defined(LINUX) +#if defined(LINUX) || defined(BSD) if ( rt == -1 ) { char caseFixedName[ MAX_PATH ]; @@ -866,7 +866,7 @@ CStdioFile *CStdioFile::FS_fopen( const char *filenameT, const char *options, in } } -#if defined(LINUX) +#if defined(LINUX) || defined(BSD) if(!pFile && !strchr(options,'w') && !strchr(options,'+') ) // try opening the lower cased version { char caseFixedName[ MAX_PATH ]; diff --git a/gameui/BasePanel.cpp b/gameui/BasePanel.cpp index 3a00f666..a79e9d70 100644 --- a/gameui/BasePanel.cpp +++ b/gameui/BasePanel.cpp @@ -1130,7 +1130,7 @@ void CBasePanel::UpdateBackgroundState() vgui::GetAnimationController()->RunAnimationCommand( m_pGameLogo, "alpha", targetTitleAlpha, 0.0f, duration, AnimationController::INTERPOLATOR_LINEAR ); } - // Msg( "animating title (%d => %d at time %.2f)\n", m_pGameMenuButton->GetAlpha(), (int)targetTitleAlpha, engine->Time()); + // Msg( "animating title (%d => %d at time %.2f)\n", m_pGameMenuButtons[0]->GetAlpha(), (int)targetTitleAlpha, engine->Time()); for ( i=0; iRunAnimationCommand( m_pGameMenuButtons[i], "alpha", targetTitleAlpha, 0.0f, duration, AnimationController::INTERPOLATOR_LINEAR ); @@ -1650,7 +1650,7 @@ void CBasePanel::PerformLayout() for ( int i=0; iSizeToContents(); //vgui::surface()->GetTextSize( m_pGameMenuButtons[i]->GetFont(), ModInfo().GetGameTitle(), textWide, textTall ); @@ -2220,7 +2220,7 @@ void CBasePanel::RunMenuCommand(const char *command) RegCloseKey(hKey); } -#elif defined( OSX ) || defined( LINUX ) +#elif defined( OSX ) || defined( LINUX ) || defined(BSD) FILE *fp = fopen( "/tmp/hl2_relaunch", "w+" ); if ( fp ) { diff --git a/gameui/VGuiSystemModuleLoader.cpp b/gameui/VGuiSystemModuleLoader.cpp index 80781005..003cdbd7 100644 --- a/gameui/VGuiSystemModuleLoader.cpp +++ b/gameui/VGuiSystemModuleLoader.cpp @@ -161,7 +161,7 @@ bool CVGuiSystemModuleLoader::LoadPlatformModules(CreateInterfaceFn *factorylist { dllPath = it->GetString("dll_osx"); } - else if ( IsLinux() ) + else if ( IsLinux() || IsBSD() ) { dllPath = it->GetString("dll_linux"); } diff --git a/ivp b/ivp index 42823131..2306a253 160000 --- a/ivp +++ b/ivp @@ -1 +1 @@ -Subproject commit 428231315f701259387d0720170b05c23263ff4c +Subproject commit 2306a2531691b46f739cb0b587c1f3527c7b1c11 diff --git a/launcher/launcher.cpp b/launcher/launcher.cpp index 1a5285a9..a5314c5b 100644 --- a/launcher/launcher.cpp +++ b/launcher/launcher.cpp @@ -10,7 +10,7 @@ #include #include "shlwapi.h" // registry stuff #include -#elif defined ( LINUX ) || defined( OSX ) +#elif defined(POSIX) #define O_EXLOCK 0 #include #include @@ -205,7 +205,7 @@ class CVCRHelpers : public IVCRHelpers public: virtual void ErrorMessage( const char *pMsg ) { -#if defined( WIN32 ) || defined( LINUX ) +#if defined( WIN32 ) || defined( LINUX ) || defined(BSD) NOVCR( ::MessageBox( NULL, pMsg, "VCR Error", MB_OK ) ); #endif } @@ -950,7 +950,7 @@ bool GrabSourceMutex() #ifdef ANDROID return true; -#elif defined (LINUX) +#elif defined (LINUX) || defined(BSD) /* * Linux */ @@ -1198,7 +1198,7 @@ DLL_EXPORT int LauncherMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR DLL_EXPORT int LauncherMain( int argc, char **argv ) #endif { -#if defined LINUX && !defined ANDROID +#if (defined(LINUX) || defined(BSD)) && !defined ANDROID // Temporary fix to stop us from crashing in printf/sscanf functions that don't expect // localization to mess with your "." and "," float seperators. Mac OSX also sets LANG // to en_US.UTF-8 before starting up (in info.plist I believe). @@ -1225,7 +1225,7 @@ DLL_EXPORT int LauncherMain( int argc, char **argv ) Msg("SDL version: %d.%d.%d rev: %s\n", (int)ver.major, (int)ver.minor, (int)ver.patch, SDL_GetRevision()); #endif -#if defined LINUX && defined USE_SDL && defined TOGLES && !defined ANDROID +#if (defined LINUX || defined BSD) && defined USE_SDL && defined TOGLES && !defined ANDROID SDL_SetHint(SDL_HINT_VIDEO_X11_FORCE_EGL, "1"); #endif @@ -1247,12 +1247,6 @@ DLL_EXPORT int LauncherMain( int argc, char **argv ) // Hook the debug output stuff. SpewOutputFunc( LauncherDefaultSpewFunc ); - if ( 0 && IsWin98OrOlder() ) - { - Error( "This build does not currently run under Windows 98/Me." ); - return -1; - } - // Quickly check the hardware key, essentially a warning shot. if ( !Plat_VerifyHardwareKeyPrompt() ) { @@ -1559,7 +1553,7 @@ DLL_EXPORT int LauncherMain( int argc, char **argv ) RegCloseKey(hKey); } -#elif defined( OSX ) || defined( LINUX ) +#elif defined( OSX ) || defined( LINUX ) || defined(BSD) struct stat st; if ( stat( RELAUNCH_FILE, &st ) == 0 ) { @@ -1576,7 +1570,7 @@ DLL_EXPORT int LauncherMain( int argc, char **argv ) } szCmd[nChars] = 0; char szOpenLine[ MAX_PATH ]; - #if defined( LINUX ) + #if defined( LINUX ) || defined(BSD) Q_snprintf( szOpenLine, sizeof(szOpenLine), "xdg-open \"%s\"", szCmd ); #else Q_snprintf( szOpenLine, sizeof(szOpenLine), "open \"%s\"", szCmd ); diff --git a/materialsystem/stdshaders/occlusion_dx9.cpp b/materialsystem/stdshaders/occlusion_dx9.cpp index 62e7e9d9..76928713 100644 --- a/materialsystem/stdshaders/occlusion_dx9.cpp +++ b/materialsystem/stdshaders/occlusion_dx9.cpp @@ -59,7 +59,7 @@ BEGIN_VS_SHADER_FLAGS( Occlusion_DX9, "Help for Occlusion", SHADER_NOT_EDITABLE SET_STATIC_PIXEL_SHADER( white_ps20 ); // Workaround for weird AMD bug - if sRGB write isn't enabled here then sRGB write enable in subsequent world rendering passes will randomly not take effect (even though we're enabling it) in the driver. - if ( ( IsLinux() || IsWindows() ) && gl_amd_occlusion_workaround.GetBool() ) + if ( ( IsLinux() || IsWindows() || IsBSD() ) && gl_amd_occlusion_workaround.GetBool() ) { pShaderShadow->EnableSRGBWrite( true ); } diff --git a/mathlib/3dnow.cpp b/mathlib/3dnow.cpp index a37d9bdd..88e4ead7 100644 --- a/mathlib/3dnow.cpp +++ b/mathlib/3dnow.cpp @@ -16,7 +16,7 @@ // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" -#if !defined(COMPILER_MSVC64) && !defined(LINUX) && !defined(OSX) +#if !defined(COMPILER_MSVC64) && !defined(LINUX) && !defined(COMPILER_CLANG) // Implement for 64-bit Windows if needed. // Clang hits "fatal error: error in backend:" and other errors when trying // to compile the inline assembly below. 3DNow support is highly unlikely to @@ -102,7 +102,7 @@ float FASTCALL _3DNow_VectorNormalize (Vector& vec) movd radius, mm1 femms } -#elif LINUX +#elif LINUX long long a,c; int b,d; memcpy(&a,&vec[0],sizeof(a)); diff --git a/mathlib/mathlib_base.cpp b/mathlib/mathlib_base.cpp index 64069a7b..d8901a05 100644 --- a/mathlib/mathlib_base.cpp +++ b/mathlib/mathlib_base.cpp @@ -3343,7 +3343,7 @@ void MathLib_Init( float gamma, float texGamma, float brightness, int overbright // SSE Generally performs better than 3DNow when present, so this is placed // first to allow SSE to override these settings. -#if !defined( OSX ) && !defined( PLATFORM_WINDOWS_PC64 ) && !defined(LINUX) +#if !defined( OSX ) && !defined( PLATFORM_WINDOWS_PC64 ) && !defined(LINUX) && !defined(BSD) if ( bAllow3DNow && pi.m_b3DNow ) { s_b3DNowEnabled = true; diff --git a/public/appframework/AppFramework.h b/public/appframework/AppFramework.h index 185d2f33..849ac8e6 100644 --- a/public/appframework/AppFramework.h +++ b/public/appframework/AppFramework.h @@ -61,7 +61,7 @@ void AppShutdown( CAppSystemGroup *pAppSystemGroup ); extern int ValveCocoaMain( int argc, char **argv, CAppSystemGroup *pAppSystemGroup ); \ return ValveCocoaMain( argc, argv, &_globalVarName ); \ } -#elif defined( LINUX ) +#elif defined( LINUX ) || defined(BSD) #define DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR( _globalVarName ) \ int main( int argc, char **argv ) \ { \ diff --git a/public/appframework/ilaunchermgr.h b/public/appframework/ilaunchermgr.h index bafa67cb..e65ece3d 100644 --- a/public/appframework/ilaunchermgr.h +++ b/public/appframework/ilaunchermgr.h @@ -52,7 +52,7 @@ public: // Get the next N events. The function returns the number of events that were filled into your array. virtual int GetEvents( CCocoaEvent *pEvents, int nMaxEventsToReturn, bool debugEvents = false ) = 0; -#ifdef LINUX +#if defined(LINUX) || defined(BSD) virtual int PeekAndRemoveKeyboardEvents( bool *pbEsc, bool *pbReturn, bool *pbSpace, bool debugEvents = false ) = 0; #endif diff --git a/public/tier0/basetypes.h b/public/tier0/basetypes.h index e883e1ca..0e67c9fa 100644 --- a/public/tier0/basetypes.h +++ b/public/tier0/basetypes.h @@ -39,11 +39,13 @@ #endif // stdio.h -#ifndef NULL +#if !defined(NULL) || defined(__FreeBSD__) +#ifdef NULL +# undef NULL +#endif #define NULL 0 #endif - #ifdef POSIX #include #endif diff --git a/public/tier0/platform.h b/public/tier0/platform.h index 2ae632b8..03197725 100644 --- a/public/tier0/platform.h +++ b/public/tier0/platform.h @@ -64,7 +64,11 @@ #ifdef POSIX // need this for _alloca -#include +# ifdef BSD +# define va_list __va_list +# else +# include +# endif #include #include #include @@ -104,6 +108,7 @@ #define IsLinux() false #define IsOSX() false #define IsPosix() false + #define IsBSD() false #define PLATFORM_WINDOWS 1 // Windows PC or Xbox 360 #ifndef _X360 #define IsWindows() true @@ -156,7 +161,13 @@ #else #define IsOSX() false #endif - + + #ifdef BSD + #define IsBSD() true + #else + #define IsBSD() false + #endif + #define IsPosix() true #define IsPlatformOpenGL() true #else @@ -439,20 +450,20 @@ typedef void * HINSTANCE; #else // On OSX, SIGTRAP doesn't really stop the thread cold when debugging. // So if being debugged, use INT3 which is precise. -#ifdef OSX -#if defined(__arm__) || defined(__aarch64__) -#ifdef __clang__ -#define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __builtin_debugtrap(); } else { raise(SIGTRAP); } } while(0) -#elif defined __GNUC__ -#define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __builtin_trap(); } else { raise(SIGTRAP); } } while(0) -#else -#define DebuggerBreak() raise(SIGTRAP) -#endif -#else -#define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __asm ( "int $3" ); } else { raise(SIGTRAP); } } while(0) -#endif +#if defined(OSX) || defined(BSD) +# if defined(__arm__) || defined(__aarch64__) +# ifdef __clang__ +# define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __builtin_debugtrap(); } else { raise(SIGTRAP); } } while(0) +# elif defined __GNUC__ +# define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __builtin_trap(); } else { raise(SIGTRAP); } } while(0) +# else +# define DebuggerBreak() raise(SIGTRAP) +# endif +# else +# define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __asm ( "int $3" ); } else { raise(SIGTRAP); } } while(0) +# endif #else -#define DebuggerBreak() raise(SIGTRAP) +# define DebuggerBreak() raise(SIGTRAP) #endif #endif #define DebuggerBreakIfDebugging() if ( !Plat_IsInDebugSession() ) ; else DebuggerBreak() @@ -550,7 +561,7 @@ typedef void * HINSTANCE; //----------------------------------------------------------------------------- #if defined( GNUC ) #define stackalloc( _size ) alloca( ALIGN_VALUE( _size, 16 ) ) -#ifdef _LINUX +#if defined(_LINUX) || defined(BSD) #define mallocsize( _p ) ( malloc_usable_size( _p ) ) #elif defined(OSX) #define mallocsize( _p ) ( malloc_size( _p ) ) @@ -1377,10 +1388,11 @@ PLATFORM_INTERFACE void* Plat_SimpleLog( const tchar* file, int line ); //----------------------------------------------------------------------------- // Returns true if debugger attached, false otherwise //----------------------------------------------------------------------------- -#if defined(_WIN32) || defined(LINUX) || defined(OSX) +#if defined(_WIN32) || defined(LINUX) || defined(OSX) || defined(BSD) PLATFORM_INTERFACE bool Plat_IsInDebugSession(); PLATFORM_INTERFACE void Plat_DebugString( const char * ); #else +#warning "Plat_IsInDebugSession isn't working properly" inline bool Plat_IsInDebugSession( bool bForceRecheck = false ) { return false; } #define Plat_DebugString(s) ((void)0) #endif diff --git a/public/tier0/threadtools.h b/public/tier0/threadtools.h index a73554be..6dff8b43 100644 --- a/public/tier0/threadtools.h +++ b/public/tier0/threadtools.h @@ -285,7 +285,7 @@ PLATFORM_INTERFACE void ThreadSetAffinity( ThreadHandle_t hThread, int nAffinity #error Every platform needs to define ThreadMemoryBarrier to at least prevent compiler reordering #endif -#if defined( _LINUX ) || defined( _OSX ) +#if defined( _LINUX ) || defined( _OSX ) || defined(BSD) #define USE_INTRINSIC_INTERLOCKED // linux implementation inline int32 ThreadInterlockedIncrement( int32 volatile *p ) @@ -486,7 +486,7 @@ PLATFORM_INTERFACE void ThreadNotifySyncReleasing(void *p); #ifndef NO_THREAD_LOCAL -#if defined(WIN32) || defined(OSX) || defined( _PS3 ) || ( defined (_LINUX) ) +#if defined(WIN32) || defined(OSX) || defined( _PS3 ) || ( defined (_LINUX) ) || defined(BSD) #ifndef __AFXTLS_H__ // not compatible with some Windows headers #if defined(_PS3) diff --git a/public/tier1/interface.h b/public/tier1/interface.h index 5453f67d..09b24caf 100644 --- a/public/tier1/interface.h +++ b/public/tier1/interface.h @@ -36,7 +36,7 @@ #pragma once #endif -#ifdef _LINUX +#if defined(_LINUX) || defined(BSD) #include // dlopen,dlclose, et al #include diff --git a/scripts/waifulib/compiler_optimizations.py b/scripts/waifulib/compiler_optimizations.py index c2a6841d..73de2120 100644 --- a/scripts/waifulib/compiler_optimizations.py +++ b/scripts/waifulib/compiler_optimizations.py @@ -50,7 +50,7 @@ CFLAGS = { # disable thread-safe local static initialization for C++11 code, as it cause crashes on Windows XP 'msvc': ['/D_USING_V110_SDK71_', '/Zi', '/FS', '/Zc:threadSafeInit-'], 'clang': ['-fno-strict-aliasing', '-fvisibility=hidden'], - 'gcc': ['-g0', '-fno-strict-aliasing', '-fvisibility=hidden'], + 'gcc': ['-fno-strict-aliasing', '-fvisibility=hidden'], 'owcc': ['-fno-short-enum', '-ffloat-store', '-g0'] }, 'fast': { @@ -73,7 +73,7 @@ CFLAGS = { 'debug': { 'msvc': ['/Od', '/MTd'], 'owcc': ['-g', '-O0', '-fno-omit-frame-pointer', '-funwind-tables', '-fno-omit-leaf-frame-pointer'], - 'default': ['-g', '-O0'] #, '-ftree-vectorize', '-ffast-math', '-fno-tree-partial-pre'] + 'default': ['-g', '-O0'] #, '-ftree-vectorize', '-ffast-math'] }, 'sanitize': { 'msvc': ['/Od', '/RTC1', '/MT'], diff --git a/serverbrowser/ServerBrowserDialog.cpp b/serverbrowser/ServerBrowserDialog.cpp index 3faf2d14..b13f9cd8 100644 --- a/serverbrowser/ServerBrowserDialog.cpp +++ b/serverbrowser/ServerBrowserDialog.cpp @@ -25,7 +25,7 @@ #define WIN32_LEAN_AND_MEAN #include #endif -#ifdef LINUX +#if defined(LINUX) || defined(BSD) #include #endif diff --git a/tier0/cpu.cpp b/tier0/cpu.cpp index f5c29fda..f997ffb0 100644 --- a/tier0/cpu.cpp +++ b/tier0/cpu.cpp @@ -11,7 +11,7 @@ #include #elif defined(_LINUX) #include -#elif defined(OSX) +#elif defined(OSX) || defined(BSD) #include #endif @@ -273,7 +273,7 @@ bool CheckSSE4aTechnology( void ) static bool Check3DNowTechnology(void) { -#if defined( _X360 ) || defined( _PS3 ) || defined (__arm__) || defined(__SANITIZE_ADDRESS__) +#if defined( _X360 ) || defined( _PS3 ) || defined (__arm__) || defined(__SANITIZE_ADDRESS__) || (defined(BSD) && defined(COMPILER_CLANG)) return false; #else uint32 eax, unused; @@ -448,7 +448,9 @@ uint64 CalculateCPUFreq(); // from cpu_linux.cpp static int64 CalculateClockSpeed() { #if defined( _WIN32 ) -#if !defined( _X360 ) +#if defined( _X360 ) + return 3200000000LL; +#else LARGE_INTEGER waitTime, startCount, curCount; CCycleCount start, end; @@ -476,15 +478,14 @@ static int64 CalculateClockSpeed() freq = 2000000000; } return freq; - -#else - return 3200000000LL; #endif +#elif defined(BSD) + return CalculateCPUFreq() * 1000000.0f; #elif defined(POSIX) int64 freq =(int64)CalculateCPUFreq(); if ( freq == 0 ) // couldn't calculate clock speed { - Error( "Unable to determine CPU Frequency\n" ); + Warning( "Unable to determine CPU Frequency\n" ); } return freq; #endif @@ -583,7 +584,7 @@ const CPUInformation* GetCPUInformation() pi.m_nLogicalProcessors = 1; Assert( !"couldn't read cpu information from /proc/cpuinfo" ); } -#elif defined(OSX) +#elif defined(OSX) || defined(BSD) int mib[2], num_cpu = 1; size_t len; mib[0] = CTL_HW; diff --git a/tier0/cpu_posix.cpp b/tier0/cpu_posix.cpp index 14fde7ee..f47444fb 100644 --- a/tier0/cpu_posix.cpp +++ b/tier0/cpu_posix.cpp @@ -11,6 +11,11 @@ #include #else #include +# ifdef __APPLE__ +# define CPUFREQ_SYSCTL "hw.cpufrequency_max" +# else +# define CPUFREQ_SYSCTL "dev.cpu.0.freq" +# endif #endif #include #include @@ -46,18 +51,15 @@ static inline uint64 diff(uint64 v1, uint64 v2) return -d; } -#ifdef OSX +#if defined(OSX) || defined(BSD) -// Mac +// Mac or BSD uint64 GetCPUFreqFromPROC() { - int mib[2] = {CTL_HW, HW_CPU_FREQ}; - uint64 frequency = 0; - size_t len = sizeof(frequency); - - if (sysctl(mib, 2, &frequency, &len, NULL, 0) == -1) - return 0; - return frequency; + uint64 freq_hz = 0; + size_t freq_size = sizeof(freq_hz); + int retval = sysctlbyname(CPUFREQ_SYSCTL, &freq_hz, &freq_size, NULL, 0); + return freq_hz; } #else @@ -99,14 +101,8 @@ uint64 GetCPUFreqFromPROC() uint64 CalculateCPUFreq() { -#ifdef __APPLE__ - uint64 freq_hz = 0; - size_t freq_size = sizeof(freq_hz); - int retval = sysctlbyname("hw.cpufrequency_max", &freq_hz, &freq_size, NULL, 0); - // MoeMod : TODO dont know how to get freq on Apple Silicon - if(!freq_hz) - freq_hz = 3200000000; - return freq_hz; +#if defined(__APPLE__) || defined(BSD) + return GetCPUFreqFromPROC(); #else // Try to open cpuinfo_max_freq. If the kernel was built with cpu scaling support disabled, this will fail. FILE *fp = fopen( "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq", "r" ); @@ -127,9 +123,9 @@ uint64 CalculateCPUFreq() return retVal * 1000; } } -#endif #if !defined(__arm__) && !defined(__aarch64__) + // fallback mechanism to calculate when failed // Compute the period. Loop until we get 3 consecutive periods that // are the same to within a small error. The error is chosen // to be +/- 0.02% on a P-200. @@ -179,7 +175,10 @@ uint64 CalculateCPUFreq() } return period; -#endif +#else + // ARM hard-coded frequency return (uint64)2000000000; +#endif // if !ARM +#endif // if APPLE } diff --git a/tier0/platform_posix.cpp b/tier0/platform_posix.cpp index dbfaf36e..ee930b90 100644 --- a/tier0/platform_posix.cpp +++ b/tier0/platform_posix.cpp @@ -16,12 +16,17 @@ #include #include -#ifdef OSX -#include -#include +#if defined(OSX) || defined(BSD) +# ifdef BSD +# include +# include +# else +# include +# include +# endif #include -#include #include +#include #include #endif #ifdef LINUX @@ -436,41 +441,29 @@ PLATFORM_INTERFACE void Plat_SetAllocErrorFn( Plat_AllocErrorFn fn ) #endif // !NO_HOOK_MALLOC -#if defined( OSX ) +#if defined( OSX ) || defined(BSD) // From the Apple tech note: http://developer.apple.com/library/mac/#qa/qa1361/_index.html bool Plat_IsInDebugSession() { + static int s_IsInDebugSession; int junk; - int mib[4]; struct kinfo_proc info; size_t size; - static int s_IsInDebugSession = -1; - - if ( s_IsInDebugSession == -1 ) - { - // Initialize the flags so that, if sysctl fails for some bizarre - // reason, we get a predictable result. - - info.kp_proc.p_flag = 0; - - // Initialize mib, which tells sysctl the info we want, in this case - // we're looking for information about a specific process ID. - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - // Call sysctl. - - size = sizeof(info); - junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; +#ifndef BSD + info.kp_proc.p_flag = 0; +#endif - // We're being debugged if the P_TRACED flag is set. + size = sizeof(info); + junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); - s_IsInDebugSession = ( (info.kp_proc.p_flag & P_TRACED) != 0 ); - } + // We're being debugged if the P_TRACED flag is set. +#ifdef BSD + s_IsInDebugSession = info.ki_flag & P_TRACED; +#else + s_IsInDebugSession = info.kp_proc.p_flag & P_TRACED; +#endif return !!s_IsInDebugSession; } @@ -509,7 +502,6 @@ bool Plat_IsInDebugSession() return ( tracerpid > 0 ); } - #endif // defined( LINUX ) void Plat_DebugString( const char * psz ) @@ -567,7 +559,7 @@ PLATFORM_INTERFACE const char *Plat_GetCommandLineA() PLATFORM_INTERFACE bool GetMemoryInformation( MemoryInformation *pOutMemoryInfo ) { - #if defined( LINUX ) || defined( OSX ) + #if defined( LINUX ) || defined( OSX ) || defined(BSD) return false; #else #error "Need to fill out GetMemoryInformation or at least return false for this platform" @@ -579,7 +571,7 @@ PLATFORM_INTERFACE bool Is64BitOS() { #if defined OSX return true; -#elif defined LINUX +#elif defined(LINUX) || defined(BSD) FILE *pp = popen( "uname -m", "r" ); if ( pp != NULL ) { @@ -789,7 +781,7 @@ static void InstallHooks( void ) __realloc_hook = ReallocHook; } -#elif OSX +#elif OSX || BSD static void RemoveHooks( void ) diff --git a/tier0/threadtools.cpp b/tier0/threadtools.cpp index 46e18298..5ae40007 100644 --- a/tier0/threadtools.cpp +++ b/tier0/threadtools.cpp @@ -43,6 +43,11 @@ #define OS_TO_PTHREAD(x) pthread_from_mach_thread_np( x ) #endif // !OSX +#ifdef BSD +# undef OS_TO_PTRHEAD +# define OS_TO_PTHREAD(x) (pthread_t)(x) +#endif + #endif #ifndef _PS3 @@ -1680,7 +1685,7 @@ bool CThreadFullMutex::Release() // //----------------------------------------------------------------------------- -#if defined( WIN32 ) || defined( _PS3 ) || defined( _OSX ) || defined (_LINUX) +#if defined( WIN32 ) || defined( _PS3 ) || defined( _OSX ) || defined (_LINUX) || defined(BSD) #if !defined(_PS3) namespace GenericThreadLocals { diff --git a/tier1/KeyValues.cpp b/tier1/KeyValues.cpp index 9218874d..8e855a78 100644 --- a/tier1/KeyValues.cpp +++ b/tier1/KeyValues.cpp @@ -2211,7 +2211,7 @@ bool EvaluateConditional( const char *str ) return bNot; if ( Q_stristr( str, "$LINUX" ) ) - return (IsLinux() || IsOSX()) ^ bNot; + return ( IsLinux() || IsBSD() || IsOSX() ) ^ bNot; if ( Q_stristr( str, "$POSIX" ) ) return IsPosix() ^ bNot; diff --git a/tier1/strtools.cpp b/tier1/strtools.cpp index 7489654c..e4d40fd3 100644 --- a/tier1/strtools.cpp +++ b/tier1/strtools.cpp @@ -2953,7 +2953,7 @@ extern "C" void qsort_s( void *base, size_t num, size_t width, int (*compare )(v void V_qsort_s( void *base, size_t num, size_t width, int ( __cdecl *compare )(void *, const void *, const void *), void * context ) { -#if defined OSX +#if defined(OSX) || defined(BSD) // the arguments are swapped 'round on the mac - awesome, huh? return qsort_r( base, num, width, context, compare ); #else diff --git a/togl/linuxwin/dxabstract.cpp b/togl/linuxwin/dxabstract.cpp index e637cf1e..b0f890db 100644 --- a/togl/linuxwin/dxabstract.cpp +++ b/togl/linuxwin/dxabstract.cpp @@ -38,7 +38,7 @@ #include "glmgr_flush.inl" -#if defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) +#if defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) || defined(BSD) #include "appframework/ilaunchermgr.h" extern ILauncherMgr *g_pLauncherMgr; #endif diff --git a/togl/linuxwin/glentrypoints.cpp b/togl/linuxwin/glentrypoints.cpp index ef1f01ff..a2118f43 100644 --- a/togl/linuxwin/glentrypoints.cpp +++ b/togl/linuxwin/glentrypoints.cpp @@ -43,7 +43,7 @@ #include "tier1.h" #include "tier2/tier2.h" -#if defined(_LINUX) && !defined(__ANDROID__) +#if (defined(_LINUX) || defined(BSD)) && !defined(__ANDROID__) #include #endif @@ -54,7 +54,7 @@ #error #endif -#if defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) +#if defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) || defined(BSD) #include "appframework/ilaunchermgr.h" ILauncherMgr *g_pLauncherMgr = NULL; #endif diff --git a/togles/linuxwin/dxabstract.cpp b/togles/linuxwin/dxabstract.cpp index 1f22da17..a993c095 100644 --- a/togles/linuxwin/dxabstract.cpp +++ b/togles/linuxwin/dxabstract.cpp @@ -38,7 +38,7 @@ #include "glmgr_flush.inl" -#if defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) +#if defined(BSD) || defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) #include "appframework/ilaunchermgr.h" extern ILauncherMgr *g_pLauncherMgr; #endif diff --git a/togles/linuxwin/glentrypoints.cpp b/togles/linuxwin/glentrypoints.cpp index ccf920a6..6834696b 100644 --- a/togles/linuxwin/glentrypoints.cpp +++ b/togles/linuxwin/glentrypoints.cpp @@ -54,7 +54,7 @@ #error #endif -#if defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) +#if defined(BSD) || defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) #include "appframework/ilaunchermgr.h" ILauncherMgr *g_pLauncherMgr = NULL; #endif diff --git a/vgui2/src/system_posix.cpp b/vgui2/src/system_posix.cpp index 349165b2..f781805f 100644 --- a/vgui2/src/system_posix.cpp +++ b/vgui2/src/system_posix.cpp @@ -28,13 +28,15 @@ #include "vgui_key_translation.h" #include "filesystem.h" -#ifdef OSX -#include +#if defined(OSX) || defined(BSD) #include #include #elif defined(LINUX) #include #endif +#ifdef OSX +#include +#endif #ifdef USE_SDL #include "SDL_clipboard.h" @@ -290,7 +292,7 @@ void CSystem::ShellExecute(const char *command, const char *file) if ( pid == 0 ) { // Child -#ifdef LINUX +#if defined(LINUX) || defined(BSD) // Escape steam runtime if necessary const char *szSteamRuntime = getenv( "STEAM_RUNTIME" ); if ( szSteamRuntime ) @@ -585,7 +587,7 @@ int CSystem::GetAvailableDrives(char *buf, int bufLen) //----------------------------------------------------------------------------- double CSystem::GetFreeDiskSpace(const char *path) { -#if __DARWIN_ONLY_64_BIT_INO_T +#if __DARWIN_ONLY_64_BIT_INO_T || BSD // MoeMod: newer macOS only support 64bit, so no statfs64 is provided struct statfs buf; int ret = statfs( path, &buf ); diff --git a/vgui2/vgui_surfacelib/FontManager.cpp b/vgui2/vgui_surfacelib/FontManager.cpp index dd86900e..78671320 100644 --- a/vgui2/vgui_surfacelib/FontManager.cpp +++ b/vgui2/vgui_surfacelib/FontManager.cpp @@ -43,7 +43,7 @@ CFontManager::CFontManager() m_FontAmalgams.AddToTail(); m_Win32Fonts.EnsureCapacity( MAX_INITIAL_FONTS ); -#if defined(LINUX) || defined(OSX) +#ifdef POSIX FT_Error error = FT_Init_FreeType( &library ); if ( error ) Error( "Unable to initalize freetype library, is it installed?" ); @@ -75,7 +75,7 @@ CFontManager::~CFontManager() { ClearAllFonts(); m_FontAmalgams.RemoveAll(); -#if defined(LINUX) || defined(OSX) +#ifdef POSIX FT_Done_FreeType( library ); #endif } @@ -280,7 +280,7 @@ font_t *CFontManager::CreateOrFindWin32Font(const char *windowsFontName, int tal i = m_Win32Fonts.AddToTail(); m_Win32Fonts[i] = NULL; -#if defined(LINUX) || defined(OSX) +#ifdef POSIX int memSize = 0; void *pchFontData = m_pFontDataHelper( windowsFontName, memSize, NULL ); @@ -584,7 +584,7 @@ FallbackFont_t g_FallbackFonts[] = { NULL, "Monaco" } // every other font falls back to this }; -#elif defined(LINUX) +#elif defined(LINUX) || defined(BSD) static const char *g_szValidAsianFonts[] = { "Marlett", "WenQuanYi Zen Hei", "unifont", NULL }; // list of how fonts fallback @@ -649,7 +649,7 @@ const char *CFontManager::GetForeignFallbackFontName() return "Tahoma"; #elif defined(OSX) return "Helvetica"; -#elif defined(LINUX) +#elif defined(LINUX) || defined(BSD) return "WenQuanYi Zen Hei"; #elif defined(_PS3) return "Tahoma"; @@ -750,7 +750,7 @@ void CFontManager::GetKernedCharWidth( vgui::HFont font, wchar_t ch, wchar_t chB if ( m_FontAmalgams[font].GetFontForChar( chAfter ) != pFont ) chAfter = 0; -#if defined(LINUX) || defined(OSX) +#ifdef POSIX pFont->GetKernedCharWidth( ch, chBefore, chAfter, wide, flabcA, flabcC ); #else pFont->GetKernedCharWidth( ch, chBefore, chAfter, wide, flabcA ); diff --git a/vgui2/vgui_surfacelib/wscript b/vgui2/vgui_surfacelib/wscript index d93032bf..c469a336 100644 --- a/vgui2/vgui_surfacelib/wscript +++ b/vgui2/vgui_surfacelib/wscript @@ -39,7 +39,7 @@ def build(bld): '../../public/tier0', '../../public/tier1', '../../common', - ] + bld.env.INCLUDES_FT2 + ] + bld.env.INCLUDES_FC + bld.env.INCLUDES_FT2 defines = [] diff --git a/vguimatsurface/FontTextureCache.cpp b/vguimatsurface/FontTextureCache.cpp index d94e9afa..bed3726e 100644 --- a/vguimatsurface/FontTextureCache.cpp +++ b/vguimatsurface/FontTextureCache.cpp @@ -10,7 +10,7 @@ #include #elif defined( OSX ) #include -#elif defined( LINUX ) +#elif defined( LINUX ) || defined(BSD) //#error #elif defined( _X360 ) #else diff --git a/vguimatsurface/MatSystemSurface.cpp b/vguimatsurface/MatSystemSurface.cpp index 1f8d53e9..feb15010 100644 --- a/vguimatsurface/MatSystemSurface.cpp +++ b/vguimatsurface/MatSystemSurface.cpp @@ -146,7 +146,7 @@ CMatSystemSurface g_MatSystemSurface; EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CMatSystemSurface, ISurface, VGUI_SURFACE_INTERFACE_VERSION, g_MatSystemSurface ); -#if defined(LINUX) || defined(OSX) +#if defined(LINUX) || defined(OSX) || defined(BSD) CUtlDict< CMatSystemSurface::font_entry, unsigned short > CMatSystemSurface::m_FontData; #endif @@ -407,7 +407,7 @@ InitReturnVal_t CMatSystemSurface::Init( void ) FontManager().SetLanguage( "english" ); } -#if defined(LINUX) || defined(OSX) +#if defined(LINUX) || defined(OSX) || defined(BSD) FontManager().SetFontDataHelper( &CMatSystemSurface::FontDataHelper ); #endif @@ -1907,7 +1907,7 @@ bool CMatSystemSurface::AddCustomFontFile( const char *fontName, const char *fon } Assert( success ); return success; -#elif defined(LINUX) || defined(OSX) +#elif defined(LINUX) || defined(OSX) || defined(BSD) int size; if ( CMatSystemSurface::FontDataHelper( fontName, size, fontFileName ) ) @@ -1921,7 +1921,7 @@ bool CMatSystemSurface::AddCustomFontFile( const char *fontName, const char *fon #endif } -#if defined(LINUX) || defined(OSX) +#if defined(LINUX) || defined(OSX) || defined(BSD) static void RemoveSpaces( CUtlString &str ) { diff --git a/vguimatsurface/MatSystemSurface.h b/vguimatsurface/MatSystemSurface.h index 33889513..cbcc09d3 100644 --- a/vguimatsurface/MatSystemSurface.h +++ b/vguimatsurface/MatSystemSurface.h @@ -556,7 +556,7 @@ private: int m_nFullscreenViewportHeight; ITexture *m_pFullscreenRenderTarget; -#if defined(LINUX) || defined(OSX) +#if defined(LINUX) || defined(OSX) || defined(BSD) struct font_entry { void *data; diff --git a/video/videoservices.cpp b/video/videoservices.cpp index 24417c71..27e913d1 100644 --- a/video/videoservices.cpp +++ b/video/videoservices.cpp @@ -58,14 +58,14 @@ DEFINE_ENUM_BITWISE_OPERATORS( EPlatform_t ); const EPlatform_t thisPlatform = PLATFORM_XBOX_360; #elif defined( _PS3 ) const EPlatform_t thisPlatform = PLATFORM_PS3; -#elif defined ( _LINUX ) +#elif defined ( _LINUX ) || defined(BSD) const EPlatform_t thisPlatform = PLATFORM_LINUX; #else #error "UNABLE TO DETERMINE PLATFORM" #endif -#if defined( OSX ) || defined( LINUX ) +#if defined( OSX ) || defined( LINUX ) || defined(BSD) ILauncherMgr *g_pLauncherMgr = NULL; #endif @@ -1382,7 +1382,7 @@ bool CVideoCommonServices::ProcessFullScreenInput( bool &bAbortEvent, bool &bPau bool bEscPressed = ( m_bScanEsc ) ? CGEventSourceKeyState( kCGEventSourceStateCombinedSessionState, kVK_Escape ) : false; bool bReturnPressed = ( m_bScanReturn ) ? CGEventSourceKeyState( kCGEventSourceStateCombinedSessionState, kVK_Return ) : false; bool bSpacePressed = ( m_bScanSpace ) ? CGEventSourceKeyState( kCGEventSourceStateCombinedSessionState, kVK_Space ) : false; -#elif defined(LINUX) +#elif defined(LINUX) || defined(BSD) g_pLauncherMgr->PumpWindowsMessageLoop(); // Escape, return, or space stops or pauses the playback diff --git a/wscript b/wscript index 1562376a..b865a1c5 100644 --- a/wscript +++ b/wscript @@ -221,6 +221,14 @@ def define_platform(conf): '_DLL_EXT=.dylib' ]) + elif conf.env.DEST_OS in ['freebsd', 'openbsd', 'netbsd', 'dragonflybsd']: # Tested only in freebsd + conf.env.append_unique('DEFINES', [ + 'POSIX=1', '_POSIX=1', 'PLATFORM_POSIX=1', + 'GNUC', # but uses clang + 'BSD=1', + '_DLL_EXT=.so' + ]) + if conf.options.DEBUG_ENGINE: conf.env.append_unique('DEFINES', [ 'DEBUG', '_DEBUG' @@ -370,6 +378,9 @@ def configure(conf): elif conf.env.DEST_CPU in ['arm', 'aarch64']: flags += ['-fsigned-char'] + if conf.env.DEST_OS == 'freebsd': + linkflags += ['-lexecinfo'] + if conf.env.DEST_OS != 'win32': cflags += flags linkflags += flags