dxvk/src/dxgi/dxgi_factory.cpp

135 lines
3.4 KiB
C++
Raw Normal View History

2017-10-11 02:09:04 +01:00
#include "dxgi_factory.h"
#include "dxgi_swapchain.h"
namespace dxvk {
DxgiFactory::DxgiFactory()
2017-10-11 14:31:36 +01:00
: m_instance(new DxvkInstance()),
m_adapters(m_instance->enumAdapters()) {
2018-03-06 23:23:06 +00:00
for (const auto& adapter : m_adapters)
adapter->logAdapterInfo();
2017-10-11 02:09:04 +01:00
}
DxgiFactory::~DxgiFactory() {
2017-11-26 13:01:41 +00:00
2017-10-11 02:09:04 +01:00
}
HRESULT STDMETHODCALLTYPE DxgiFactory::QueryInterface(REFIID riid, void** ppvObject) {
*ppvObject = nullptr;
if (riid == __uuidof(IUnknown)
|| riid == __uuidof(IDXGIObject)
|| riid == __uuidof(IDXGIFactory)
|| riid == __uuidof(IDXGIFactory1)) {
*ppvObject = ref(this);
return S_OK;
}
2017-10-11 02:09:04 +01:00
Logger::warn("DxgiFactory::QueryInterface: Unknown interface query");
Logger::warn(str::format(riid));
2017-10-11 02:09:04 +01:00
return E_NOINTERFACE;
}
2017-12-12 11:50:52 +00:00
HRESULT STDMETHODCALLTYPE DxgiFactory::GetParent(
2017-10-11 02:09:04 +01:00
REFIID riid,
void** ppParent) {
InitReturnPtr(ppParent);
2017-10-11 02:09:04 +01:00
Logger::warn("DxgiFactory::GetParent: Unknown interface query");
return E_NOINTERFACE;
}
2017-12-12 11:50:52 +00:00
HRESULT STDMETHODCALLTYPE DxgiFactory::CreateSoftwareAdapter(
2017-10-11 02:09:04 +01:00
HMODULE Module,
IDXGIAdapter** ppAdapter) {
InitReturnPtr(ppAdapter);
if (ppAdapter == nullptr)
return DXGI_ERROR_INVALID_CALL;
2017-10-11 02:09:04 +01:00
Logger::err("DxgiFactory::CreateSoftwareAdapter: Software adapters not supported");
return DXGI_ERROR_UNSUPPORTED;
}
2017-12-12 11:50:52 +00:00
HRESULT STDMETHODCALLTYPE DxgiFactory::CreateSwapChain(
2017-10-11 02:09:04 +01:00
IUnknown* pDevice,
DXGI_SWAP_CHAIN_DESC* pDesc,
IDXGISwapChain** ppSwapChain) {
InitReturnPtr(ppSwapChain);
if (ppSwapChain == nullptr || pDesc == nullptr || pDevice == NULL)
return DXGI_ERROR_INVALID_CALL;
if (pDesc->OutputWindow == nullptr)
return DXGI_ERROR_INVALID_CALL;
2017-10-11 15:22:13 +01:00
try {
*ppSwapChain = ref(new DxgiSwapChain(this, pDevice, pDesc));
return S_OK;
} catch (const DxvkError& e) {
Logger::err(e.message());
return E_FAIL;
}
2017-10-11 02:09:04 +01:00
}
2017-12-12 11:50:52 +00:00
HRESULT STDMETHODCALLTYPE DxgiFactory::EnumAdapters(
2017-10-11 02:09:04 +01:00
UINT Adapter,
IDXGIAdapter** ppAdapter) {
InitReturnPtr(ppAdapter);
2017-10-11 02:09:04 +01:00
if (ppAdapter == nullptr)
return DXGI_ERROR_INVALID_CALL;
IDXGIAdapter1* handle = nullptr;
HRESULT hr = this->EnumAdapters1(Adapter, &handle);
*ppAdapter = handle;
return hr;
}
2017-12-12 11:50:52 +00:00
HRESULT STDMETHODCALLTYPE DxgiFactory::EnumAdapters1(
UINT Adapter,
IDXGIAdapter1** ppAdapter) {
InitReturnPtr(ppAdapter);
if (ppAdapter == nullptr)
return DXGI_ERROR_INVALID_CALL;
if (Adapter >= m_adapters.size())
2017-10-11 02:09:04 +01:00
return DXGI_ERROR_NOT_FOUND;
2017-10-11 14:31:36 +01:00
*ppAdapter = ref(new DxgiAdapter(
this, m_adapters.at(Adapter)));
2017-10-11 02:09:04 +01:00
return S_OK;
}
2017-12-12 11:50:52 +00:00
HRESULT STDMETHODCALLTYPE DxgiFactory::GetWindowAssociation(HWND *pWindowHandle) {
2017-10-11 02:09:04 +01:00
if (pWindowHandle == nullptr)
return DXGI_ERROR_INVALID_CALL;
*pWindowHandle = m_associatedWindow;
return S_OK;
}
2017-12-12 11:50:52 +00:00
HRESULT STDMETHODCALLTYPE DxgiFactory::MakeWindowAssociation(HWND WindowHandle, UINT Flags) {
2017-10-11 02:09:04 +01:00
Logger::warn("DxgiFactory::MakeWindowAssociation: Ignoring flags");
m_associatedWindow = WindowHandle;
return S_OK;
}
2017-12-12 11:50:52 +00:00
BOOL STDMETHODCALLTYPE DxgiFactory::IsCurrent() {
Logger::warn("DxgiFactory::IsCurrent: Stub");
return TRUE;
}
2017-10-11 02:09:04 +01:00
}