diff --git a/CMakeLists.txt b/CMakeLists.txt index df0424d5..d35512f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,17 +107,28 @@ else() option(SUNSHINE_ENABLE_DRM "Enable KMS grab if available" ON) option(SUNSHINE_ENABLE_X11 "Enable X11 grab if available" ON) option(SUNSHINE_ENABLE_WAYLAND "Enable building wayland specific code" ON) - - if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES) - set(CMAKE_CUDA_ARCHITECTURES 75) - endif() - enable_language(CUDA) + option(SUNSHINE_ENABLE_CUDA "Enable cuda specific code" ON) if(${SUNSHINE_ENABLE_X11}) find_package(X11) else() set(X11_FOUND OFF) endif() + + set(CUDA_FOUND OFF) + if(${SUNSHINE_ENABLE_CUDA}) + include(CheckLanguage) + check_language(CUDA) + + if(CMAKE_CUDA_COMPILER) + if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES) + set(CMAKE_CUDA_ARCHITECTURES 75) + endif() + + set(CUDA_FOUND ON) + enable_language(CUDA) + endif() + endif() if(${SUNSHINE_ENABLE_DRM}) find_package(LIBDRM) find_package(LIBCAP) @@ -138,6 +149,17 @@ else() include_directories(${X11_INCLUDE_DIR}) list(APPEND PLATFORM_TARGET_FILES sunshine/platform/linux/x11grab.cpp) endif() + + if(CUDA_FOUND) + include_directories(third-party/nvfbc) + list(APPEND PLATFORM_TARGET_FILES + sunshine/platform/linux/cuda.cu + sunshine/platform/linux/cuda.cpp + third-party/nvfbc/NvFBC.h) + + add_compile_definitions(SUNSHINE_BUILD_CUDA) + endif() + if(LIBDRM_FOUND AND LIBCAP_FOUND) add_compile_definitions(SUNSHINE_BUILD_DRM) include_directories(${LIBDRM_INCLUDE_DIRS} ${LIBCAP_INCLUDE_DIRS}) @@ -187,16 +209,14 @@ else() sunshine/platform/linux/wlgrab.cpp sunshine/platform/linux/wayland.cpp) endif() - if(NOT ${X11_FOUND} AND NOT (${LIBDRM_FOUND} AND ${LIBCAP_FOUND}) AND NOT ${WAYLAND_FOUND}) - message(FATAL_ERROR "Couldn't find either x11, wayland or (libdrm and libcap)") + if(NOT ${X11_FOUND} AND NOT (${LIBDRM_FOUND} AND ${LIBCAP_FOUND}) AND NOT ${WAYLAND_FOUND} AND NOT ${}) + message(FATAL_ERROR "Couldn't find either x11, wayland, cuda or (libdrm and libcap)") endif() list(APPEND PLATFORM_TARGET_FILES sunshine/platform/linux/publish.cpp sunshine/platform/linux/vaapi.h sunshine/platform/linux/vaapi.cpp - sunshine/platform/linux/cuda.cu - sunshine/platform/linux/cuda.cpp sunshine/platform/linux/cuda.h sunshine/platform/linux/graphics.h sunshine/platform/linux/graphics.cpp @@ -211,8 +231,7 @@ else() third-party/glad/include/EGL/eglplatform.h third-party/glad/include/KHR/khrplatform.h third-party/glad/include/glad/gl.h - third-party/glad/include/glad/egl.h - third-party/nvfbc/NvFBC.h) + third-party/glad/include/glad/egl.h) list(APPEND PLATFORM_LIBRARIES dl @@ -224,8 +243,7 @@ else() include_directories( /usr/include/libevdev-1.0 third-party/nv-codec-headers/include - third-party/glad/include - third-party/nvfbc) + third-party/glad/include) if(NOT DEFINED SUNSHINE_EXECUTABLE_PATH) set(SUNSHINE_EXECUTABLE_PATH "sunshine") diff --git a/sunshine/platform/linux/cuda.cpp b/sunshine/platform/linux/cuda.cpp index 25d88518..65bd07ee 100644 --- a/sunshine/platform/linux/cuda.cpp +++ b/sunshine/platform/linux/cuda.cpp @@ -14,7 +14,6 @@ extern "C" { #include "sunshine/main.h" #include "sunshine/utility.h" #include "wayland.h" -#include "x11grab.h" #define SUNSHINE_STRINGVIEW_HELPER(x) x##sv #define SUNSHINE_STRINGVIEW(x) SUNSHINE_STRINGVIEW_HELPER(x) diff --git a/sunshine/platform/linux/cuda.h b/sunshine/platform/linux/cuda.h index 08cb0156..7e377f20 100644 --- a/sunshine/platform/linux/cuda.h +++ b/sunshine/platform/linux/cuda.h @@ -1,10 +1,14 @@ -#ifndef SUNSHINE_PLATFORM_CUDA_H +#if !defined(SUNSHINE_PLATFORM_CUDA_H) && defined(SUNSHINE_BUILD_CUDA) #define SUNSHINE_PLATFORM_CUDA_H -#ifndef __NVCC__ +#include +#include +#include -#include "sunshine/platform/common.h" -#include "x11grab.h" +namespace platf { + class hwdevice_t; + class img_t; +} namespace cuda { namespace nvfbc { @@ -14,12 +18,6 @@ std::shared_ptr make_hwdevice(int width, int height, bool vra int init(); } // namespace cuda -#else -namespace platf { -class img_t; -} -#endif - typedef struct cudaArray *cudaArray_t; #if !defined(__CUDACC__) diff --git a/sunshine/platform/linux/misc.cpp b/sunshine/platform/linux/misc.cpp index e10242ff..bf6201b3 100644 --- a/sunshine/platform/linux/misc.cpp +++ b/sunshine/platform/linux/misc.cpp @@ -141,9 +141,9 @@ std::string get_mac_address(const std::string_view &address) { } enum class source_e { - // #ifdef SUNSHINE_BUILD_CUDA +#ifdef SUNSHINE_BUILD_CUDA NVFBC, -// #endif +#endif #ifdef SUNSHINE_BUILD_WAYLAND WAYLAND, #endif @@ -156,14 +156,14 @@ enum class source_e { }; static source_e source; -// #ifdef SUNSHINE_BUILD_CUDA +#ifdef SUNSHINE_BUILD_CUDA std::vector nvfbc_display_names(); std::shared_ptr nvfbc_display(mem_type_e hwdevice_type, const std::string &display_name, int framerate); bool verify_nvfbc() { return !nvfbc_display_names().empty(); } -// #endif +#endif #ifdef SUNSHINE_BUILD_WAYLAND std::vector wl_display_names(); @@ -194,10 +194,10 @@ bool verify_x11() { std::vector display_names() { switch(source) { - // #ifdef SUNSHINE_BUILD_CUDA +#ifdef SUNSHINE_BUILD_CUDA case source_e::NVFBC: return nvfbc_display_names(); - // #endif +#endif #ifdef SUNSHINE_BUILD_WAYLAND case source_e::WAYLAND: return wl_display_names(); @@ -217,10 +217,10 @@ std::vector display_names() { std::shared_ptr display(mem_type_e hwdevice_type, const std::string &display_name, int framerate) { switch(source) { - // #ifdef SUNSHINE_BUILD_CUDA +#ifdef SUNSHINE_BUILD_CUDA case source_e::NVFBC: return nvfbc_display(hwdevice_type, display_name, framerate); - // #endif +#endif #ifdef SUNSHINE_BUILD_WAYLAND case source_e::WAYLAND: return wl_display(hwdevice_type, display_name, framerate); @@ -249,7 +249,7 @@ std::unique_ptr init() { window_system = window_system_e::WAYLAND; } #endif -#if defined(SUNSHINE_BUILD_X11) // || defined(SUNSHINE_BUILD_CUDA) +#if defined(SUNSHINE_BUILD_X11) || defined(SUNSHINE_BUILD_CUDA) if(std::getenv("DISPLAY") && window_system != window_system_e::WAYLAND) { if(std::getenv("WAYLAND_DISPLAY")) { BOOST_LOG(warning) << "Wayland detected, yet sunshine will use X11 for screencasting, screencasting will only work on XWayland applications"sv; @@ -258,13 +258,13 @@ std::unique_ptr init() { window_system = window_system_e::X11; } #endif -// #ifdef SUNSHINE_BUILD_CUDA +#ifdef SUNSHINE_BUILD_CUDA if(verify_nvfbc()) { BOOST_LOG(info) << "Using nvFBC for screencasting"sv; source = source_e::NVFBC; goto found_source; } -// #endif +#endif #ifdef SUNSHINE_BUILD_WAYLAND if(verify_wl()) { BOOST_LOG(info) << "Using Wayland for screencasting"sv; diff --git a/sunshine/platform/linux/x11grab.cpp b/sunshine/platform/linux/x11grab.cpp index decf24aa..eb303d46 100644 --- a/sunshine/platform/linux/x11grab.cpp +++ b/sunshine/platform/linux/x11grab.cpp @@ -20,11 +20,11 @@ #include "sunshine/main.h" #include "sunshine/task_pool.h" +#include "cuda.h" #include "graphics.h" #include "misc.h" #include "vaapi.h" #include "x11grab.h" -#include "cuda.h" using namespace std::literals; @@ -517,9 +517,11 @@ struct x11_attr_t : public display_t { return va::make_hwdevice(width, height, false); } +#ifdef SUNSHINE_BUILD_CUDA if(mem_type == mem_type_e::cuda) { return cuda::make_hwdevice(width, height, false); } +#endif return std::make_shared(); }