diff --git a/include/native/wsi/native_wsi.h b/include/native/wsi/native_wsi.h index cfb64f12..285fc19c 100644 --- a/include/native/wsi/native_wsi.h +++ b/include/native/wsi/native_wsi.h @@ -6,6 +6,8 @@ #include "wsi/native_sdl2.h" #elif DXVK_WSI_GLFW #include "wsi/native_glfw.h" +#elif DXVK_WSI_NONE +//empty #else #error Unknown wsi! #endif \ No newline at end of file diff --git a/meson.build b/meson.build index 2a263735..4f9af057 100644 --- a/meson.build +++ b/meson.build @@ -136,6 +136,8 @@ else elif dxvk_wsi == 'glfw' lib_glfw = cpp.find_library('glfw') compiler_args += ['-DDXVK_WSI_GLFW'] + elif dxvk_wsi == 'none' + compiler_args += ['-DDXVK_WSI_NONE'] endif dxvk_name_prefix = 'libdxvk_' diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index c8fa9bda..b4039e62 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -129,6 +129,10 @@ elif dxvk_wsi == 'glfw' dxvk_src += [ 'platform/dxvk_glfw_exts.cpp' ] +elif dxvk_wsi == 'none' + dxvk_src += [ + 'platform/dxvk_none_exts.cpp' + ] endif dxvk_extra_deps = [ dependency('threads') ] diff --git a/src/dxvk/platform/dxvk_none_exts.cpp b/src/dxvk/platform/dxvk_none_exts.cpp new file mode 100644 index 00000000..374a79c7 --- /dev/null +++ b/src/dxvk/platform/dxvk_none_exts.cpp @@ -0,0 +1,33 @@ +#include "../dxvk_platform_exts.h" + +namespace dxvk { + + DxvkPlatformExts DxvkPlatformExts::s_instance; + + std::string_view DxvkPlatformExts::getName() { + return "No WSI"; + } + + + DxvkNameSet DxvkPlatformExts::getInstanceExtensions() { + return {}; + } + + + DxvkNameSet DxvkPlatformExts::getDeviceExtensions( + uint32_t adapterId) { + return {}; + } + + + void DxvkPlatformExts::initInstanceExtensions() { + + } + + + void DxvkPlatformExts::initDeviceExtensions( + const DxvkInstance* instance) { + + } + +} diff --git a/src/wsi/meson.build b/src/wsi/meson.build index 27603cea..46de9911 100644 --- a/src/wsi/meson.build +++ b/src/wsi/meson.build @@ -17,6 +17,12 @@ wsi_glfw_src = [ 'glfw/wsi_window_glfw.cpp', ] +wsi_none_src = [ + 'none/wsi_monitor_none.cpp', + 'none/wsi_window_none.cpp', + 'none/wsi_edid_none.cpp', +] + if dxvk_wsi == 'win32' wsi_src = wsi_common_src + wsi_win32_src wsi_deps = [ dep_displayinfo ] @@ -26,6 +32,9 @@ elif dxvk_wsi == 'sdl2' elif dxvk_wsi == 'glfw' wsi_src = wsi_common_src + wsi_glfw_src wsi_deps = [ dep_displayinfo, lib_glfw ] +elif dxvk_wsi == 'none' + wsi_src = wsi_none_src + wsi_deps = [] else error('Unknown wsi') endif diff --git a/src/wsi/none/wsi_edid_none.cpp b/src/wsi/none/wsi_edid_none.cpp new file mode 100644 index 00000000..db9ebb22 --- /dev/null +++ b/src/wsi/none/wsi_edid_none.cpp @@ -0,0 +1,10 @@ +#include "wsi_edid.h" + +namespace dxvk::wsi { + + std::optional parseColorimetryInfo( + const WsiEdidData& edidData) { + return std::nullopt; + } + +} diff --git a/src/wsi/none/wsi_monitor_none.cpp b/src/wsi/none/wsi_monitor_none.cpp new file mode 100644 index 00000000..b222c827 --- /dev/null +++ b/src/wsi/none/wsi_monitor_none.cpp @@ -0,0 +1,66 @@ +#include "../wsi_monitor.h" + +#include "wsi/native_wsi.h" +#include "wsi_platform_none.h" + +#include "../../util/util_string.h" +#include "../../util/log/log.h" + +namespace dxvk::wsi { + + HMONITOR getDefaultMonitor() { + return nullptr; + } + + + HMONITOR enumMonitors(uint32_t index) { + return nullptr; + } + + + HMONITOR enumMonitors(const LUID *adapterLUID[], uint32_t numLUIDs, uint32_t index) { + return enumMonitors(index); + } + + + bool getDisplayName( + HMONITOR hMonitor, + WCHAR (&Name)[32]) { + return false; + } + + + bool getDesktopCoordinates( + HMONITOR hMonitor, + RECT* pRect) { + return false; + } + + + bool getDisplayMode( + HMONITOR hMonitor, + uint32_t ModeNumber, + WsiMode* pMode) { + return false; + } + + + bool getCurrentDisplayMode( + HMONITOR hMonitor, + WsiMode* pMode) { + return false; + } + + + bool getDesktopDisplayMode( + HMONITOR hMonitor, + WsiMode* pMode) { + return false; + } + + std::vector getMonitorEdid(HMONITOR hMonitor) { + Logger::err("getMonitorEdid not implemented on this platform."); + return {}; + } + +} diff --git a/src/wsi/none/wsi_platform_none.h b/src/wsi/none/wsi_platform_none.h new file mode 100644 index 00000000..dd9dd08f --- /dev/null +++ b/src/wsi/none/wsi_platform_none.h @@ -0,0 +1,17 @@ +#pragma once + +#include "../wsi_monitor.h" + +namespace dxvk::wsi { + + /** + * \brief Impl-dependent state + */ + struct DxvkWindowState { + }; + + inline bool isDisplayValid(int32_t displayId) { + return false; + } + +} diff --git a/src/wsi/none/wsi_window_none.cpp b/src/wsi/none/wsi_window_none.cpp new file mode 100644 index 00000000..87a14af0 --- /dev/null +++ b/src/wsi/none/wsi_window_none.cpp @@ -0,0 +1,91 @@ +#include "../wsi_window.h" + +#include "native/wsi/native_wsi.h" +#include "wsi_platform_none.h" + +#include "../../util/util_string.h" +#include "../../util/log/log.h" + +namespace dxvk::wsi { + + void getWindowSize( + HWND hWindow, + uint32_t* pWidth, + uint32_t* pHeight) { + } + + + void resizeWindow( + HWND hWindow, + DxvkWindowState* pState, + uint32_t Width, + uint32_t Height) { + } + + + bool setWindowMode( + HMONITOR hMonitor, + HWND hWindow, + const WsiMode& pMode) { + return false; + } + + + + bool enterFullscreenMode( + HMONITOR hMonitor, + HWND hWindow, + DxvkWindowState* pState, + bool ModeSwitch) { + return false; + } + + + bool leaveFullscreenMode( + HWND hWindow, + DxvkWindowState* pState, + bool restoreCoordinates) { + return false; + } + + + bool restoreDisplayMode() { + return false; + } + + + HMONITOR getWindowMonitor(HWND hWindow) { + return nullptr; + } + + + bool isWindow(HWND hWindow) { + return false; + } + + + void updateFullscreenWindow( + HMONITOR hMonitor, + HWND hWindow, + bool forceTopmost) { + } + + + VkResult createSurface( + HWND hWindow, + PFN_vkGetInstanceProcAddr pfnVkGetInstanceProcAddr, + VkInstance instance, + VkSurfaceKHR* pSurface) { + auto pfnVkCreateHeadlessSurfaceEXT = reinterpret_cast( + pfnVkGetInstanceProcAddr(instance, "vkCreateHeadlessSurfaceEXT")); + + if (!pfnVkCreateHeadlessSurfaceEXT) + return VK_ERROR_FEATURE_NOT_PRESENT; + + VkHeadlessSurfaceCreateInfoEXT info = { VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT }; + info.pNext = nullptr; + info.flags = 0; + return pfnVkCreateHeadlessSurfaceEXT(instance, &info, nullptr, pSurface); + } + +} diff --git a/src/wsi/wsi_platform.h b/src/wsi/wsi_platform.h index 38b5c5aa..c7f4f497 100644 --- a/src/wsi/wsi_platform.h +++ b/src/wsi/wsi_platform.h @@ -6,4 +6,6 @@ #include "sdl2/wsi_platform_sdl2.h" #elif defined(DXVK_WSI_GLFW) #include "glfw/wsi_platform_glfw.h" +#elif defined(DXVK_WSI_NONE) +#include "none/wsi_platform_none.h" #endif