1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 19:54:19 +01:00

[dxgi] Implement IDXGIFactory3

This commit is contained in:
Philip Rebohle 2018-10-11 09:56:30 +02:00
parent f03d87b918
commit 9af842801c
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 25 additions and 24 deletions

View File

@ -3,9 +3,10 @@
namespace dxvk {
DxgiFactory::DxgiFactory()
DxgiFactory::DxgiFactory(UINT Flags)
: m_instance(new DxvkInstance()),
m_options (m_instance->config()) {
m_options (m_instance->config()),
m_flags (Flags) {
for (uint32_t i = 0; m_instance->enumAdapters(i) != nullptr; i++)
m_instance->enumAdapters(i)->logAdapterInfo();
}
@ -23,7 +24,8 @@ namespace dxvk {
|| riid == __uuidof(IDXGIObject)
|| riid == __uuidof(IDXGIFactory)
|| riid == __uuidof(IDXGIFactory1)
|| riid == __uuidof(IDXGIFactory2)) {
|| riid == __uuidof(IDXGIFactory2)
|| riid == __uuidof(IDXGIFactory3)) {
*ppvObject = ref(this);
return S_OK;
}
@ -266,5 +268,10 @@ namespace dxvk {
DWORD dwCookie) {
Logger::err("DxgiFactory::UnregisterOcclusionStatus: Not implemented");
}
UINT STDMETHODCALLTYPE DxgiFactory::GetCreationFlags() {
return m_flags;
}
}

View File

@ -9,11 +9,11 @@
namespace dxvk {
class DxgiFactory : public DxgiObject<IDXGIFactory2> {
class DxgiFactory : public DxgiObject<IDXGIFactory3> {
public:
DxgiFactory();
DxgiFactory(UINT Flags);
~DxgiFactory();
HRESULT STDMETHODCALLTYPE QueryInterface(
@ -101,6 +101,8 @@ namespace dxvk {
void STDMETHODCALLTYPE UnregisterOcclusionStatus(
DWORD dwCookie) final;
UINT STDMETHODCALLTYPE GetCreationFlags() final;
const DxgiOptions* GetOptions() const {
return &m_options;
}
@ -109,6 +111,7 @@ namespace dxvk {
Rc<DxvkInstance> m_instance;
DxgiOptions m_options;
UINT m_flags;
HWND m_associatedWindow = nullptr;

View File

@ -5,37 +5,28 @@ namespace dxvk {
Logger Logger::s_instance("dxgi.log");
HRESULT createDxgiFactory(REFIID riid, void **ppFactory) {
if (riid != __uuidof(IDXGIFactory)
&& riid != __uuidof(IDXGIFactory1)
&& riid != __uuidof(IDXGIFactory2)) {
Logger::err("CreateDXGIFactory: Requested version of IDXGIFactory not supported");
Logger::err(str::format(riid));
*ppFactory = nullptr;
return E_NOINTERFACE;
}
try {
*ppFactory = ref(new DxgiFactory());
return S_OK;
} catch (const DxvkError& err) {
Logger::err(err.message());
HRESULT createDxgiFactory(UINT Flags, REFIID riid, void **ppFactory) {
Com<DxgiFactory> factory = new DxgiFactory(Flags);
HRESULT hr = factory->QueryInterface(riid, ppFactory);
if (FAILED(hr))
return DXGI_ERROR_UNSUPPORTED;
}
return S_OK;
}
}
extern "C" {
DLLEXPORT HRESULT __stdcall CreateDXGIFactory2(UINT Flags, REFIID riid, void **ppFactory) {
dxvk::Logger::warn("CreateDXGIFactory2: Ignoring flags");
return dxvk::createDxgiFactory(riid, ppFactory);
return dxvk::createDxgiFactory(Flags, riid, ppFactory);
}
DLLEXPORT HRESULT __stdcall CreateDXGIFactory1(REFIID riid, void **ppFactory) {
return dxvk::createDxgiFactory(riid, ppFactory);
return dxvk::createDxgiFactory(0, riid, ppFactory);
}
DLLEXPORT HRESULT __stdcall CreateDXGIFactory(REFIID riid, void **ppFactory) {
return dxvk::createDxgiFactory(riid, ppFactory);
return dxvk::createDxgiFactory(0, riid, ppFactory);
}
}