#include #include #include "dxgi_adapter.h" #include "dxgi_factory.h" #include "dxgi_output.h" namespace dxvk { DxgiAdapter::DxgiAdapter( DxgiFactory* factory, const Rc& adapter) : m_factory (factory), m_adapter (adapter) { TRACE(this, factory, adapter); } DxgiAdapter::~DxgiAdapter() { TRACE(this); } HRESULT DxgiAdapter::QueryInterface( REFIID riid, void **ppvObject) { COM_QUERY_IFACE(riid, ppvObject, IUnknown); COM_QUERY_IFACE(riid, ppvObject, IDXGIObject); COM_QUERY_IFACE(riid, ppvObject, IDXGIAdapter); COM_QUERY_IFACE(riid, ppvObject, IDXVKAdapter); Logger::warn("DxgiAdapter::QueryInterface: Unknown interface query"); return E_NOINTERFACE; } HRESULT DxgiAdapter::GetParent( REFIID riid, void **ppParent) { return m_factory->QueryInterface(riid, ppParent); } HRESULT DxgiAdapter::CheckInterfaceSupport( REFGUID InterfaceName, LARGE_INTEGER *pUMDVersion) { Logger::err("DxgiAdapter::CheckInterfaceSupport: No D3D10 support"); return DXGI_ERROR_UNSUPPORTED; } HRESULT DxgiAdapter::EnumOutputs( UINT Output, IDXGIOutput **ppOutput) { TRACE(this, Output, ppOutput); if (ppOutput == nullptr) return DXGI_ERROR_INVALID_CALL; int numDisplays = SDL_GetNumVideoDisplays(); if (numDisplays < 0) { Logger::err("DxgiAdapter::EnumOutputs: Failed to query display count"); return DXGI_ERROR_DRIVER_INTERNAL_ERROR; } if (Output >= static_cast(numDisplays)) return DXGI_ERROR_NOT_FOUND; *ppOutput = ref(new DxgiOutput(this, Output)); return S_OK; } HRESULT DxgiAdapter::GetDesc(DXGI_ADAPTER_DESC* pDesc) { if (pDesc == nullptr) return DXGI_ERROR_INVALID_CALL; const auto deviceProp = m_adapter->deviceProperties(); const auto memoryProp = m_adapter->memoryProperties(); std::memset(pDesc->Description, 0, sizeof(pDesc->Description)); std::mbstowcs(pDesc->Description, deviceProp.deviceName, _countof(pDesc->Description) - 1); VkDeviceSize deviceMemory = 0; VkDeviceSize sharedMemory = 0; for (uint32_t i = 0; i < memoryProp.memoryHeapCount; i++) { VkMemoryHeap heap = memoryProp.memoryHeaps[i]; if (heap.flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) deviceMemory += heap.size; else sharedMemory += heap.size; } pDesc->VendorId = deviceProp.vendorID; pDesc->DeviceId = deviceProp.deviceID; pDesc->SubSysId = 0; pDesc->Revision = 0; pDesc->DedicatedVideoMemory = deviceMemory; pDesc->DedicatedSystemMemory = 0; pDesc->SharedSystemMemory = sharedMemory; pDesc->AdapterLuid = LUID { 0, 0 }; // TODO implement return S_OK; } Rc DxgiAdapter::GetDXVKAdapter() { return m_adapter; } }