From cd66d0021965a487c86d9ed38ed009fa11a82b66 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 27 Oct 2025 16:48:24 +0100 Subject: [PATCH] Add checking hardware instruction set on Windows earlier on #3732 --- .../Engine/Platform/Windows/WindowsPlatform.cpp | 17 ++++++++++++----- Source/ThirdParty/tracy/client/TracyAlloc.cpp | 8 ++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Source/Engine/Platform/Windows/WindowsPlatform.cpp b/Source/Engine/Platform/Windows/WindowsPlatform.cpp index 116cb3deb..e40ae1ca7 100644 --- a/Source/Engine/Platform/Windows/WindowsPlatform.cpp +++ b/Source/Engine/Platform/Windows/WindowsPlatform.cpp @@ -543,11 +543,9 @@ void WindowsPlatform::ReleaseMutex() } } -void WindowsPlatform::PreInit(void* hInstance) +PRAGMA_DISABLE_OPTIMIZATION; +void CheckInstructionSet() { - ASSERT(hInstance); - Instance = hInstance; - #if PLATFORM_ARCH_X86 || PLATFORM_ARCH_X64 // Check the minimum vector instruction set support int32 cpuInfo[4] = { -1 }; @@ -597,10 +595,19 @@ void WindowsPlatform::PreInit(void* hInstance) { // Not supported CPU CPUBrand cpu; - Error(String::Format(TEXT("Cannot start program due to lack of CPU feature {}.\n\n{}"), missingFeature, String(cpu.Buffer))); + Platform::Error(String::Format(TEXT("Cannot start program due to lack of CPU feature {}.\n\n{}"), missingFeature, String(cpu.Buffer))); exit(-1); } #endif +} +PRAGMA_ENABLE_OPTIMIZATION; + +void WindowsPlatform::PreInit(void* hInstance) +{ + ASSERT(hInstance); + Instance = hInstance; + + CheckInstructionSet(); // Disable the process from being showing "ghosted" while not responding messages during slow tasks DisableProcessWindowsGhosting(); diff --git a/Source/ThirdParty/tracy/client/TracyAlloc.cpp b/Source/ThirdParty/tracy/client/TracyAlloc.cpp index 545a6062b..923c92494 100644 --- a/Source/ThirdParty/tracy/client/TracyAlloc.cpp +++ b/Source/ThirdParty/tracy/client/TracyAlloc.cpp @@ -6,6 +6,10 @@ #include "../common/TracyYield.hpp" +#if PLATFORM_WINDOWS +extern void CheckInstructionSet(); +#endif + namespace tracy { @@ -18,6 +22,10 @@ tracy_no_inline static void InitRpmallocPlumbing() const auto done = RpInitDone.load( std::memory_order_acquire ); if( !done ) { +#if PLATFORM_WINDOWS + // Check instruction set before executing any code (Tracy init static vars before others) + CheckInstructionSet(); +#endif int expected = 0; while( !RpInitLock.compare_exchange_weak( expected, 1, std::memory_order_release, std::memory_order_relaxed ) ) { expected = 0; YieldThread(); } const auto done = RpInitDone.load( std::memory_order_acquire );