From 44aea690d1ee60f76b395c0fd21b5cdd65fcd685 Mon Sep 17 00:00:00 2001 From: BtbN Date: Mon, 5 Apr 2021 08:47:23 +0200 Subject: [PATCH] Include Vulkan-Loader patches in repo --- images/base/Dockerfile | 3 + images/base/run_stage.sh | 2 +- ...on-MinGW-cross-compiling-environment.patch | 76 +++++++++ .../vulkan/0002-Fixes-for-MinGW-build.patch | 87 ++++++++++ ...e-appropiate-minimum-Windows-Version.patch | 28 ++++ ...ock-building-static-loader-on-any-OS.patch | 153 ++++++++++++++++++ scripts.d/45-vulkan.sh | 13 +- 7 files changed, 357 insertions(+), 5 deletions(-) create mode 100644 patches/vulkan/0001-Fix-build-on-MinGW-cross-compiling-environment.patch create mode 100644 patches/vulkan/0002-Fixes-for-MinGW-build.patch create mode 100644 patches/vulkan/0003-Define-appropiate-minimum-Windows-Version.patch create mode 100644 patches/vulkan/0004-Unlock-building-static-loader-on-any-OS.patch diff --git a/images/base/Dockerfile b/images/base/Dockerfile index a3dc6ec..3e9d850 100644 --- a/images/base/Dockerfile +++ b/images/base/Dockerfile @@ -8,6 +8,9 @@ RUN \ apt-get -y install build-essential yasm nasm pkgconf git curl wget cmake unzip subversion autoconf automake libtool autopoint cmake clang texinfo texi2html gperf gettext itstool ragel libc6-dev libssl-dev gtk-doc-tools gobject-introspection gawk meson ninja-build p7zip-full python3-distutils python3-apt python-is-python3 && \ apt-get -y clean +RUN git config --global user.email "builder@localhost" && \ + git config --global user.name "Builder" + ENV CARGO_HOME="/opt/cargo" RUSTUP_HOME="/opt/rustup" PATH="/opt/cargo/bin:${PATH}" RUN curl https://sh.rustup.rs -sSf | bash -s -- -y --no-modify-path RUN cargo install cargo-c && rm -rf "${CARGO_HOME}"/{registry,git} diff --git a/images/base/run_stage.sh b/images/base/run_stage.sh index 04876a2..d51438a 100755 --- a/images/base/run_stage.sh +++ b/images/base/run_stage.sh @@ -1,6 +1,6 @@ #!/bin/bash set -xe -mkdir /stage +mkdir -p /stage cd /stage source /stage.sh ffbuild_dockerbuild diff --git a/patches/vulkan/0001-Fix-build-on-MinGW-cross-compiling-environment.patch b/patches/vulkan/0001-Fix-build-on-MinGW-cross-compiling-environment.patch new file mode 100644 index 0000000..07792a0 --- /dev/null +++ b/patches/vulkan/0001-Fix-build-on-MinGW-cross-compiling-environment.patch @@ -0,0 +1,76 @@ +From cc0b0633e19356c45caa66c5ac18f8f49ba3e214 Mon Sep 17 00:00:00 2001 +From: Syoyo Fujita +Date: Thu, 28 May 2020 21:38:16 +0900 +Subject: [PATCH 1/4] Fix build on MinGW cross compiling environment. + +--- + loader/CMakeLists.txt | 4 +++- + loader/loader.c | 13 +++++++++++++ + loader/loader.rc | 4 ++++ + 3 files changed, 20 insertions(+), 1 deletion(-) + +diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt +index db1ad7807..04faf23cc 100644 +--- a/loader/CMakeLists.txt ++++ b/loader/CMakeLists.txt +@@ -151,7 +151,7 @@ if(WIN32) + if (USE_MASM) + enable_language(ASM_MASM) + endif () +- if(CMAKE_ASM_MASM_COMPILER_WORKS OR JWASM_FOUND) ++ if((CMAKE_ASM_MASM_COMPILER_WORKS AND NOT CMAKE_CROSSCOMPILING) OR JWASM_FOUND) + if(MINGW) + set(CMAKE_ASM_MASM_FLAGS ${CMAKE_ASM_MASM_FLAGS} ${JWASM_FLAGS}) + elseif(NOT CMAKE_CL_64 AND NOT JWASM_FOUND) +@@ -171,6 +171,8 @@ if(WIN32) + add_library(loader-unknown-chain OBJECT unknown_ext_chain.c) + target_compile_options(loader-unknown-chain PUBLIC "$<$:${LOCAL_C_FLAGS_REL}>") + target_compile_options(loader-unknown-chain PUBLIC ${MSVC_LOADER_COMPILE_OPTIONS}) ++ ++ target_include_directories(loader-unknown-chain PRIVATE "$") + endif() + elseif(APPLE) + # For MacOS, use the C code and force the compiler's tail-call optimization instead of using assembly code. +diff --git a/loader/loader.c b/loader/loader.c +index 6a60ee7bc..20790c12c 100644 +--- a/loader/loader.c ++++ b/loader/loader.c +@@ -79,6 +79,19 @@ + + typedef HRESULT (APIENTRY *PFN_CreateDXGIFactory1)(REFIID riid, void **ppFactory); + static PFN_CreateDXGIFactory1 fpCreateDXGIFactory1; ++ ++#if defined(__MINGW32__) ++// MinGW header may not have some definitions(cfgmgr32.h). ++#if !defined(CM_GETIDLIST_FILTER_CLASS) ++#define CM_GETIDLIST_FILTER_CLASS (0x200) ++#endif ++ ++#if !defined(CM_GETIDLIST_FILTER_PRESENT) ++#define CM_GETIDLIST_FILTER_PRESENT (0x100) ++#endif ++ ++#endif // __MINGW32__ ++ + #endif + + // This is a CMake generated file with #defines for any functions/includes +diff --git a/loader/loader.rc b/loader/loader.rc +index 18eb5e6c1..2a9988d00 100755 +--- a/loader/loader.rc ++++ b/loader/loader.rc +@@ -43,7 +43,11 @@ + /////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////// + ++#if defined(__MINGW32__) ++#include ++#else + #include "winres.h" ++#endif + + #define VER_FILE_VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILDNO + +-- +2.25.1 + diff --git a/patches/vulkan/0002-Fixes-for-MinGW-build.patch b/patches/vulkan/0002-Fixes-for-MinGW-build.patch new file mode 100644 index 0000000..9f79e4e --- /dev/null +++ b/patches/vulkan/0002-Fixes-for-MinGW-build.patch @@ -0,0 +1,87 @@ +From 1733181194d4f356e599a748c6d8c5009541604f Mon Sep 17 00:00:00 2001 +From: BtbN +Date: Mon, 7 Sep 2020 20:07:39 +0200 +Subject: [PATCH 2/4] Fixes for MinGW build + +Adapted from https://github.com/msys2/MINGW-packages/blob/348f1d46d9d273a2cc928deadf9d9114f7a69c2f/mingw-w64-vulkan-loader/002-proper-def-files-for-32bit.patch +--- + loader/CMakeLists.txt | 6 ++++-- + loader/loader.h | 4 +++- + tests/layers/vk_format_utils.h | 4 +++- + 3 files changed, 10 insertions(+), 4 deletions(-) + +diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt +index 04faf23cc..b5f90393d 100644 +--- a/loader/CMakeLists.txt ++++ b/loader/CMakeLists.txt +@@ -67,6 +67,7 @@ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG") + + if(WIN32) + # Use static MSVCRT libraries ++ if(MSVC) + foreach(configuration + in + CMAKE_C_FLAGS_DEBUG +@@ -85,6 +86,7 @@ if(WIN32) + "${${configuration}}") + endif() + endforeach() ++ endif() + + if(ENABLE_WIN10_ONECORE) + # Note: When linking your app or driver to OneCore.lib, be sure to remove any links to non-umbrella libs (such as +@@ -231,7 +233,7 @@ if(WIN32) + "") + target_link_libraries(vulkan Vulkan::Headers) + +- if(ENABLE_WIN10_ONECORE) ++ if(ENABLE_WIN10_ONECORE AND MSVC) + target_link_libraries(vulkan OneCoreUAP.lib LIBCMT.LIB LIBCMTD.LIB LIBVCRUNTIME.LIB LIBUCRT.LIB) + set_target_properties(vulkan PROPERTIES LINK_FLAGS "/NODEFAULTLIB") + else() +@@ -318,11 +320,11 @@ else() + ) + # cmake-format: on + endif() ++endif() + + if(NOT APPLE) + target_compile_definitions(vulkan PRIVATE _XOPEN_SOURCE=500) # hush compiler warnings for readlink + endif() +-endif() + + # Generate pkg-config file. + include(FindPkgConfig QUIET) +diff --git a/loader/loader.h b/loader/loader.h +index ea0c976b5..64ad08693 100644 +--- a/loader/loader.h ++++ b/loader/loader.h +@@ -38,7 +38,9 @@ + #include "vk_layer_dispatch_table.h" + #include "vk_loader_extensions.h" + +-#if defined(__GNUC__) && __GNUC__ >= 4 ++#if defined(_WIN32) ++#define LOADER_EXPORT __declspec(dllexport) ++#elif defined(__GNUC__) && __GNUC__ >= 4 + #define LOADER_EXPORT __attribute__((visibility("default"))) + #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) + #define LOADER_EXPORT __attribute__((visibility("default"))) +diff --git a/tests/layers/vk_format_utils.h b/tests/layers/vk_format_utils.h +index e76f9ec2f..ef06e12af 100644 +--- a/tests/layers/vk_format_utils.h ++++ b/tests/layers/vk_format_utils.h +@@ -25,7 +25,9 @@ + #include "vulkan/vulkan.h" + + #if !defined(VK_LAYER_EXPORT) +-#if defined(__GNUC__) && __GNUC__ >= 4 ++#if defined(_WIN32) ++#define VK_LAYER_EXPORT __declspec(dllexport) ++#elif defined(__GNUC__) && __GNUC__ >= 4 + #define VK_LAYER_EXPORT __attribute__((visibility("default"))) + #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) + #define VK_LAYER_EXPORT __attribute__((visibility("default"))) +-- +2.25.1 + diff --git a/patches/vulkan/0003-Define-appropiate-minimum-Windows-Version.patch b/patches/vulkan/0003-Define-appropiate-minimum-Windows-Version.patch new file mode 100644 index 0000000..a9b80ee --- /dev/null +++ b/patches/vulkan/0003-Define-appropiate-minimum-Windows-Version.patch @@ -0,0 +1,28 @@ +From b42b70be453766f56b9ac21c11190b1b5fd74179 Mon Sep 17 00:00:00 2001 +From: BtbN +Date: Mon, 7 Sep 2020 20:33:23 +0200 +Subject: [PATCH 3/4] Define appropiate minimum Windows-Version + +--- + loader/vk_loader_platform.h | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h +index abf078c28..40c532a95 100644 +--- a/loader/vk_loader_platform.h ++++ b/loader/vk_loader_platform.h +@@ -24,6 +24,11 @@ + #pragma once + + #if defined(_WIN32) ++ ++#define WINVER 0x0601 ++#define _WIN32_WINNT 0x0601 ++#define STRSAFE_NO_DEPRECATE 1 ++ + // WinSock2.h must be included *BEFORE* windows.h + #include + #endif // _WIN32 +-- +2.25.1 + diff --git a/patches/vulkan/0004-Unlock-building-static-loader-on-any-OS.patch b/patches/vulkan/0004-Unlock-building-static-loader-on-any-OS.patch new file mode 100644 index 0000000..a170a6d --- /dev/null +++ b/patches/vulkan/0004-Unlock-building-static-loader-on-any-OS.patch @@ -0,0 +1,153 @@ +From 62ff1c9f106a70257cff2fead1bdf1a3c3590239 Mon Sep 17 00:00:00 2001 +From: BtbN +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 +index a26e38408..1c3bab61f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -38,9 +38,7 @@ else() + option(BUILD_TESTS "Build Tests" OFF) + 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 +index b5f90393d..8fa4b01c5 100644 +--- a/loader/CMakeLists.txt ++++ b/loader/CMakeLists.txt +@@ -217,6 +217,22 @@ if(WIN32) + target_compile_options(loader-opt PUBLIC ${MSVC_LOADER_COMPILE_OPTIONS}) + target_include_directories(loader-opt PRIVATE "$") + ++ if(BUILD_STATIC_LOADER) ++ add_library(vulkan ++ STATIC ++ $ ++ $ ++ $ ++ ${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 + $ +@@ -231,6 +247,8 @@ if(WIN32) + vulkan-1 + PREFIX + "") ++ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS LOADER_DYNAMIC_LIB) ++ endif() + target_link_libraries(vulkan Vulkan::Headers) + + if(ENABLE_WIN10_ONECORE AND MSVC) +@@ -252,17 +270,19 @@ else() + 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) + set_target_properties(vulkan + PROPERTIES SOVERSION + "1" + VERSION + "${VulkanHeaders_VERSION_MAJOR}.${VulkanHeaders_VERSION_MINOR}.${VulkanHeaders_VERSION_PATCH}") ++ endif() + target_link_libraries(vulkan ${CMAKE_DL_LIBS} m) + if (NOT ANDROID) + target_link_libraries(vulkan pthread) +@@ -333,6 +353,7 @@ if(PKG_CONFIG_FOUND) + 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 +index 20790c12c..582808e99 100644 +--- a/loader/loader.c ++++ b/loader/loader.c +@@ -7887,7 +7887,7 @@ out: + 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 +index 64ad08693..0ee906734 100644 +--- a/loader/loader.h ++++ b/loader/loader.h +@@ -436,6 +436,9 @@ static inline void loader_init_dispatch(void *obj, const void *data) { + // 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 +index 40c532a95..d55193766 100644 +--- a/loader/vk_loader_platform.h ++++ b/loader/vk_loader_platform.h +@@ -397,9 +397,25 @@ typedef HANDLE loader_platform_thread; + // 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 + diff --git a/scripts.d/45-vulkan.sh b/scripts.d/45-vulkan.sh index f0be5b9..7e43fa2 100755 --- a/scripts.d/45-vulkan.sh +++ b/scripts.d/45-vulkan.sh @@ -1,7 +1,7 @@ #!/bin/bash -LOADER_REPO="https://github.com/BtbN/Vulkan-Loader.git" -LOADER_COMMIT="62ff1c9f106a70257cff2fead1bdf1a3c3590239" +LOADER_REPO="https://github.com/KhronosGroup/Vulkan-Loader.git" +LOADER_COMMIT="7ea01c139ffc7c33cd12bd258c1bc8bf530c6d2d" ffbuild_enabled() { [[ $ADDINS_STR != *vulkan* ]] && return -1 @@ -10,13 +10,18 @@ ffbuild_enabled() { ffbuild_dockerstage() { to_df "ADD $SELF /stage.sh" + to_df "ADD patches/vulkan /stage/patches" to_df "RUN run_stage" } ffbuild_dockerbuild() { - mkdir vulkan && cd vulkan + git clone "$LOADER_REPO" loader + git -C loader checkout "$LOADER_COMMIT" - git-mini-clone "$LOADER_REPO" "$LOADER_COMMIT" loader + for patch in patches/*.patch; do + echo "Applying $patch" + git -C loader am -3 < "$patch" + done HEADERS_REPO="$(grep -A10 'name.*:.*Vulkan-Headers' loader/scripts/known_good.json | grep url | head -n1 | cut -d'"' -f4)" HEADERS_COMMIT="$(grep -A10 'name.*:.*Vulkan-Headers' loader/scripts/known_good.json | grep commit | head -n1 | cut -d'"' -f4)"