diff options
Diffstat (limited to 'src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_adapter.h')
-rw-r--r-- | src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_adapter.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_adapter.h b/src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_adapter.h new file mode 100644 index 00000000..ef17d7ff --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/src/dxgi/dxgi_adapter.h @@ -0,0 +1,129 @@ +#pragma once + +#include <mutex> +#include <unordered_map> + +#include "dxgi_format.h" +#include "dxgi_interfaces.h" +#include "dxgi_output.h" + +namespace dxvk { + + class DxgiAdapter; + class DxgiFactory; + class DxgiOutput; + + + class DxgiVkAdapter : public IDXGIVkInteropAdapter { + + public: + + DxgiVkAdapter(DxgiAdapter* pAdapter); + + ULONG STDMETHODCALLTYPE AddRef(); + + ULONG STDMETHODCALLTYPE Release(); + + HRESULT STDMETHODCALLTYPE QueryInterface( + REFIID riid, + void** ppvObject); + + void STDMETHODCALLTYPE GetVulkanHandles( + VkInstance* pInstance, + VkPhysicalDevice* pPhysDev); + + private: + + DxgiAdapter* m_adapter; + + }; + + + class DxgiAdapter : public DxgiObject<IDXGIDXVKAdapter> { + + public: + + DxgiAdapter( + DxgiFactory* factory, + const Rc<DxvkAdapter>& adapter, + UINT index); + + ~DxgiAdapter(); + + HRESULT STDMETHODCALLTYPE QueryInterface( + REFIID riid, + void** ppvObject) final; + + HRESULT STDMETHODCALLTYPE GetParent( + REFIID riid, + void** ppParent) final; + + HRESULT STDMETHODCALLTYPE CheckInterfaceSupport( + REFGUID InterfaceName, + LARGE_INTEGER* pUMDVersion) final; + + HRESULT STDMETHODCALLTYPE EnumOutputs( + UINT Output, + IDXGIOutput** ppOutput) final; + + HRESULT STDMETHODCALLTYPE GetDesc( + DXGI_ADAPTER_DESC* pDesc) final; + + HRESULT STDMETHODCALLTYPE GetDesc1( + DXGI_ADAPTER_DESC1* pDesc) final; + + HRESULT STDMETHODCALLTYPE GetDesc2( + DXGI_ADAPTER_DESC2* pDesc) final; + + HRESULT STDMETHODCALLTYPE GetDesc3( + DXGI_ADAPTER_DESC3* pDesc) final; + + HRESULT STDMETHODCALLTYPE QueryVideoMemoryInfo( + UINT NodeIndex, + DXGI_MEMORY_SEGMENT_GROUP MemorySegmentGroup, + DXGI_QUERY_VIDEO_MEMORY_INFO* pVideoMemoryInfo) final; + + HRESULT STDMETHODCALLTYPE SetVideoMemoryReservation( + UINT NodeIndex, + DXGI_MEMORY_SEGMENT_GROUP MemorySegmentGroup, + UINT64 Reservation) final; + + HRESULT STDMETHODCALLTYPE RegisterHardwareContentProtectionTeardownStatusEvent( + HANDLE hEvent, + DWORD* pdwCookie) final; + + HRESULT STDMETHODCALLTYPE RegisterVideoMemoryBudgetChangeNotificationEvent( + HANDLE hEvent, + DWORD* pdwCookie) final; + + void STDMETHODCALLTYPE UnregisterHardwareContentProtectionTeardownStatus( + DWORD dwCookie) final; + + void STDMETHODCALLTYPE UnregisterVideoMemoryBudgetChangeNotification( + DWORD dwCookie) final; + + Rc<DxvkAdapter> STDMETHODCALLTYPE GetDXVKAdapter() final; + + Rc<DxvkInstance> STDMETHODCALLTYPE GetDXVKInstance() final; + + private: + + Com<DxgiFactory> m_factory; + Rc<DxvkAdapter> m_adapter; + DxgiVkAdapter m_interop; + + UINT m_index; + UINT64 m_memReservation[2] = { 0, 0 }; + + dxvk::mutex m_mutex; + dxvk::condition_variable m_cond; + + DWORD m_eventCookie = 0; + std::unordered_map<DWORD, HANDLE> m_eventMap; + dxvk::thread m_eventThread; + + void runEventThread(); + + }; + +} |