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