1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-21 02:52:10 +01:00
dxvk/src/wsi/wsi_platform.cpp

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);
}
}