Skip to content

Commit 09a4127

Browse files
committed
Update c1-launcher to fix startup crashes with latest NVIDIA drivers
1 parent 91b0d19 commit 09a4127

30 files changed

+1874
-454
lines changed
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
*.h linguist-language=C++
2-
*.h.in linguist-language=C++
1+
* text=auto
2+
3+
*.h linguist-language=C++
4+
*.h.in linguist-language=C++

Code/ThirdParty/c1-launcher/CHANGELOG.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,23 @@ All notable changes to this project will be documented in this file.
33

44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
55

6-
## [Unreleased]
6+
## [v5] - 2023-11-03
7+
### Added
8+
- GPU information in the log:
9+
```
10+
Renderer initialization
11+
D3D10 Adapter: AMD Radeon RX 480 Graphics (RADV POLARIS10)
12+
D3D10 Adapter: PCI 1002:67df (rev 00)
13+
D3D10 Adapter: Dedicated video memory = 8G
14+
D3D10 Adapter: Dedicated system memory = 0
15+
D3D10 Adapter: Shared system memory = 31G
16+
```
17+
### Fixed
18+
- Crash of 64-bit DX10 renderer during startup with recent nVidia GPU drivers.
19+
20+
## [v4] - 2023-09-28
21+
### Added
22+
- Workaround for missing localization files in Steam version. See `LanguageHook`.
723
### Fixed
824
- Fixed engine crash on systems with more than 32 CPU cores/threads.
925
### Changed

Code/ThirdParty/c1-launcher/CMakeLists.txt

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.15)
22

33
################################################################################
44

5-
project(C1-Launcher VERSION 3 LANGUAGES CXX RC)
5+
project(C1-Launcher VERSION 5 LANGUAGES CXX RC)
66

77
################################################################################
88

@@ -11,13 +11,10 @@ if(NOT MSVC)
1111
endif()
1212

1313
if(NOT CMAKE_MSVC_RUNTIME_LIBRARY)
14-
# detect VS2005 compiler
14+
# detect VS2005 compiler and use dynamically linked MSVC runtime library, otherwise use statically linked one
1515
if(MSVC_VERSION EQUAL 1400)
16-
# all original Crysis DLLs are dynamically linked to MSVC runtime library from VS2005
17-
# use dynamically linked MSVC runtime library to reduce size of the resulting executables
1816
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
1917
else()
20-
# use statically linked MSVC runtime library to avoid any unwanted DLL dependencies
2118
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
2219
endif()
2320
endif()
@@ -35,7 +32,6 @@ configure_file(Project.h.in ${PROJECT_BINARY_DIR}/Project.h)
3532
add_library(LauncherBase STATIC
3633
Code/CryCommon/CryGame/IGameRef.h
3734
Code/CryCommon/CryGame/IGameStartup.h
38-
Code/CryCommon/CrySystem/CryColorCode.h
3935
Code/CryCommon/CrySystem/IConsole.h
4036
Code/CryCommon/CrySystem/ILog.h
4137
Code/CryCommon/CrySystem/ISystem.cpp
@@ -56,31 +52,33 @@ add_library(LauncherBase STATIC
5652
Code/Library/PathTools.cpp
5753
Code/Library/PathTools.h
5854
Code/Library/StdFile.h
59-
Code/Library/StringTools.cpp
60-
Code/Library/StringTools.h
61-
Code/Library/StringView.cpp
55+
Code/Library/StringFormat.cpp
56+
Code/Library/StringFormat.h
6257
Code/Library/StringView.h
6358
)
6459

60+
target_link_libraries(LauncherBase PUBLIC dbghelp)
61+
6562
if(BUILD_BITS EQUAL 64)
6663
target_compile_definitions(LauncherBase PUBLIC BUILD_64BIT)
6764
endif()
6865

69-
target_compile_definitions(LauncherBase PUBLIC _CRT_SECURE_NO_WARNINGS)
70-
target_compile_options(LauncherBase PUBLIC /W3)
71-
66+
# also include PROJECT_BINARY_DIR with configured Project.h
7267
target_include_directories(LauncherBase PUBLIC Code ${PROJECT_BINARY_DIR})
7368

69+
# explicitly disable some stupid MSVC warnings
70+
target_compile_options(LauncherBase PUBLIC /D_CRT_SECURE_NO_WARNINGS /wd4351)
71+
7472
# prevent modern MSVC from enabling ASLR, which breaks Crysis DLLs, and unlock memory above 2 GB
7573
target_link_options(LauncherBase PUBLIC /DYNAMICBASE:NO /LARGEADDRESSAWARE)
7674

77-
target_link_libraries(LauncherBase PUBLIC dbghelp)
78-
7975
################################################################################
8076

8177
add_executable(CrysisVR WIN32
8278
Code/Launcher/Game/GameLauncher.cpp
8379
Code/Launcher/Game/GameLauncher.h
80+
Code/Launcher/Game/LanguageHook.cpp
81+
Code/Launcher/Game/LanguageHook.h
8482
Code/Launcher/Game/Main.cpp
8583
Code/Launcher/Game/Resources.h
8684
Resources/Launcher.manifest

Code/ThirdParty/c1-launcher/Code/CryCommon/CrySystem/IConsole.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@
44

55
#include <cstddef>
66

7+
#define CONSOLE_COLOR_BLACK "$0"
8+
#define CONSOLE_COLOR_WHITE "$1"
9+
#define CONSOLE_COLOR_BLUE "$2"
10+
#define CONSOLE_COLOR_GREEN "$3"
11+
#define CONSOLE_COLOR_RED "$4"
12+
#define CONSOLE_COLOR_CYAN "$5"
13+
#define CONSOLE_COLOR_YELLOW "$6"
14+
#define CONSOLE_COLOR_MAGENTA "$7"
15+
#define CONSOLE_COLOR_ORANGE "$8"
16+
#define CONSOLE_COLOR_GRAY "$9"
17+
718
class ICrySizer;
819
struct ICVar;
920
class ITexture;

Code/ThirdParty/c1-launcher/Code/CryCommon/CrySystem/ISystem.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ struct SSystemInitParams
6464

6565
ISystem* pSystem; // Initialized by IGameStartup::Init
6666

67-
void* pCheckFunc; // Not used
68-
void* pProtectedFunctions[10]; // Not used
67+
void* reserved[11]; // Not used
6968
};
7069

7170
/**

Code/ThirdParty/c1-launcher/Code/Launcher/CPUInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ static unsigned int GetCoreCount()
1111
{
1212
unsigned int coreCount = OS::GetLogicalProcessorCount();
1313

14+
// fix crash on systems with more than 32 logical processors
1415
if (coreCount > CPUInfo::MAX_CORE_COUNT)
1516
{
1617
coreCount = CPUInfo::MAX_CORE_COUNT;

Code/ThirdParty/c1-launcher/Code/Launcher/DedicatedServer/DedicatedServerLauncher.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ DedicatedServerLauncher::~DedicatedServerLauncher()
2828

2929
int DedicatedServerLauncher::Run()
3030
{
31-
m_params.hInstance = OS::Module::GetEXE();
31+
m_params.hInstance = OS::EXE::Get();
3232
m_params.logFileName = DEFAULT_LOG_FILE_NAME;
3333
m_params.isDedicatedServer = true;
3434

@@ -46,14 +46,14 @@ int DedicatedServerLauncher::Run()
4646

4747
void DedicatedServerLauncher::LoadEngine()
4848
{
49-
m_dlls.pCrySystem = LauncherCommon::LoadModule("CrySystem.dll");
49+
m_dlls.pCrySystem = LauncherCommon::LoadDLL("CrySystem.dll");
5050

5151
m_dlls.gameBuild = LauncherCommon::GetGameBuild(m_dlls.pCrySystem);
5252

5353
LauncherCommon::VerifyGameBuild(m_dlls.gameBuild);
5454

55-
m_dlls.pCryGame = LauncherCommon::LoadModule("CryGame.dll");
56-
m_dlls.pCryNetwork = LauncherCommon::LoadModule("CryNetwork.dll");
55+
m_dlls.pCryGame = LauncherCommon::LoadDLL("CryGame.dll");
56+
m_dlls.pCryNetwork = LauncherCommon::LoadDLL("CryNetwork.dll");
5757
}
5858

5959
void DedicatedServerLauncher::PatchEngine()
@@ -68,7 +68,7 @@ void DedicatedServerLauncher::PatchEngine()
6868

6969
if (m_dlls.pCrySystem)
7070
{
71-
MemoryPatch::CrySystem::UnhandledExceptions(m_dlls.pCrySystem, m_dlls.gameBuild);
71+
MemoryPatch::CrySystem::DisableCrashHandler(m_dlls.pCrySystem, m_dlls.gameBuild);
7272
MemoryPatch::CrySystem::HookCPUDetect(m_dlls.pCrySystem, m_dlls.gameBuild, &CPUInfo::Detect);
7373
MemoryPatch::CrySystem::HookError(m_dlls.pCrySystem, m_dlls.gameBuild, &CrashLogger::OnEngineError);
7474
}

Code/ThirdParty/c1-launcher/Code/Launcher/DedicatedServer/Main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
////////////////////////////////////////////////////////////////////////////////
1414

15-
const char* const PROJECT_BANNER = "C1-Launcher Dedicated Server " PROJECT_VERSION_STRING " " PROJECT_BUILD_BITS;
15+
const char* const PROJECT_BANNER = "C1-Launcher Dedicated Server " PROJECT_VERSION_STRING;
1616

1717
////////////////////////////////////////////////////////////////////////////////
1818

Code/ThirdParty/c1-launcher/Code/Launcher/Game/GameLauncher.cpp

Lines changed: 60 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "../MemoryPatch.h"
77

88
#include "GameLauncher.h"
9+
#include "LanguageHook.h"
10+
#include "Library/StringFormat.h"
911

1012
#include "Library/StringTools.h"
1113

@@ -16,6 +18,38 @@ static std::FILE* OpenLogFile()
1618
return LauncherCommon::OpenLogFile(DEFAULT_LOG_FILE_NAME);
1719
}
1820

21+
static void LogBytes(const char* message, std::size_t bytes)
22+
{
23+
const char* unit = "";
24+
char units[6][2] = { "K", "M", "G", "T", "P", "E" };
25+
26+
for (int i = 0; i < 6 && bytes >= 1024; i++)
27+
{
28+
unit = units[i];
29+
bytes /= 1024;
30+
}
31+
32+
CryLogAlways("%s%u%s", message, static_cast<unsigned int>(bytes), unit);
33+
}
34+
35+
static void OnD3D9Info(MemoryPatch::CryRenderD3D9::AdapterInfo* info)
36+
{
37+
CryLogAlways("D3D9 Adapter: %s", info->description);
38+
CryLogAlways("D3D9 Adapter: PCI %04x:%04x (rev %02x)", info->vendor_id, info->device_id, info->revision);
39+
40+
// no memory info available
41+
}
42+
43+
static void OnD3D10Info(MemoryPatch::CryRenderD3D10::AdapterInfo* info)
44+
{
45+
CryLogAlways("D3D10 Adapter: %ls", info->description);
46+
CryLogAlways("D3D10 Adapter: PCI %04x:%04x (rev %02x)", info->vendor_id, info->device_id, info->revision);
47+
48+
LogBytes("D3D10 Adapter: Dedicated video memory = ", info->dedicated_video_memory);
49+
LogBytes("D3D10 Adapter: Dedicated system memory = ", info->dedicated_system_memory);
50+
LogBytes("D3D10 Adapter: Shared system memory = ", info->shared_system_memory);
51+
}
52+
1953
GameLauncher::GameLauncher() : m_pGameStartup(NULL), m_params(), m_dlls()
2054
{
2155
}
@@ -30,7 +64,7 @@ GameLauncher::~GameLauncher()
3064

3165
int GameLauncher::Run()
3266
{
33-
m_params.hInstance = OS::Module::GetEXE();
67+
m_params.hInstance = OS::EXE::Get();
3468
m_params.logFileName = DEFAULT_LOG_FILE_NAME;
3569

3670
char cmdLine[2048];
@@ -50,22 +84,27 @@ int GameLauncher::Run()
5084

5185
void GameLauncher::LoadEngine()
5286
{
53-
LoadVRMod();
54-
m_dlls.pCrySystem = LauncherCommon::LoadModule("CrySystem.dll");
87+
LoadVRMod();
88+
m_dlls.pCrySystem = LauncherCommon::LoadDLL("CrySystem.dll");
5589

5690
m_dlls.gameBuild = LauncherCommon::GetGameBuild(m_dlls.pCrySystem);
5791

5892
LauncherCommon::VerifyGameBuild(m_dlls.gameBuild);
5993

60-
m_dlls.pCryGame = LauncherCommon::LoadModule("CryGame.dll");
61-
m_dlls.pCryAction = LauncherCommon::LoadModule("CryAction.dll");
62-
m_dlls.pCryNetwork = LauncherCommon::LoadModule("CryNetwork.dll");
94+
m_dlls.pCryGame = LauncherCommon::LoadDLL("CryGame.dll");
95+
m_dlls.pCryAction = LauncherCommon::LoadDLL("CryAction.dll");
96+
m_dlls.pCryNetwork = LauncherCommon::LoadDLL("CryNetwork.dll");
6397

64-
const bool isDX10 = !OS::CmdLine::HasArg("-dx9") && (OS::CmdLine::HasArg("-dx10") || OS::IsVistaOrLater());
65-
66-
if (isDX10)
98+
if (!m_params.isDedicatedServer && !OS::CmdLine::HasArg("-dedicated"))
6799
{
68-
m_dlls.pCryRenderD3D10 = LauncherCommon::LoadModule("CryRenderD3D10.dll");
100+
if (!OS::CmdLine::HasArg("-dx9") && (OS::CmdLine::HasArg("-dx10") || OS::IsVistaOrLater()))
101+
{
102+
m_dlls.pCryRenderD3D10 = LauncherCommon::LoadDLL("CryRenderD3D10.dll");
103+
}
104+
else
105+
{
106+
m_dlls.pCryRenderD3D9 = LauncherCommon::LoadDLL("CryRenderD3D9.dll");
107+
}
69108
}
70109
}
71110

@@ -100,14 +139,21 @@ void GameLauncher::PatchEngine()
100139
MemoryPatch::CrySystem::RemoveSecuROM(m_dlls.pCrySystem, m_dlls.gameBuild);
101140
MemoryPatch::CrySystem::AllowDX9VeryHighSpec(m_dlls.pCrySystem, m_dlls.gameBuild);
102141
MemoryPatch::CrySystem::AllowMultipleInstances(m_dlls.pCrySystem, m_dlls.gameBuild);
103-
MemoryPatch::CrySystem::UnhandledExceptions(m_dlls.pCrySystem, m_dlls.gameBuild);
142+
MemoryPatch::CrySystem::DisableCrashHandler(m_dlls.pCrySystem, m_dlls.gameBuild);
104143
MemoryPatch::CrySystem::HookCPUDetect(m_dlls.pCrySystem, m_dlls.gameBuild, &CPUInfo::Detect);
105144
MemoryPatch::CrySystem::HookError(m_dlls.pCrySystem, m_dlls.gameBuild, &CrashLogger::OnEngineError);
145+
MemoryPatch::CrySystem::HookLanguageInit(m_dlls.pCrySystem, m_dlls.gameBuild, &LanguageHook::OnInit);
146+
}
147+
148+
if (m_dlls.pCryRenderD3D9)
149+
{
150+
MemoryPatch::CryRenderD3D9::HookAdapterInfo(m_dlls.pCryRenderD3D9, m_dlls.gameBuild, &OnD3D9Info);
106151
}
107152

108153
if (m_dlls.pCryRenderD3D10)
109154
{
110155
MemoryPatch::CryRenderD3D10::FixLowRefreshRateBug(m_dlls.pCryRenderD3D10, m_dlls.gameBuild);
156+
MemoryPatch::CryRenderD3D10::HookAdapterInfo(m_dlls.pCryRenderD3D10, m_dlls.gameBuild, &OnD3D10Info);
111157
}
112158
}
113159

@@ -117,17 +163,17 @@ void GameLauncher::LoadVRMod()
117163
if (vrModPath.empty())
118164
vrModPath = ".";
119165
vrModPath += "\\Mods\\VRMod\\Bin64\\VRMod.dll";
120-
m_dlls.pVRMod = LauncherCommon::LoadModule(vrModPath.c_str());
166+
m_dlls.pVRMod = LauncherCommon::LoadDLL(vrModPath.c_str());
121167

122168
InitVRModD3DHooks();
123169
}
124170

125171
void GameLauncher::InitVRModD3DHooks()
126172
{
127173
typedef bool (*InitD3DHooksFn)();
128-
auto fn = (InitD3DHooksFn) OS::Module::FindSymbol(m_dlls.pVRMod, "CryVRInitD3DHooks");
174+
auto fn = (InitD3DHooksFn) OS::DLL::FindSymbol(m_dlls.pVRMod, "CryVRInitD3DHooks");
129175
if (fn == nullptr || !fn())
130176
{
131-
throw StringTools::Error("Could not initialize VR mod hooks!");
177+
throw StringFormat_Error("Could not initialize VR mod hooks!");
132178
}
133179
}

Code/ThirdParty/c1-launcher/Code/Launcher/Game/GameLauncher.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class GameLauncher
1414
void* pCryAction;
1515
void* pCryNetwork;
1616
void* pCrySystem;
17+
void* pCryRenderD3D9;
1718
void* pCryRenderD3D10;
1819
void* pVRMod;
1920

0 commit comments

Comments
 (0)