FFmpeg-Builds/patches/vulkan/0004-Unlock-building-static-loader-on-any-OS.patch

151 lines
5.9 KiB
Diff
Raw Normal View History

2021-08-22 23:10:57 +00:00
From b6b9abf90b6f71abf9d5405745748dd991099247 Mon Sep 17 00:00:00 2001
2021-04-05 06:47:23 +00:00
From: BtbN <btbn@btbn.de>
Date: Sun, 4 Apr 2021 23:29:53 +0200
Subject: [PATCH 4/4] Unlock building static loader on any OS
Based in parts on https://github.com/shinchiro/mpv-winbuild-cmake/blob/master/packages/vulkan-0001-cross-compile-static-linking-hacks.patch
---
CMakeLists.txt | 2 --
loader/CMakeLists.txt | 23 ++++++++++++++++++++++-
loader/loader.c | 2 +-
loader/loader.h | 3 +++
loader/vk_loader_platform.h | 16 ++++++++++++++++
5 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
2021-05-30 16:30:44 +00:00
index bd01fa016..91e5652f3 100644
2021-04-05 06:47:23 +00:00
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
2021-05-30 16:30:44 +00:00
@@ -40,9 +40,7 @@ if(BUILD_TESTS)
enable_testing()
2021-04-05 06:47:23 +00:00
endif()
-if(APPLE)
option(BUILD_STATIC_LOADER "Build a loader that can be statically linked" OFF)
-endif()
if(BUILD_STATIC_LOADER)
message(WARNING "The BUILD_STATIC_LOADER option has been set. Note that this will only work on MacOS and is not supported "
diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt
2021-08-22 23:10:57 +00:00
index d35d37220..cf6c57b5e 100644
2021-04-05 06:47:23 +00:00
--- a/loader/CMakeLists.txt
+++ b/loader/CMakeLists.txt
2021-05-30 16:30:44 +00:00
@@ -224,6 +224,22 @@ if(WIN32)
2021-04-05 06:47:23 +00:00
target_compile_options(loader-opt PUBLIC ${MSVC_LOADER_COMPILE_OPTIONS})
target_include_directories(loader-opt PRIVATE "$<TARGET_PROPERTY:Vulkan::Headers,INTERFACE_INCLUDE_DIRECTORIES>")
+ if(BUILD_STATIC_LOADER)
+ add_library(vulkan
+ STATIC
+ $<TARGET_OBJECTS:loader-opt>
+ $<TARGET_OBJECTS:loader-norm>
+ $<TARGET_OBJECTS:loader-unknown-chain>
+ ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-1.def
+ ${CMAKE_CURRENT_SOURCE_DIR}/loader.rc)
+ set_target_properties(vulkan
+ PROPERTIES LINK_FLAGS_DEBUG
+ "/ignore:4098"
+ OUTPUT_NAME
+ vulkan-1
+ PREFIX
+ lib)
+ else()
add_library(vulkan
SHARED
$<TARGET_OBJECTS:loader-opt>
2021-05-30 16:30:44 +00:00
@@ -238,6 +254,8 @@ if(WIN32)
2021-07-12 14:29:31 +00:00
set_target_properties(vulkan
PROPERTIES
OUTPUT_NAME vulkan-1)
2021-04-05 06:47:23 +00:00
+ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS LOADER_DYNAMIC_LIB)
+ endif()
2021-07-12 14:29:31 +00:00
2021-04-05 06:47:23 +00:00
target_link_libraries(vulkan Vulkan::Headers)
2021-08-22 23:10:57 +00:00
@@ -260,14 +278,16 @@ else()
2021-04-05 06:47:23 +00:00
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-typedef-redefinition")
endif()
- if(APPLE AND BUILD_STATIC_LOADER)
+ if(BUILD_STATIC_LOADER)
add_library(vulkan STATIC ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS})
else()
add_library(vulkan SHARED ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS})
endif()
add_dependencies(vulkan loader_asm_gen_files)
+ if (NOT BUILD_STATIC_LOADER)
2021-08-22 23:10:57 +00:00
# set version based on VK_HEADER_VERSION used to generate the code
include(generated/loader_generated_header_version.cmake)
2021-04-05 06:47:23 +00:00
+ endif()
target_link_libraries(vulkan ${CMAKE_DL_LIBS} m)
if (NOT ANDROID)
target_link_libraries(vulkan pthread)
2021-08-22 23:10:57 +00:00
@@ -339,6 +359,7 @@ if(PKG_CONFIG_FOUND)
2021-04-05 06:47:23 +00:00
foreach(LIB ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS})
set(PRIVATE_LIBS "${PRIVATE_LIBS} -l${LIB}")
endforeach()
+ set(PRIVATE_LIBS "${PRIVATE_LIBS} -lshlwapi -lcfgmgr32")
if(WIN32)
set(VULKAN_LIB_SUFFIX "-1")
endif ()
diff --git a/loader/loader.c b/loader/loader.c
2021-08-22 23:10:57 +00:00
index d76f7dbe7..73e93fff1 100644
2021-04-05 06:47:23 +00:00
--- a/loader/loader.c
+++ b/loader/loader.c
2021-08-22 23:10:57 +00:00
@@ -7889,7 +7889,7 @@ out:
2021-04-05 06:47:23 +00:00
return result;
}
-#if defined(_WIN32)
+#if defined(_WIN32) && defined(LOADER_DYNAMIC_LIB)
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) {
switch (reason) {
case DLL_PROCESS_ATTACH:
diff --git a/loader/loader.h b/loader/loader.h
2021-08-22 23:10:57 +00:00
index fc26fcde6..43fa875e5 100644
2021-04-05 06:47:23 +00:00
--- a/loader/loader.h
+++ b/loader/loader.h
2021-08-22 23:10:57 +00:00
@@ -449,6 +449,9 @@ static inline void loader_init_dispatch(void *obj, const void *data) {
2021-04-05 06:47:23 +00:00
// Global variables used across files
extern struct loader_struct loader;
extern THREAD_LOCAL_DECL struct loader_instance *tls_instance;
+#if defined(_WIN32) && !defined(LOADER_DYNAMIC_LIB)
+extern LOADER_PLATFORM_THREAD_ONCE_DEFINITION(once_init);
+#endif
extern loader_platform_thread_mutex loader_lock;
extern loader_platform_thread_mutex loader_json_lock;
extern loader_platform_thread_mutex loader_preload_icd_lock;
diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h
2021-08-22 23:10:57 +00:00
index c1e47e4c3..2cc1d2e7c 100644
2021-04-05 06:47:23 +00:00
--- a/loader/vk_loader_platform.h
+++ b/loader/vk_loader_platform.h
2021-05-30 16:30:44 +00:00
@@ -421,9 +421,25 @@ typedef HANDLE loader_platform_thread;
2021-04-05 06:47:23 +00:00
// The once init functionality is not used when building a DLL on Windows. This is because there is no way to clean up the
// resources allocated by anything allocated by once init. This isn't a problem for static libraries, but it is for dynamic
// ones. When building a DLL, we use DllMain() instead to allow properly cleaning up resources.
+#if defined(LOADER_DYNAMIC_LIB)
#define LOADER_PLATFORM_THREAD_ONCE_DECLARATION(var)
#define LOADER_PLATFORM_THREAD_ONCE_DEFINITION(var)
#define LOADER_PLATFORM_THREAD_ONCE(ctl, func)
+#else
+#define LOADER_PLATFORM_THREAD_ONCE_DECLARATION(var) INIT_ONCE var = INIT_ONCE_STATIC_INIT;
+#define LOADER_PLATFORM_THREAD_ONCE_DEFINITION(var) INIT_ONCE var;
+#define LOADER_PLATFORM_THREAD_ONCE(ctl, func) loader_platform_thread_once_fn(ctl, func)
+static BOOL CALLBACK InitFuncWrapper(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context) {
+ void (*func)(void) = (void (*)(void))Parameter;
+ func();
+ return TRUE;
+}
+static void loader_platform_thread_once_fn(void *ctl, void (*func)(void)) {
+ assert(func != NULL);
+ assert(ctl != NULL);
+ InitOnceExecuteOnce((PINIT_ONCE)ctl, InitFuncWrapper, (void *)func, NULL);
+}
+#endif
// Thread IDs:
typedef DWORD loader_platform_thread_id;
--
2.25.1