mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-21 02:52:10 +01:00
186 lines
4.6 KiB
C++
186 lines
4.6 KiB
C++
#include "wsi_platform.h"
|
|
#include "wsi_monitor.h"
|
|
#include "wsi_window.h"
|
|
#include "../util/util_env.h"
|
|
#include "../util/util_error.h"
|
|
|
|
namespace dxvk::wsi {
|
|
static WsiDriver* s_driver = nullptr;
|
|
static int s_refcount = 0;
|
|
|
|
static const WsiBootstrap *wsiBootstrap[] = {
|
|
#if defined(DXVK_WSI_WIN32)
|
|
&Win32WSI,
|
|
#endif
|
|
#if defined(DXVK_WSI_SDL2)
|
|
&Sdl2WSI,
|
|
#endif
|
|
#if defined(DXVK_WSI_GLFW)
|
|
&GlfwWSI,
|
|
#endif
|
|
};
|
|
|
|
void init() {
|
|
if (s_refcount++ > 0)
|
|
return;
|
|
|
|
std::string hint = dxvk::env::getEnvVar("DXVK_WSI_DRIVER");
|
|
if (hint == "") {
|
|
// At least for Windows, it is reasonable to fall back to a default;
|
|
// for other platforms however we _need_ to know which WSI to use!
|
|
#if defined(DXVK_WSI_WIN32)
|
|
hint = "Win32";
|
|
#else
|
|
throw DxvkError("DXVK_WSI_DRIVER environment variable unset");
|
|
#endif
|
|
}
|
|
|
|
bool success = false;
|
|
for (const WsiBootstrap *b : wsiBootstrap) {
|
|
if (hint == b->name && b->createDriver(&s_driver)) {
|
|
success = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!success)
|
|
throw DxvkError("Failed to initialize WSI.");
|
|
}
|
|
|
|
void quit() {
|
|
if (s_refcount == 0)
|
|
return;
|
|
|
|
s_refcount--;
|
|
if (s_refcount == 0) {
|
|
delete s_driver;
|
|
s_driver = nullptr;
|
|
}
|
|
}
|
|
|
|
std::vector<const char *> getInstanceExtensions() {
|
|
return s_driver->getInstanceExtensions();
|
|
}
|
|
|
|
void getWindowSize(
|
|
HWND hWindow,
|
|
uint32_t* pWidth,
|
|
uint32_t* pHeight) {
|
|
s_driver->getWindowSize(hWindow, pWidth, pHeight);
|
|
}
|
|
|
|
void resizeWindow(
|
|
HWND hWindow,
|
|
DxvkWindowState* pState,
|
|
uint32_t width,
|
|
uint32_t height) {
|
|
s_driver->resizeWindow(hWindow, pState, width, height);
|
|
}
|
|
|
|
bool setWindowMode(
|
|
HMONITOR hMonitor,
|
|
HWND hWindow,
|
|
const WsiMode& mode) {
|
|
return s_driver->setWindowMode(hMonitor, hWindow, mode);
|
|
}
|
|
|
|
bool enterFullscreenMode(
|
|
HMONITOR hMonitor,
|
|
HWND hWindow,
|
|
DxvkWindowState* pState,
|
|
[[maybe_unused]]
|
|
bool modeSwitch) {
|
|
return s_driver->enterFullscreenMode(hMonitor, hWindow, pState, modeSwitch);
|
|
}
|
|
|
|
bool leaveFullscreenMode(
|
|
HWND hWindow,
|
|
DxvkWindowState* pState,
|
|
bool restoreCoordinates) {
|
|
return s_driver->leaveFullscreenMode(hWindow, pState, restoreCoordinates);
|
|
}
|
|
|
|
bool restoreDisplayMode() {
|
|
return s_driver->restoreDisplayMode();
|
|
}
|
|
|
|
HMONITOR getWindowMonitor(HWND hWindow) {
|
|
return s_driver->getWindowMonitor(hWindow);
|
|
}
|
|
|
|
bool isWindow(HWND hWindow) {
|
|
return s_driver->isWindow(hWindow);
|
|
}
|
|
|
|
bool isMinimized(HWND hWindow) {
|
|
return s_driver->isMinimized(hWindow);
|
|
}
|
|
|
|
bool isOccluded(HWND hWindow) {
|
|
return s_driver->isOccluded(hWindow);
|
|
}
|
|
|
|
void updateFullscreenWindow(
|
|
HMONITOR hMonitor,
|
|
HWND hWindow,
|
|
bool forceTopmost) {
|
|
s_driver->updateFullscreenWindow(hMonitor, hWindow, forceTopmost);
|
|
}
|
|
|
|
VkResult createSurface(
|
|
HWND hWindow,
|
|
PFN_vkGetInstanceProcAddr pfnVkGetInstanceProcAddr,
|
|
VkInstance instance,
|
|
VkSurfaceKHR* pSurface) {
|
|
return s_driver->createSurface(hWindow, pfnVkGetInstanceProcAddr, instance, pSurface);
|
|
}
|
|
|
|
HMONITOR getDefaultMonitor() {
|
|
return s_driver->getDefaultMonitor();
|
|
}
|
|
|
|
HMONITOR enumMonitors(uint32_t index) {
|
|
return s_driver->enumMonitors(index);
|
|
}
|
|
|
|
HMONITOR enumMonitors(const LUID *adapterLUID[], uint32_t numLUIDs, uint32_t index) {
|
|
return s_driver->enumMonitors(adapterLUID, numLUIDs, index);
|
|
}
|
|
|
|
bool getDisplayName(
|
|
HMONITOR hMonitor,
|
|
WCHAR (&Name)[32]) {
|
|
return s_driver->getDisplayName(hMonitor, Name);
|
|
}
|
|
|
|
bool getDesktopCoordinates(
|
|
HMONITOR hMonitor,
|
|
RECT* pRect) {
|
|
return s_driver->getDesktopCoordinates(hMonitor, pRect);
|
|
}
|
|
|
|
bool getDisplayMode(
|
|
HMONITOR hMonitor,
|
|
uint32_t modeNumber,
|
|
WsiMode* pMode) {
|
|
return s_driver->getDisplayMode(hMonitor, modeNumber, pMode);
|
|
}
|
|
|
|
bool getCurrentDisplayMode(
|
|
HMONITOR hMonitor,
|
|
WsiMode* pMode) {
|
|
return s_driver->getCurrentDisplayMode(hMonitor, pMode);
|
|
}
|
|
|
|
bool getDesktopDisplayMode(
|
|
HMONITOR hMonitor,
|
|
WsiMode* pMode) {
|
|
return s_driver->getDesktopDisplayMode(hMonitor, pMode);
|
|
}
|
|
|
|
WsiEdidData getMonitorEdid(HMONITOR hMonitor) {
|
|
return s_driver->getMonitorEdid(hMonitor);
|
|
}
|
|
|
|
}
|