From d2b9b7c1f6c35413746ca05b1cadf673a1f93c68 Mon Sep 17 00:00:00 2001 From: DH Date: Sat, 4 Oct 2025 13:32:28 +0300 Subject: [PATCH] Compile Vulkan Loader and GLFW if not available --- .gitmodules | 9 ++ 3rdparty/CMakeLists.txt | 154 +++++++++++++++++++++----------- 3rdparty/Vulkan-Headers | 2 +- 3rdparty/Vulkan-Loader | 1 + 3rdparty/fmtlib | 1 + 3rdparty/glfw | 1 + CMakeLists.txt | 8 +- rpcsx/CMakeLists.txt | 2 +- rpcsx/gpu/CMakeLists.txt | 4 +- rpcsx/gpu/lib/vk/CMakeLists.txt | 4 +- 10 files changed, 122 insertions(+), 64 deletions(-) create mode 160000 3rdparty/Vulkan-Loader create mode 160000 3rdparty/fmtlib create mode 160000 3rdparty/glfw diff --git a/.gitmodules b/.gitmodules index 8f15fa5d8..38063ff4d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -131,3 +131,12 @@ [submodule "3rdparty/Vulkan-Headers"] path = 3rdparty/Vulkan-Headers url = ../../KhronosGroup/Vulkan-Headers.git +[submodule "3rdparty/fmtlib"] + path = 3rdparty/fmtlib + url = ../../fmtlib/fmt.git +[submodule "3rdparty/Vulkan-Loader"] + path = 3rdparty/Vulkan-Loader + url = ../../KhronosGroup/Vulkan-Loader.git +[submodule "3rdparty/glfw"] + path = 3rdparty/glfw + url = ../../glfw/glfw.git diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index 2f224bc9d..375edaa4a 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -235,60 +235,68 @@ endif() # Vulkan set(VULKAN_TARGET 3rdparty_dummy_lib) -if(USE_VULKAN) - if(APPLE) - if(USE_SYSTEM_MVK) - message(STATUS "RPCS3: Using system MoltenVK") - else() - message(STATUS "RPCS3: MoltenVK submodule") - - execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK" - ) - execute_process(COMMAND "${CMAKE_COMMAND}" --build . - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK" - ) - - add_library(moltenvk_lib SHARED IMPORTED) - add_dependencies(moltenvk_lib moltenvk) - set_target_properties(moltenvk_lib - PROPERTIES IMPORTED_LOCATION "{Vulkan_LIBRARY}" - ) - - set(VULKAN_SDK "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/MoltenVK") - set(VK_ICD_FILENAMES "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/MoltenVK/icd/MoltenVK_icd.json") - set(Vulkan_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/MoltenVK/include") - set(Vulkan_LIBRARY "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/Build/Products/Release/dynamic/libMoltenVK.dylib") - set(Vulkan_TOOLS "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/Build/Products/Release") - endif() - endif() - - find_package(Vulkan) - if(VULKAN_FOUND) - add_library(3rdparty_vulkan INTERFACE) - target_compile_definitions(3rdparty_vulkan INTERFACE -DHAVE_VULKAN) - target_link_libraries(3rdparty_vulkan INTERFACE Vulkan::Vulkan) - - if(UNIX AND NOT APPLE AND NOT ANDROID) - find_package(Wayland) - if (WAYLAND_FOUND) - target_include_directories(3rdparty_vulkan - INTERFACE ${WAYLAND_INCLUDE_DIR}) - - target_compile_definitions(3rdparty_vulkan - INTERFACE -DVK_USE_PLATFORM_WAYLAND_KHR) - endif() - endif() - - set(VULKAN_TARGET 3rdparty_vulkan) +if(APPLE) + if(USE_SYSTEM_MVK) + message(STATUS "Using system MoltenVK") else() - message(WARNING "USE_VULKAN was enabled, but libvulkan was not found. RPCS3 will be compiled without Vulkan support.") - if(APPLE) - message(FATAL_ERROR "To build without Vulkan support on macOS, please disable USE_VULKAN.") - endif() + message(STATUS "MoltenVK submodule") + + execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK" + ) + execute_process(COMMAND "${CMAKE_COMMAND}" --build . + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK" + ) + + add_library(moltenvk_lib SHARED IMPORTED) + add_dependencies(moltenvk_lib moltenvk) + set_target_properties(moltenvk_lib + PROPERTIES IMPORTED_LOCATION "{Vulkan_LIBRARY}" + ) + + set(VULKAN_SDK "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/MoltenVK") + set(VK_ICD_FILENAMES "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/MoltenVK/icd/MoltenVK_icd.json") + set(Vulkan_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/MoltenVK/include") + set(Vulkan_LIBRARY "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/Build/Products/Release/dynamic/libMoltenVK.dylib") + set(Vulkan_TOOLS "${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/Build/Products/Release") endif() endif() +add_library(3rdparty_vulkan INTERFACE) +target_compile_definitions(3rdparty_vulkan INTERFACE -DHAVE_VULKAN) + +if (NOT COMPILE_VULKAN_LOADER OR ANDROID OR APPLE) + find_package(Vulkan 1.3 GLOBAL) + + if (Vulkan_FOUND) + message(STATUS "Using system Vulkan Loader") + target_link_libraries(3rdparty_vulkan INTERFACE Vulkan::Vulkan) + add_library(Vulkan::Loader ALIAS Vulkan::Vulkan) + else() + message(WARNING "Vulkan not found, using submodule") + set(COMPILE_VULKAN_LOADER on) + endif() +endif() + +if (COMPILE_VULKAN_LOADER) + add_subdirectory(Vulkan-Loader) + target_link_libraries(3rdparty_vulkan INTERFACE Vulkan::Loader) +endif() + +if(UNIX AND NOT APPLE AND NOT ANDROID) + find_package(Wayland) + + if (WAYLAND_FOUND) + target_include_directories(3rdparty_vulkan + INTERFACE ${WAYLAND_INCLUDE_DIR}) + + target_compile_definitions(3rdparty_vulkan + INTERFACE -DVK_USE_PLATFORM_WAYLAND_KHR) + endif() +endif() + +set(VULKAN_TARGET 3rdparty_vulkan) + # AsmJit add_subdirectory(asmjit EXCLUDE_FROM_ALL) @@ -308,11 +316,11 @@ if(USE_FAUDIO) if (USE_SYSTEM_FAUDIO) if (NOT SDL3_FOUND OR SDL3_VERSION VERSION_LESS 3.2.0) message(WARNING - "RPCS3: System FAudio requires SDL 3.2.0 or newer. Since a valid SDL3" + "System FAudio requires SDL 3.2.0 or newer. Since a valid SDL3" ">=3.2.0 version cannot be found, building with FAudio will be skipped.") set(USE_FAUDIO OFF CACHE BOOL "Disabled using system FAudio with SDL < 3.2.0" FORCE) else() - message(STATUS "RPCS3: Using system FAudio") + message(STATUS "Using system FAudio") find_package(FAudio REQUIRED CONFIGS FAudioConfig.cmake FAudio-config.cmake) add_library(3rdparty_FAudio INTERFACE) target_link_libraries(3rdparty_FAudio INTERFACE FAudio) @@ -322,11 +330,11 @@ if(USE_FAUDIO) else() if (NOT SDL3_FOUND OR SDL3_VERSION VERSION_LESS 3.2.0) message(WARNING - "-- RPCS3: 3rdparty FAudio requires SDL 3.2.0 or newer. Since a valid SDL3" + "-- 3rdparty FAudio requires SDL 3.2.0 or newer. Since a valid SDL3" ">=3.2.0 version cannot be found, building with FAudio will be skipped.") set(USE_FAUDIO OFF CACHE BOOL "Disabled FAudio with SDL < 3.2.0" FORCE) else() - message(STATUS "RPCS3: Using builtin FAudio") + message(STATUS "Using builtin FAudio") set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared library") add_subdirectory(FAudio EXCLUDE_FROM_ALL) target_compile_definitions(FAudio-static INTERFACE -DHAVE_FAUDIO) @@ -399,6 +407,44 @@ else() add_library(3rdparty::libusb ALIAS usb-1.0-static) endif() +if (ANDROID) + add_library(glfw INTERFACE) + target_compile_definitions(glfw INTERFACE WITHOUT_GLFW) + add_library(3rdparty::glfw ALIAS glfw) +else() + if (NOT COMPILE_GLFW) + find_package(glfw3 3.3 GLOBAL) + if (glfw3_FOUND) + message(STATUS "Using system glfw") + else() + message(WARNING "glfw not found, using submodule") + set(COMPILE_GLFW on) + endif() + endif() + + if (COMPILE_GLFW) + set(GLFW_BUILD_DOCS off) + set(GLFW_INSTALL off) + + if (WIN32) + set(GLFW_BUILD_WIN32 on) + elseif(LINUX) + set(GLFW_BUILD_WAYLAND on) + set(GLFW_BUILD_X11 on) + endif() + + add_subdirectory(glfw) + endif() + + if (NOT TARGET glfw) + message(FATAL_ERROR "where is glfw?") + endif() + + + add_library(3rdparty::glfw ALIAS glfw) +endif() + + add_library(3rdparty::zlib ALIAS 3rdparty_zlib) add_library(3rdparty::zstd ALIAS 3rdparty_zstd) add_library(3rdparty::7zip ALIAS 3rdparty_7zip) diff --git a/3rdparty/Vulkan-Headers b/3rdparty/Vulkan-Headers index 5ceb9ed48..a4f8ada9f 160000 --- a/3rdparty/Vulkan-Headers +++ b/3rdparty/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 5ceb9ed481e58e705d0d9b5326537daedd06b97d +Subproject commit a4f8ada9f4f97c45b8c89c57997be9cebaae65d2 diff --git a/3rdparty/Vulkan-Loader b/3rdparty/Vulkan-Loader new file mode 160000 index 000000000..ae0461b67 --- /dev/null +++ b/3rdparty/Vulkan-Loader @@ -0,0 +1 @@ +Subproject commit ae0461b671558197a9a50e5fcfcc3b2d3f406b42 diff --git a/3rdparty/fmtlib b/3rdparty/fmtlib new file mode 160000 index 000000000..486e7ba57 --- /dev/null +++ b/3rdparty/fmtlib @@ -0,0 +1 @@ +Subproject commit 486e7ba579a2c677772d004ecd0311142ba481be diff --git a/3rdparty/glfw b/3rdparty/glfw new file mode 160000 index 000000000..8e15281d3 --- /dev/null +++ b/3rdparty/glfw @@ -0,0 +1 @@ +Subproject commit 8e15281d34a8b9ee9271ccce38177a3d812456f8 diff --git a/CMakeLists.txt b/CMakeLists.txt index 443462e6a..26a2a7f7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,6 +134,9 @@ endfunction() option(WITH_PS3 "Enable PS3 emulation support" OFF) option(WITH_PS4 "Enable PS4 emulation support" ON) +option(COMPILE_GLFW "Compile GLFW" OFF) +option(COMPILE_VULKAN_LOADER "Compile Vulkan Loader" OFF) + option(WITHOUT_OPENGL "Disable OpenGL" OFF) option(WITHOUT_OPENGLEW "Disable OpenGLEW" OFF) option(WITHOUT_OPENAL "Disable OpenAL" OFF) @@ -246,13 +249,12 @@ if(MSVC) add_compile_options(/wd4530 /utf-8) # C++ exception handler used, but unwind semantics are not enabled endif() +include(CheckFunctionExists) add_subdirectory(3rdparty EXCLUDE_FROM_ALL) add_subdirectory(rx EXCLUDE_FROM_ALL) include(3rdparty/llvm/CMakeLists.txt) -include(ConfigureCompiler) -include(CheckFunctionExists) if (NOT RX_TAG) set(RX_TAG 0) @@ -276,6 +278,8 @@ endif() add_subdirectory(rpcsx) if (WITH_PS3) + include(ConfigureCompiler) add_subdirectory(rpcs3) add_subdirectory(ps3fw) endif() + diff --git a/rpcsx/CMakeLists.txt b/rpcsx/CMakeLists.txt index fd653db2a..b6830bc30 100644 --- a/rpcsx/CMakeLists.txt +++ b/rpcsx/CMakeLists.txt @@ -4,7 +4,7 @@ add_library(orbis::kernel::config ALIAS standalone-config) add_subdirectory(cpu) -if(LINUX AND WITH_RPCSX) +if(LINUX AND WITH_PS4) find_package(libunwind REQUIRED) find_package(sox REQUIRED) find_package(ALSA REQUIRED) diff --git a/rpcsx/gpu/CMakeLists.txt b/rpcsx/gpu/CMakeLists.txt index 21edf646f..22460cd46 100644 --- a/rpcsx/gpu/CMakeLists.txt +++ b/rpcsx/gpu/CMakeLists.txt @@ -1,5 +1,3 @@ -find_package(glfw3 3.3 REQUIRED) - add_precompiled_vulkan_spirv(rpcsx-gpu-shaders shaders/fill_red.frag.glsl shaders/flip_std.frag.glsl @@ -24,7 +22,7 @@ PUBLIC rpcsx-gpu-shaders rx gcn-shader - glfw + 3rdparty::glfw amdgpu::tiler::cpu amdgpu::tiler::vulkan rdna-semantic-spirv diff --git a/rpcsx/gpu/lib/vk/CMakeLists.txt b/rpcsx/gpu/lib/vk/CMakeLists.txt index fcea1a6b7..85dad33b8 100644 --- a/rpcsx/gpu/lib/vk/CMakeLists.txt +++ b/rpcsx/gpu/lib/vk/CMakeLists.txt @@ -1,7 +1,5 @@ -find_package(Vulkan 1.3 REQUIRED) - add_library(vk STATIC src/vk.cpp) -target_link_libraries(vk PUBLIC Vulkan::Vulkan rx) +target_link_libraries(vk PUBLIC Vulkan::Loader Vulkan::Headers rx) target_include_directories(vk PUBLIC include)