mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-22 16:54:27 +01:00
[dxgi] Implement IDXGIFactory3
This commit is contained in:
parent
f03d87b918
commit
9af842801c
@ -3,9 +3,10 @@
|
|||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
DxgiFactory::DxgiFactory()
|
DxgiFactory::DxgiFactory(UINT Flags)
|
||||||
: m_instance(new DxvkInstance()),
|
: 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++)
|
for (uint32_t i = 0; m_instance->enumAdapters(i) != nullptr; i++)
|
||||||
m_instance->enumAdapters(i)->logAdapterInfo();
|
m_instance->enumAdapters(i)->logAdapterInfo();
|
||||||
}
|
}
|
||||||
@ -23,7 +24,8 @@ namespace dxvk {
|
|||||||
|| riid == __uuidof(IDXGIObject)
|
|| riid == __uuidof(IDXGIObject)
|
||||||
|| riid == __uuidof(IDXGIFactory)
|
|| riid == __uuidof(IDXGIFactory)
|
||||||
|| riid == __uuidof(IDXGIFactory1)
|
|| riid == __uuidof(IDXGIFactory1)
|
||||||
|| riid == __uuidof(IDXGIFactory2)) {
|
|| riid == __uuidof(IDXGIFactory2)
|
||||||
|
|| riid == __uuidof(IDXGIFactory3)) {
|
||||||
*ppvObject = ref(this);
|
*ppvObject = ref(this);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
@ -267,4 +269,9 @@ namespace dxvk {
|
|||||||
Logger::err("DxgiFactory::UnregisterOcclusionStatus: Not implemented");
|
Logger::err("DxgiFactory::UnregisterOcclusionStatus: Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UINT STDMETHODCALLTYPE DxgiFactory::GetCreationFlags() {
|
||||||
|
return m_flags;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,11 +9,11 @@
|
|||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
class DxgiFactory : public DxgiObject<IDXGIFactory2> {
|
class DxgiFactory : public DxgiObject<IDXGIFactory3> {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
DxgiFactory();
|
DxgiFactory(UINT Flags);
|
||||||
~DxgiFactory();
|
~DxgiFactory();
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE QueryInterface(
|
HRESULT STDMETHODCALLTYPE QueryInterface(
|
||||||
@ -101,6 +101,8 @@ namespace dxvk {
|
|||||||
void STDMETHODCALLTYPE UnregisterOcclusionStatus(
|
void STDMETHODCALLTYPE UnregisterOcclusionStatus(
|
||||||
DWORD dwCookie) final;
|
DWORD dwCookie) final;
|
||||||
|
|
||||||
|
UINT STDMETHODCALLTYPE GetCreationFlags() final;
|
||||||
|
|
||||||
const DxgiOptions* GetOptions() const {
|
const DxgiOptions* GetOptions() const {
|
||||||
return &m_options;
|
return &m_options;
|
||||||
}
|
}
|
||||||
@ -109,6 +111,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
Rc<DxvkInstance> m_instance;
|
Rc<DxvkInstance> m_instance;
|
||||||
DxgiOptions m_options;
|
DxgiOptions m_options;
|
||||||
|
UINT m_flags;
|
||||||
|
|
||||||
HWND m_associatedWindow = nullptr;
|
HWND m_associatedWindow = nullptr;
|
||||||
|
|
||||||
|
@ -5,37 +5,28 @@ namespace dxvk {
|
|||||||
|
|
||||||
Logger Logger::s_instance("dxgi.log");
|
Logger Logger::s_instance("dxgi.log");
|
||||||
|
|
||||||
HRESULT createDxgiFactory(REFIID riid, void **ppFactory) {
|
HRESULT createDxgiFactory(UINT Flags, REFIID riid, void **ppFactory) {
|
||||||
if (riid != __uuidof(IDXGIFactory)
|
Com<DxgiFactory> factory = new DxgiFactory(Flags);
|
||||||
&& riid != __uuidof(IDXGIFactory1)
|
HRESULT hr = factory->QueryInterface(riid, ppFactory);
|
||||||
&& riid != __uuidof(IDXGIFactory2)) {
|
|
||||||
Logger::err("CreateDXGIFactory: Requested version of IDXGIFactory not supported");
|
|
||||||
Logger::err(str::format(riid));
|
|
||||||
*ppFactory = nullptr;
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
if (FAILED(hr))
|
||||||
*ppFactory = ref(new DxgiFactory());
|
|
||||||
return S_OK;
|
|
||||||
} catch (const DxvkError& err) {
|
|
||||||
Logger::err(err.message());
|
|
||||||
return DXGI_ERROR_UNSUPPORTED;
|
return DXGI_ERROR_UNSUPPORTED;
|
||||||
}
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
DLLEXPORT HRESULT __stdcall CreateDXGIFactory2(UINT Flags, REFIID riid, void **ppFactory) {
|
DLLEXPORT HRESULT __stdcall CreateDXGIFactory2(UINT Flags, REFIID riid, void **ppFactory) {
|
||||||
dxvk::Logger::warn("CreateDXGIFactory2: Ignoring flags");
|
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) {
|
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) {
|
DLLEXPORT HRESULT __stdcall CreateDXGIFactory(REFIID riid, void **ppFactory) {
|
||||||
return dxvk::createDxgiFactory(riid, ppFactory);
|
return dxvk::createDxgiFactory(0, riid, ppFactory);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user