1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#include "../wsi_mode.h"
#include "../../util/log/log.h"
namespace dxvk::wsi {
static inline void convertMode(const DEVMODEW& mode, WsiMode* pMode) {
pMode->width = mode.dmPelsWidth;
pMode->height = mode.dmPelsHeight;
pMode->refreshRate = WsiRational{ mode.dmDisplayFrequency * 1000, 1000 };
pMode->bitsPerPixel = mode.dmBitsPerPel;
pMode->interlaced = mode.dmDisplayFlags & DM_INTERLACED;
}
static inline bool retrieveDisplayMode(
HMONITOR hMonitor,
DWORD ModeNumber,
WsiMode* pMode) {
// Query monitor info to get the device name
::MONITORINFOEXW monInfo;
monInfo.cbSize = sizeof(monInfo);
if (!::GetMonitorInfoW(hMonitor, reinterpret_cast<MONITORINFO*>(&monInfo))) {
Logger::err("Win32 WSI: retrieveDisplayMode: Failed to query monitor info");
return false;
}
DEVMODEW devMode = { };
devMode.dmSize = sizeof(devMode);
if (!::EnumDisplaySettingsW(monInfo.szDevice, ModeNumber, &devMode))
return false;
convertMode(devMode, pMode);
return true;
}
bool getDisplayMode(
HMONITOR hMonitor,
uint32_t ModeNumber,
WsiMode* pMode) {
return retrieveDisplayMode(hMonitor, ModeNumber, pMode);
}
bool getCurrentDisplayMode(
HMONITOR hMonitor,
WsiMode* pMode) {
return retrieveDisplayMode(hMonitor, ENUM_CURRENT_SETTINGS, pMode);
}
bool getDesktopDisplayMode(
HMONITOR hMonitor,
WsiMode* pMode) {
return retrieveDisplayMode(hMonitor, ENUM_REGISTRY_SETTINGS, pMode);
}
}
|