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:
parent
f03d87b918
commit
9af842801c
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user