diff options
Diffstat (limited to 'src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_monitor.cpp')
-rw-r--r-- | src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_monitor.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_monitor.cpp b/src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_monitor.cpp new file mode 100644 index 00000000..16b376fa --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_monitor.cpp @@ -0,0 +1,111 @@ +#include "dxgi_monitor.h" + +namespace dxvk { + + DxgiMonitorInfo::DxgiMonitorInfo(IUnknown* pParent) + : m_parent(pParent) { + + } + + + DxgiMonitorInfo::~DxgiMonitorInfo() { + + } + + + ULONG STDMETHODCALLTYPE DxgiMonitorInfo::AddRef() { + return m_parent->AddRef(); + } + + + ULONG STDMETHODCALLTYPE DxgiMonitorInfo::Release() { + return m_parent->Release(); + } + + + HRESULT STDMETHODCALLTYPE DxgiMonitorInfo::QueryInterface( + REFIID riid, + void** ppvObject) { + return m_parent->QueryInterface(riid, ppvObject); + } + + + HRESULT STDMETHODCALLTYPE DxgiMonitorInfo::InitMonitorData( + HMONITOR hMonitor, + const DXGI_VK_MONITOR_DATA* pData) { + if (!hMonitor || !pData) + return E_INVALIDARG; + + std::lock_guard<dxvk::mutex> lock(m_monitorMutex); + auto result = m_monitorData.insert({ hMonitor, *pData }); + + return result.second ? S_OK : E_INVALIDARG; + } + + + HRESULT STDMETHODCALLTYPE DxgiMonitorInfo::AcquireMonitorData( + HMONITOR hMonitor, + DXGI_VK_MONITOR_DATA** ppData) { + InitReturnPtr(ppData); + + if (!hMonitor || !ppData) + return E_INVALIDARG; + + m_monitorMutex.lock(); + + auto entry = m_monitorData.find(hMonitor); + if (entry == m_monitorData.end()) { + m_monitorMutex.unlock(); + return DXGI_ERROR_NOT_FOUND; + } + + *ppData = &entry->second; + return S_OK; + } + + + void STDMETHODCALLTYPE DxgiMonitorInfo::ReleaseMonitorData() { + m_monitorMutex.unlock(); + } + + + uint32_t GetMonitorFormatBpp(DXGI_FORMAT Format) { + switch (Format) { + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DXGI_FORMAT_R10G10B10A2_UNORM: + return 32; + + case DXGI_FORMAT_R16G16B16A16_FLOAT: + return 64; + + default: + Logger::warn(str::format( + "GetMonitorFormatBpp: Unknown format: ", + Format)); + return 32; + } + } + + DXGI_FORMAT GetBppMonitorFormat(uint32_t bpp) { + switch (bpp) { + case 32: + return DXGI_FORMAT_R8G8B8A8_UNORM; + + case 64: + return DXGI_FORMAT_R16G16B16A16_FLOAT; + + default: + Logger::warn(str::format( + "GetBppMonitorFormat: Unknown bpp: ", + bpp)); + return DXGI_FORMAT_R8G8B8A8_UNORM; + } + } + + +}
\ No newline at end of file |