mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-03 22:24:13 +01:00
[dxgi] Implement IDXGIVkMonitorInfo for DxgiFactory
This commit is contained in:
parent
cfdac13ea5
commit
7d5b5f288c
@ -4,9 +4,10 @@
|
|||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
DxgiFactory::DxgiFactory(UINT Flags)
|
DxgiFactory::DxgiFactory(UINT Flags)
|
||||||
: m_instance(new DxvkInstance()),
|
: m_instance (new DxvkInstance()),
|
||||||
m_options (m_instance->config()),
|
m_monitorInfo (this),
|
||||||
m_flags (Flags) {
|
m_options (m_instance->config()),
|
||||||
|
m_flags (Flags) {
|
||||||
for (uint32_t i = 0; m_instance->enumAdapters(i) != nullptr; i++)
|
for (uint32_t i = 0; m_instance->enumAdapters(i) != nullptr; i++)
|
||||||
m_instance->enumAdapters(i)->logAdapterInfo();
|
m_instance->enumAdapters(i)->logAdapterInfo();
|
||||||
}
|
}
|
||||||
@ -33,6 +34,11 @@ namespace dxvk {
|
|||||||
*ppvObject = ref(this);
|
*ppvObject = ref(this);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (riid == __uuidof(IDXGIVkMonitorInfo)) {
|
||||||
|
*ppvObject = ref(&m_monitorInfo);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
Logger::warn("DxgiFactory::QueryInterface: Unknown interface query");
|
Logger::warn("DxgiFactory::QueryInterface: Unknown interface query");
|
||||||
Logger::warn(str::format(riid));
|
Logger::warn(str::format(riid));
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "dxgi_adapter.h"
|
#include "dxgi_adapter.h"
|
||||||
|
#include "dxgi_monitor.h"
|
||||||
#include "dxgi_options.h"
|
#include "dxgi_options.h"
|
||||||
|
|
||||||
#include "../dxvk/dxvk_instance.h"
|
#include "../dxvk/dxvk_instance.h"
|
||||||
@ -119,6 +120,7 @@ namespace dxvk {
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
Rc<DxvkInstance> m_instance;
|
Rc<DxvkInstance> m_instance;
|
||||||
|
DxgiMonitorInfo m_monitorInfo;
|
||||||
DxgiOptions m_options;
|
DxgiOptions m_options;
|
||||||
UINT m_flags;
|
UINT m_flags;
|
||||||
|
|
||||||
|
@ -6,6 +6,73 @@ namespace dxvk {
|
|||||||
std::unordered_map<HMONITOR, DXGI_VK_MONITOR_DATA> g_monitorData;
|
std::unordered_map<HMONITOR, DXGI_VK_MONITOR_DATA> g_monitorData;
|
||||||
|
|
||||||
|
|
||||||
|
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<std::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) {
|
uint32_t GetMonitorFormatBpp(DXGI_FORMAT Format) {
|
||||||
switch (Format) {
|
switch (Format) {
|
||||||
case DXGI_FORMAT_R8G8B8A8_UNORM:
|
case DXGI_FORMAT_R8G8B8A8_UNORM:
|
||||||
|
@ -9,6 +9,42 @@ namespace dxvk {
|
|||||||
|
|
||||||
class DxgiSwapChain;
|
class DxgiSwapChain;
|
||||||
|
|
||||||
|
class DxgiMonitorInfo : public IDXGIVkMonitorInfo {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
DxgiMonitorInfo(IUnknown* pParent);
|
||||||
|
|
||||||
|
~DxgiMonitorInfo();
|
||||||
|
|
||||||
|
ULONG STDMETHODCALLTYPE AddRef();
|
||||||
|
|
||||||
|
ULONG STDMETHODCALLTYPE Release();
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE QueryInterface(
|
||||||
|
REFIID riid,
|
||||||
|
void** ppvObject);
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE InitMonitorData(
|
||||||
|
HMONITOR hMonitor,
|
||||||
|
const DXGI_VK_MONITOR_DATA* pData);
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE AcquireMonitorData(
|
||||||
|
HMONITOR hMonitor,
|
||||||
|
DXGI_VK_MONITOR_DATA** ppData);
|
||||||
|
|
||||||
|
void STDMETHODCALLTYPE ReleaseMonitorData();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
IUnknown* m_parent;
|
||||||
|
|
||||||
|
std::mutex m_monitorMutex;
|
||||||
|
std::unordered_map<HMONITOR, DXGI_VK_MONITOR_DATA> m_monitorData;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Queries bits per pixel for a format
|
* \brief Queries bits per pixel for a format
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user