mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-05 19:46:15 +01:00
106 lines
2.8 KiB
C++
106 lines
2.8 KiB
C++
|
#include <cstdlib>
|
||
|
#include <cstring>
|
||
|
|
||
|
#include "dxgi_adapter.h"
|
||
|
#include "dxgi_factory.h"
|
||
|
#include "dxgi_output.h"
|
||
|
|
||
|
namespace dxvk {
|
||
|
|
||
|
DxgiAdapter::DxgiAdapter(
|
||
|
DxgiFactory* factory,
|
||
|
const Rc<DxvkAdapter>& 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, IDXGIAdapter);
|
||
|
|
||
|
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<uint32_t>(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;
|
||
|
}
|
||
|
|
||
|
}
|