From 2765159fc61625079729c066f2a455dded2f1a67 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Mon, 4 Feb 2019 11:14:52 +0200 Subject: [PATCH 1/6] - disabled VM JIT completely on unsuported platforms --- CMakeLists.txt | 38 +++++++++++++++++++--------- src/CMakeLists.txt | 39 ++++++++++++++++++----------- src/d_dehacked.cpp | 2 ++ src/scripting/backend/vmbuilder.cpp | 2 ++ src/scripting/vm/vmframe.cpp | 14 ++++------- 5 files changed, 60 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fe812f2e4..4a3dbd3ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,9 +163,21 @@ option( NO_OPENAL "Disable OpenAL sound support" OFF ) find_package( BZip2 ) find_package( JPEG ) find_package( ZLIB ) -# find_package( asmjit ) - # no, we're not using external asmjit for now, we made too many modifications to our's. - # if the asmjit author uses our changes then we'll update this. + +include( TargetArch ) + +target_architecture(ZDOOM_TARGET_ARCH) + +if( ${ZDOOM_TARGET_ARCH} MATCHES "x86_64" ) + set( HAVE_VM_JIT ON ) +endif() + +# no, we're not using external asmjit for now, we made too many modifications to our's. +# if the asmjit author uses our changes then we'll update this. + +#if( ${HAVE_VM_JIT} ) +# find_package( asmjit ) +#endif() # GME #find_path( GME_INCLUDE_DIR gme/gme.h ) @@ -298,15 +310,17 @@ else() set( ZLIB_LIBRARY z ) endif() -if( ASMJIT_FOUND AND NOT FORCE_INTERNAL_ASMJIT ) - message( STATUS "Using system asmjit, includes found at ${ASMJIT_INCLUDE_DIR}" ) -else() - message( STATUS "Using internal asmjit" ) - set( SKIP_INSTALL_ALL TRUE ) # Avoid installing asmjit alongside zdoom - add_subdirectory( asmjit ) - set( ASMJIT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/asmjit ) - set( ASMJIT_LIBRARIES asmjit ) - set( ASMJIT_LIBRARY asmjit ) +if( ${HAVE_VM_JIT} ) + if( ASMJIT_FOUND AND NOT FORCE_INTERNAL_ASMJIT ) + message( STATUS "Using system asmjit, includes found at ${ASMJIT_INCLUDE_DIR}" ) + else() + message( STATUS "Using internal asmjit" ) + set( SKIP_INSTALL_ALL TRUE ) # Avoid installing asmjit alongside zdoom + add_subdirectory( asmjit ) + set( ASMJIT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/asmjit ) + set( ASMJIT_LIBRARIES asmjit ) + set( ASMJIT_LIBRARY asmjit ) + endif() endif() if( JPEG_FOUND AND NOT FORCE_INTERNAL_JPEG ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 73d64cf7e..78c027724 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,7 +13,6 @@ include( CheckIncludeFile ) include( CheckIncludeFiles ) include( CheckLibraryExists ) include( FindPkgConfig ) -include( TargetArch ) if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) option( NO_STRIP "Do not strip Release or MinSizeRel builds" ) @@ -33,8 +32,6 @@ if( APPLE ) option( OSX_COCOA_BACKEND "Use native Cocoa backend instead of SDL" ON ) endif() -target_architecture(ZDOOM_TARGET_ARCH) - if( ${ZDOOM_TARGET_ARCH} MATCHES "x86_64" ) set( X64 64 ) endif() @@ -460,8 +457,14 @@ add_custom_target( revision_check ALL # Libraries ZDoom needs message( STATUS "Fluid synth libs: ${FLUIDSYNTH_LIBRARIES}" ) -set( ZDOOM_LIBS ${ZDOOM_LIBS} "${ZLIB_LIBRARIES}" "${JPEG_LIBRARIES}" "${BZIP2_LIBRARIES}" "${GME_LIBRARIES}" "${ASMJIT_LIBRARIES}" "${CMAKE_DL_LIBS}" ) -include_directories( "${ZLIB_INCLUDE_DIR}" "${BZIP2_INCLUDE_DIR}" "${LZMA_INCLUDE_DIR}" "${JPEG_INCLUDE_DIR}" "${GME_INCLUDE_DIR}" "${ASMJIT_INCLUDE_DIR}" ) +set( ZDOOM_LIBS ${ZDOOM_LIBS} "${ZLIB_LIBRARIES}" "${JPEG_LIBRARIES}" "${BZIP2_LIBRARIES}" "${GME_LIBRARIES}" "${CMAKE_DL_LIBS}" ) +include_directories( "${ZLIB_INCLUDE_DIR}" "${BZIP2_INCLUDE_DIR}" "${LZMA_INCLUDE_DIR}" "${JPEG_INCLUDE_DIR}" "${GME_INCLUDE_DIR}" ) + +if( ${HAVE_VM_JIT} ) + add_definitions( -DHAVE_VM_JIT ) + include_directories( "${ASMJIT_INCLUDE_DIR}" ) + set( ZDOOM_LIBS ${ZDOOM_LIBS} "${ASMJIT_LIBRARIES}") +endif() if( SNDFILE_FOUND ) set( ZDOOM_LIBS ${ZDOOM_LIBS} "${SNDFILE_LIBRARIES}" ) @@ -800,6 +803,17 @@ set( NOT_COMPILED_SOURCE_FILES zcc-parse.h ) +set( VM_JIT_SOURCES + scripting/vm/jit.cpp + scripting/vm/jit_runtime.cpp + scripting/vm/jit_call.cpp + scripting/vm/jit_flow.cpp + scripting/vm/jit_load.cpp + scripting/vm/jit_math.cpp + scripting/vm/jit_move.cpp + scripting/vm/jit_store.cpp +) + # This is disabled for now because I cannot find a way to give the .pch file a different name. # Visual C++ 2015 seems hell-bent on only allowing one .pch file with the same name as the executable. #enable_precompiled_headers( g_pch2.h FASTMATH_PCH_SOURCES ) @@ -1176,14 +1190,6 @@ set (PCH_SOURCES scripting/decorate/thingdef_states.cpp scripting/vm/vmexec.cpp scripting/vm/vmframe.cpp - scripting/vm/jit.cpp - scripting/vm/jit_runtime.cpp - scripting/vm/jit_call.cpp - scripting/vm/jit_flow.cpp - scripting/vm/jit_load.cpp - scripting/vm/jit_math.cpp - scripting/vm/jit_move.cpp - scripting/vm/jit_store.cpp scripting/zscript/ast.cpp scripting/zscript/zcc_compile.cpp scripting/zscript/zcc_parser.cpp @@ -1258,6 +1264,12 @@ set (PCH_SOURCES events.cpp ) +if( ${HAVE_VM_JIT} ) + set( PCH_SOURCES ${PCH_SOURCES} ${VM_JIT_SOURCES} ) +else() + set( NOT_COMPILED_SOURCE_FILES ${NOT_COMPILED_SOURCE_FILES} ${VM_JIT_SOURCES} ) +endif() + enable_precompiled_headers( g_pch.h PCH_SOURCES ) add_executable( zdoom WIN32 MACOSX_BUNDLE @@ -1265,7 +1277,6 @@ add_executable( zdoom WIN32 MACOSX_BUNDLE ${NOT_COMPILED_SOURCE_FILES} __autostart.cpp ${SYSTEM_SOURCES} - ${X86_SOURCES} ${FASTMATH_SOURCES} ${PCH_SOURCES} x86.cpp diff --git a/src/d_dehacked.cpp b/src/d_dehacked.cpp index ca72aaddd..dbf98a17f 100644 --- a/src/d_dehacked.cpp +++ b/src/d_dehacked.cpp @@ -808,6 +808,7 @@ void SetDehParams(FState *state, int codepointer) } fclose(dump); } +#ifdef HAVE_VM_JIT if (Args->CheckParm("-dumpjit")) { FILE *dump = fopen("dumpjit.txt", "a"); @@ -817,6 +818,7 @@ void SetDehParams(FState *state, int codepointer) } fclose(dump); } +#endif // HAVE_VM_JIT } } diff --git a/src/scripting/backend/vmbuilder.cpp b/src/scripting/backend/vmbuilder.cpp index b10f968ef..2b3b547c5 100644 --- a/src/scripting/backend/vmbuilder.cpp +++ b/src/scripting/backend/vmbuilder.cpp @@ -922,6 +922,7 @@ void FFunctionBuildList::Build() void FFunctionBuildList::DumpJit() { +#ifdef HAVE_VM_JIT FILE *dump = fopen("dumpjit.txt", "w"); if (dump == nullptr) return; @@ -932,6 +933,7 @@ void FFunctionBuildList::DumpJit() } fclose(dump); +#endif // HAVE_VM_JIT } diff --git a/src/scripting/vm/vmframe.cpp b/src/scripting/vm/vmframe.cpp index 3a08eb450..f8916e94a 100644 --- a/src/scripting/vm/vmframe.cpp +++ b/src/scripting/vm/vmframe.cpp @@ -44,11 +44,7 @@ #include "c_cvars.h" #include "version.h" -#if (defined(_M_X64 ) || defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(__amd64 ) || defined(__amd64__ )) -#define ARCH_X64 -#endif - -#ifdef ARCH_X64 +#ifdef HAVE_VM_JIT CUSTOM_CVAR(Bool, vm_jit, true, CVAR_NOINITCALL) { Printf("You must restart " GAMENAME " for this change to take effect.\n"); @@ -56,6 +52,8 @@ CUSTOM_CVAR(Bool, vm_jit, true, CVAR_NOINITCALL) } #else CVAR(Bool, vm_jit, false, CVAR_NOINITCALL|CVAR_NOSET) +FString JitCaptureStackTrace(int framesToSkip, bool includeNativeFrames) { return FString(); } +void JitRelease() {} #endif cycle_t VMCycles[10]; @@ -282,7 +280,7 @@ static bool CanJit(VMScriptFunction *func) int VMScriptFunction::FirstScriptCall(VMFunction *func, VMValue *params, int numparams, VMReturn *ret, int numret) { -#ifdef ARCH_X64 +#ifdef HAVE_VM_JIT if (vm_jit && CanJit(static_cast(func))) { func->ScriptCall = JitCompile(static_cast(func)); @@ -290,12 +288,10 @@ int VMScriptFunction::FirstScriptCall(VMFunction *func, VMValue *params, int num func->ScriptCall = VMExec; } else +#endif // HAVE_VM_JIT { func->ScriptCall = VMExec; } -#else - func->ScriptCall = VMExec; -#endif return func->ScriptCall(func, params, numparams, ret, numret); } From 8892cb619d31975394acf12b5ff52931082789e6 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Mon, 4 Feb 2019 11:40:32 +0200 Subject: [PATCH 2/6] - disabled usage of intrinsics on non-Intel platforms --- src/CMakeLists.txt | 3 +++ src/hwrenderer/scene/hw_bsp.cpp | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 78c027724..5ea333a39 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -36,6 +36,9 @@ if( ${ZDOOM_TARGET_ARCH} MATCHES "x86_64" ) set( X64 64 ) endif() +if( X64 OR ${ZDOOM_TARGET_ARCH} MATCHES "i386" ) + add_definitions( -DARCH_IA32 ) +endif() if( NOT ZDOOM_LIBS ) set( ZDOOM_LIBS "" ) diff --git a/src/hwrenderer/scene/hw_bsp.cpp b/src/hwrenderer/scene/hw_bsp.cpp index d7f47f78e..4e6ba7132 100644 --- a/src/hwrenderer/scene/hw_bsp.cpp +++ b/src/hwrenderer/scene/hw_bsp.cpp @@ -40,7 +40,10 @@ #include "hwrenderer/scene/hw_portal.h" #include "hwrenderer/utility/hw_clock.h" #include "hwrenderer/data/flatvertices.h" + +#ifdef ARCH_IA32 #include +#endif // ARCH_IA32 CVAR(Bool, gl_multithread, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) @@ -106,6 +109,7 @@ void HWDrawInfo::WorkerThread() auto job = jobQueue.GetJob(); if (job == nullptr) { +#ifdef ARCH_IA32 // The queue is empty. But yielding would be too costly here and possibly cause further delays down the line if the thread is halted. // So instead add a few pause instructions and retry immediately. _mm_pause(); @@ -118,6 +122,7 @@ void HWDrawInfo::WorkerThread() _mm_pause(); _mm_pause(); _mm_pause(); +#endif // ARCH_IA32 } // Note that the main thread MUST have prepared the fake sectors that get used below! // This worker thread cannot prepare them itself without costly synchronization. From 7a46d6e9cda02076ad44f659976325df8994e248 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 5 Feb 2019 11:56:20 +0200 Subject: [PATCH 3/6] - fixed output of localized player's log text to console --- src/p_user.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.cpp b/src/p_user.cpp index d1e20266d..6b3e408fd 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -442,7 +442,7 @@ void player_t::SetLogText (const char *text) { // Print log text to console AddToConsole(-1, TEXTCOLOR_GOLD); - AddToConsole(-1, GStrings(LogText)); + AddToConsole(-1, GStrings(text[0] == '$' ? text + 1 : text)); AddToConsole(-1, "\n"); } } From c026b991ae5ec0f79e2226fa77247d71d9a82987 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 5 Feb 2019 11:57:18 +0200 Subject: [PATCH 4/6] - do not print initial player's log text on loading of saved game --- src/g_level.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index e1d8fc322..9b0875441 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -465,7 +465,10 @@ void G_InitNew (const char *mapname, bool bTitleLevel) ST_CreateStatusBar(bTitleLevel); setsizeneeded = true; - if (gameinfo.gametype == GAME_Strife || (SBarInfoScript[SCRIPT_CUSTOM] != NULL && SBarInfoScript[SCRIPT_CUSTOM]->GetGameType() == GAME_Strife)) + const bool setlogtext = !savegamerestore && (gameinfo.gametype == GAME_Strife + || (SBarInfoScript[SCRIPT_CUSTOM] != nullptr && SBarInfoScript[SCRIPT_CUSTOM]->GetGameType() == GAME_Strife)); + + if (setlogtext) { // Set the initial quest log text for Strife. for (i = 0; i < MAXPLAYERS; ++i) From 2f161a04d9f234bcbe2bd1acc74186408e7a2fa2 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 5 Feb 2019 11:59:21 +0200 Subject: [PATCH 5/6] - updated Travis CI configuration Added MSVC 2017 targets because AppVeyor is too slow Set Linux workers to use Ubuntu 16.04 --- .travis.yml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index d7d62ef05..375d779bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ -language: c++ -dist: trusty +language: cpp +dist: xenial branches: except: @@ -27,8 +27,6 @@ matrix: - CMAKE_OPTIONS="-DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-Wno-maybe-uninitialized" addons: apt: - sources: - - ubuntu-toolchain-r-test packages: - g++-4.9 - libsdl2-dev @@ -41,8 +39,6 @@ matrix: - CMAKE_OPTIONS="-DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-Wno-maybe-uninitialized" addons: apt: - sources: - - ubuntu-toolchain-r-test packages: - g++-5 - libsdl2-dev @@ -99,7 +95,7 @@ matrix: apt: sources: - ubuntu-toolchain-r-test - - llvm-toolchain-trusty-7 + - llvm-toolchain-xenial-7 packages: - clang-7 - libsdl2-dev @@ -110,6 +106,14 @@ matrix: - libfluidsynth-dev - libgtk-3-dev + - os: windows + env: + - CMAKE_OPTIONS="-DCMAKE_BUILD_TYPE=Release -A Win32" + + - os: windows + env: + - CMAKE_OPTIONS="-DCMAKE_BUILD_TYPE=Release -A x64" + before_install: - if [ -n "$GCC_VERSION" ]; then export CC="gcc-${GCC_VERSION}" CXX="g++-${GCC_VERSION}"; fi - if [ -n "$CLANG_VERSION" ]; then export CC="clang-${CLANG_VERSION}" CXX="clang++-${CLANG_VERSION}"; fi @@ -128,7 +132,8 @@ script: -DFORCE_INTERNAL_GME=YES \ -DPK3_QUIET_ZIPDIR=YES \ .. - - make -j2 -k + - if [[ $TRAVIS_OS_NAME == 'windows' ]]; then cmake --build . -- -m; fi + - if [[ $TRAVIS_OS_NAME != 'windows' ]]; then cmake --build . -- -j2; fi notifications: email: false From 69492b1e273f30a9bca1d0a11b41e7067d952637 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 5 Feb 2019 13:13:52 +0200 Subject: [PATCH 6/6] - fixed ambient sounds "leaking" into reverb environment Set speed of sound to 343.3 and init scale to 1 according to @kcat suggestion https://forum.zdoom.org/viewtopic.php?t=63185 https://forum.zdoom.org/viewtopic.php?t=63524 --- src/sound/oalsound.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sound/oalsound.cpp b/src/sound/oalsound.cpp index 697a7a91f..f72f1c750 100644 --- a/src/sound/oalsound.cpp +++ b/src/sound/oalsound.cpp @@ -824,12 +824,12 @@ OpenALSoundRenderer::OpenALSoundRenderer() // Speed of sound is in units per second. Presuming we want to simulate a // typical speed of sound of 343.3 meters per second, multiply it by the - // units per meter scale (32?), and set the meters per unit to the scale's + // units per meter scale (1), and set the meters per unit to the scale's // reciprocal. It's important to set these correctly for both doppler // effects and reverb. - alSpeedOfSound(343.3f * 32.0f); + alSpeedOfSound(343.3f); if(ALC.EXT_EFX) - alListenerf(AL_METERS_PER_UNIT, 1.0f/32.0f); + alListenerf(AL_METERS_PER_UNIT, 1.0f); alDistanceModel(AL_INVERSE_DISTANCE); if(AL.EXT_source_distance_model)