Vulkan: use pkg-config instead of checking for Linux (#3440)

Makes Vulkan optional on Linux / makes it possible on FreeBSD.
This commit is contained in:
myfreeweb 2017-09-14 21:02:09 +03:00 committed by kd-11
parent 669d953529
commit 07af701afe
8 changed files with 57 additions and 22 deletions

View file

@ -76,20 +76,23 @@ When using GDB, configure it to ignore SIGSEGV signal (`handle SIGSEGV nostop no
## CMake Build Options (Linux & Mac OS) ## CMake Build Options (Linux & Mac OS)
- ```-DUSE_SYSTEM_LIBPNG=ON/OFF``` (default = *OFF*) </br> - ```-DUSE_SYSTEM_LIBPNG=ON/OFF``` (default = *OFF*)
Build against the shared libpng instead of using the builtin one. libpng 1.6+ highly recommended. Try this option if you get version conflict errors or only see black game icons. Build against the shared libpng instead of using the builtin one. libpng 1.6+ highly recommended. Try this option if you get version conflict errors or only see black game icons.
- ```-DUSE_SYSTEM_FFMPEG=ON/OFF``` (default = *OFF*) </br> - ```-DUSE_SYSTEM_FFMPEG=ON/OFF``` (default = *OFF*)
Build against the shared ffmpeg libraries instead of using the builtin patched version. Try this if the builtin version breaks the OpenGL renderer for you. Build against the shared ffmpeg libraries instead of using the builtin patched version. Try this if the builtin version breaks the OpenGL renderer for you.
- ```-DUSE_SHARED_LLVM_LIBS=ON/OFF``` (default = *OFF*) </br> - ```-DUSE_SHARED_LLVM_LIBS=ON/OFF``` (default = *OFF*)
This builds against the shared LLVM libs, rather than the static ones. This may interfere with Mesa and render RPCS3 non-functional. Only recommended on gentoo. This builds against the shared LLVM libs, rather than the static ones. This may interfere with Mesa and render RPCS3 non-functional. Only recommended on gentoo.
- ```-DWITHOUT_LLVM=ON/OFF``` (default = *OFF*) </br> - ```-DWITHOUT_LLVM=ON/OFF``` (default = *OFF*)
This forces RPCS3 to build without LLVM, not recommended. This forces RPCS3 to build without LLVM, not recommended.
- ```-DWITH_GDB=ON/OFF``` (default = *OFF*) </br> - ```-DWITH_GDB=ON/OFF``` (default = *OFF*)
This Builds RPCS3 with support for debugging PS3 games using gdb." This Builds RPCS3 with support for debugging PS3 games using gdb.
- ```-DUSE_VULKAN=ON/OFF``` (default = *ON*)
This builds RPCS3 with Vulkan support.
## License ## License

View file

@ -140,15 +140,17 @@ else()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /BASE:0x10000 /FIXED") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /BASE:0x10000 /FIXED")
endif() endif()
set(ADDITIONAL_LIBS "")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
#on some Linux distros shm_unlink and similar functions are in librt only #on some Linux distros shm_unlink and similar functions are in librt only
set(ADDITIONAL_LIBS "rt" "X11") set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} "rt")
elseif(NOT MSVC AND NOT CMAKE_CXX_FLAGS MATCHES "LIBICONV_PLUG") elseif(NOT MSVC AND NOT CMAKE_CXX_FLAGS MATCHES "LIBICONV_PLUG")
#it seems like glibc includes the iconv functions we use but other libc #it seems like glibc includes the iconv functions we use but other libc
#implementations like the one on OSX don't seem implement them #implementations like the one on OSX don't seem implement them
set(ADDITIONAL_LIBS "iconv") set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} "iconv")
else() endif()
set(ADDITIONAL_LIBS "") if(UNIX AND NOT APPLE)
set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} "X11")
endif() endif()
if(NOT RPCS3_SRC_DIR) if(NOT RPCS3_SRC_DIR)
@ -176,6 +178,7 @@ else()
option(USE_ALSA "ALSA audio backend" ON) option(USE_ALSA "ALSA audio backend" ON)
option(USE_PULSE "PulseAudio audio backend" ON) option(USE_PULSE "PulseAudio audio backend" ON)
option(USE_LIBEVDEV "libevdev-based joystick support" ON) option(USE_LIBEVDEV "libevdev-based joystick support" ON)
option(USE_VULKAN "Vulkan render backend" ON)
endif() endif()
if(USE_ALSA) if(USE_ALSA)
@ -205,6 +208,15 @@ if(USE_LIBEVDEV)
list(APPEND ADDITIONAL_LIBS ${LIBEVDEV_LDFLAGS}) list(APPEND ADDITIONAL_LIBS ${LIBEVDEV_LDFLAGS})
endif() endif()
endif() endif()
if(NOT WIN32 AND USE_VULKAN)
find_package(Vulkan)
if(VULKAN_FOUND)
add_definitions(-DHAVE_VULKAN)
list(APPEND ADDITIONAL_LIBS ${VULKAN_LIBRARY})
else()
message("WARNING! USE_VULKAN was enabled, but libvulkan was not found. RPCS3 will be compiled without Vulkan support.")
endif()
endif()
# Select the version of libpng to use, default is builtin # Select the version of libpng to use, default is builtin
if(USE_SYSTEM_LIBPNG) if(USE_SYSTEM_LIBPNG)
@ -304,7 +316,7 @@ RPCS3_SRC
"${RPCS3_SRC_DIR}/../asmjit/src/asmjit/*.cpp" "${RPCS3_SRC_DIR}/../asmjit/src/asmjit/*.cpp"
) )
if (NOT WIN32 AND "${CMAKE_SYSTEM}" MATCHES "Linux") if (NOT WIN32 AND VULKAN_FOUND)
# Compile glslang and SPIRV modules needed for glsl compilation # Compile glslang and SPIRV modules needed for glsl compilation
file( file(
GLOB_RECURSE GLOB_RECURSE
@ -322,8 +334,7 @@ endif()
#File exclusion section #File exclusion section
#Ignore vulkan if not on windows or linux if(NOT WIN32 AND NOT VULKAN_FOUND)
if(NOT WIN32 AND NOT "${CMAKE_SYSTEM}" MATCHES "Linux")
set (EXCLUDE_FILES "/RSX/VK/") set (EXCLUDE_FILES "/RSX/VK/")
endif() endif()
@ -366,10 +377,13 @@ else()
if(APPLE) if(APPLE)
target_link_libraries(rpcs3 hidapi-mac "-framework CoreFoundation" "-framework IOKit") target_link_libraries(rpcs3 hidapi-mac "-framework CoreFoundation" "-framework IOKit")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_link_libraries(rpcs3 hidapi-hidraw udev vulkan) target_link_libraries(rpcs3 hidapi-hidraw udev)
else() else()
target_link_libraries(rpcs3 hidapi-libusb usb) target_link_libraries(rpcs3 hidapi-libusb usb)
endif() endif()
if(VULKAN_FOUND)
target_link_libraries(rpcs3 ${VULKAN_LIBRARIES})
endif()
target_link_libraries(rpcs3 ${CMAKE_DL_LIBS} -lpthread ${ZLIB_LIBRARIES} ${ADDITIONAL_LIBS}) target_link_libraries(rpcs3 ${CMAKE_DL_LIBS} -lpthread ${ZLIB_LIBRARIES} ${ADDITIONAL_LIBS})
if (USE_SYSTEM_FFMPEG) if (USE_SYSTEM_FFMPEG)
link_libraries(${FFMPEG_LIBRARY_DIR}) link_libraries(${FFMPEG_LIBRARY_DIR})

View file

@ -500,7 +500,7 @@ VKGSRender::VKGSRender() : GSRender()
m_swap_chain = m_thread_context.createSwapChain(hInstance, hWnd, gpus[0]); m_swap_chain = m_thread_context.createSwapChain(hInstance, hWnd, gpus[0]);
} }
#elif __linux__ #elif HAVE_VULKAN
Window window = (Window)m_frame->handle(); Window window = (Window)m_frame->handle();
Display *display = XOpenDisplay(0); Display *display = XOpenDisplay(0);
@ -722,7 +722,7 @@ VKGSRender::~VKGSRender()
delete m_swap_chain; delete m_swap_chain;
#ifdef __linux__ #if !defined(_WIN32) && defined(HAVE_VULKAN)
if (m_display_handle) if (m_display_handle)
XCloseDisplay(m_display_handle); XCloseDisplay(m_display_handle);
#endif #endif

View file

@ -249,7 +249,7 @@ private:
//Vertex layout //Vertex layout
rsx::vertex_input_layout m_vertex_layout; rsx::vertex_input_layout m_vertex_layout;
#ifdef __linux__ #if !defined(_WIN32) && defined(HAVE_VULKAN)
Display *m_display_handle = nullptr; Display *m_display_handle = nullptr;
#endif #endif

View file

@ -1247,7 +1247,7 @@ namespace vk
VkSurfaceKHR surface; VkSurfaceKHR surface;
CHECK_RESULT(vkCreateWin32SurfaceKHR(m_instance, &createInfo, NULL, &surface)); CHECK_RESULT(vkCreateWin32SurfaceKHR(m_instance, &createInfo, NULL, &surface));
#elif __linux__ #elif HAVE_VULKAN
vk::swap_chain* createSwapChain(Display *display, Window window, vk::physical_device &dev) vk::swap_chain* createSwapChain(Display *display, Window window, vk::physical_device &dev)
{ {

View file

@ -0,0 +1,18 @@
# Find Vulkan
find_package(PkgConfig)
pkg_check_modules(PC_VULKAN vulkan)
# RPCS3 ships with the SDK headers
# find_path(VULKAN_INCLUDE_DIR
# NAMES vulkan/vulkan.h
# HINTS ${PC_VULKAN_INCLUDE_DIR} ${PC_VULKAN_INCLUDE_DIRS})
find_library(VULKAN_LIBRARY
NAMES vulkan
HINTS ${PC_VULKAN_LIBRARY} ${PC_VULKAN_LIBRARY_DIRS})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Vulkan DEFAULT_MSG VULKAN_LIBRARY)
mark_as_advanced(VULKAN_LIBRARY VULKAN_INCLUDE_DIR)

View file

@ -41,7 +41,7 @@
#ifdef _MSC_VER #ifdef _MSC_VER
#include "Emu/RSX/D3D12/D3D12GSRender.h" #include "Emu/RSX/D3D12/D3D12GSRender.h"
#endif #endif
#if defined(_WIN32) || defined(__linux__) #if defined(_WIN32) || defined(HAVE_VULKAN)
#include "Emu/RSX/VK/VKGSRender.h" #include "Emu/RSX/VK/VKGSRender.h"
#endif #endif
#ifdef _WIN32 #ifdef _WIN32
@ -201,7 +201,7 @@ void rpcs3_app::InitializeCallbacks()
{ {
case video_renderer::null: return std::make_shared<NullGSRender>(); case video_renderer::null: return std::make_shared<NullGSRender>();
case video_renderer::opengl: return std::make_shared<GLGSRender>(); case video_renderer::opengl: return std::make_shared<GLGSRender>();
#if defined(_WIN32) || defined(__linux__) #if defined(_WIN32) || defined(HAVE_VULKAN)
case video_renderer::vulkan: return std::make_shared<VKGSRender>(); case video_renderer::vulkan: return std::make_shared<VKGSRender>();
#endif #endif
#ifdef _MSC_VER #ifdef _MSC_VER

View file

@ -12,7 +12,7 @@
#include <dxgi1_4.h> #include <dxgi1_4.h>
#endif #endif
#if defined(_WIN32) || defined(__linux__) #if defined(_WIN32) || defined(HAVE_VULKAN)
#include "Emu/RSX/VK/VKHelpers.h" #include "Emu/RSX/VK/VKHelpers.h"
#endif #endif
@ -143,7 +143,7 @@ Render_Creator::Render_Creator()
} }
#endif #endif
#if defined(WIN32) || defined(__linux__) #if defined(WIN32) || defined(HAVE_VULKAN)
// check for vulkan adapters // check for vulkan adapters
vk::context device_enum_context; vk::context device_enum_context;
u32 instance_handle = device_enum_context.createInstance("RPCS3", true); u32 instance_handle = device_enum_context.createInstance("RPCS3", true);