Files
bluflame/aiwaz/Aiwaz/DeviceEnumerator/DeviceEnumerator.cpp
2026-04-18 22:31:51 +02:00

142 lines
4.7 KiB
C++

#include "stdafx.h"
#include "DeviceEnumerator.h"
#include "DisplayAdapter.h"
DeviceEnumerator::DeviceEnumerator(ID3D10Device* ar_Device_)
: m_DXGIFactory(NULL)
, m_Device(ar_Device_)
, m_HasEnumerated(false)
, m_DesiredWidth(0)
, m_DesiredHeight(0)
, m_DesiredRefreshRate(0)
, m_DesiredFormat(DataFormat::Unknown)
{
HRESULT result = ::CreateDXGIFactory (__uuidof(IDXGIFactory), (void**)&m_DXGIFactory);
if (result != S_OK)
return;
}
DeviceEnumerator::~DeviceEnumerator()
{
for (uint32 i = 0; i < m_EnumeratedAdapters.size(); ++i)
delete m_EnumeratedAdapters[i];
if (m_DXGIFactory != NULL)
m_DXGIFactory->Release();
m_DXGIFactory = NULL;
}
bool DeviceEnumerator::TryEnumerate(uint32 argDesiredWidth, uint32 argDesiredHeight, uint32 argDesiredRefreshRate, DataFormat::Enumeration argDesiredFormat)
{
if (m_HasEnumerated)
{
if (m_DesiredWidth == argDesiredWidth ||
m_DesiredHeight == argDesiredHeight ||
m_DesiredRefreshRate == argDesiredRefreshRate ||
m_DesiredFormat == argDesiredFormat)
{
return true;
}
else
m_HasEnumerated = false;
}
if (m_DXGIFactory == NULL)
return false;
int adapterIndex = 0;
IDXGIAdapter* adapter = NULL;
while (m_DXGIFactory->EnumAdapters(adapterIndex, &adapter) == S_OK)
{
LARGE_INTEGER version;
if (adapter->CheckInterfaceSupport (__uuidof (ID3D10Device), &version) == S_OK)
{
IDisplayAdapter* deviceAdapter = new DisplayAdapter(adapter, m_Device);
if (deviceAdapter->TryEnumerate(argDesiredWidth, argDesiredHeight, argDesiredRefreshRate, argDesiredFormat))
m_EnumeratedAdapters.push_back(deviceAdapter);
else
delete deviceAdapter;
}
adapter->Release();
adapterIndex++;
}
m_DesiredWidth = argDesiredWidth;
m_DesiredHeight = argDesiredHeight;
m_DesiredRefreshRate = argDesiredRefreshRate;
m_DesiredFormat = argDesiredFormat;
m_HasEnumerated = !m_EnumeratedAdapters.empty();
return m_HasEnumerated;
}
IDisplayAdapter* DeviceEnumerator::FindBestAdapter(bool argAllowToEnumerate, uint32 argDesiredWidth, uint32 argDesiredHeight, uint32 argDesiredRefreshRate, DataFormat::Enumeration argDesiredFormat)
{
if (argAllowToEnumerate && !this->TryEnumerate(argDesiredWidth, argDesiredHeight, argDesiredRefreshRate, argDesiredFormat))
return NULL;
if (!m_HasEnumerated)
return NULL;
return m_EnumeratedAdapters.front();
}
IOutputDevice* DeviceEnumerator::FindBestOutput(bool argAllowToEnumerate, uint32 argDesiredWidth, uint32 argDesiredHeight, uint32 argDesiredRefreshRate, DataFormat::Enumeration argDesiredFormat)
{
if (argAllowToEnumerate && !this->TryEnumerate(argDesiredWidth, argDesiredHeight, argDesiredRefreshRate, argDesiredFormat))
return NULL;
if (!m_HasEnumerated)
return NULL;
return m_EnumeratedAdapters.front()->FindBestOutput(argAllowToEnumerate, argDesiredWidth, argDesiredHeight, argDesiredRefreshRate, argDesiredFormat);
}
IDisplayMode* DeviceEnumerator::FindBestDisplayMode(bool argAllowToEnumerate, uint32 argDesiredWidth, uint32 argDesiredHeight, uint32 argDesiredRefreshRate, DataFormat::Enumeration argDesiredFormat)
{
if (argAllowToEnumerate && !this->TryEnumerate(argDesiredWidth, argDesiredHeight, argDesiredRefreshRate, argDesiredFormat))
return NULL;
if (!m_HasEnumerated)
return NULL;
return m_EnumeratedAdapters.front()->FindBestDisplayMode(argAllowToEnumerate, argDesiredWidth, argDesiredHeight, argDesiredRefreshRate, argDesiredFormat);
}
void DeviceEnumerator::Verbose()
{
if (!this->get_HasEnumerated())
{
std::wcout << std::red << L"Enumeration was not executed or no results available." << std::white << std::endl;
return;
}
IDisplayAdapter* displayAdapter = this->FindBestAdapter();
std::wcout << L"Adapter: " << displayAdapter->get_Name() << std::endl;
std::wcout << L"Dedicated System Memory: " << displayAdapter->get_DedicatedSystemMemory()/1024/1024 << L"MB" << std::endl;
std::wcout << L"Dedicated Video Memory: " << displayAdapter->get_DedicatedVideoMemory()/1024/1024 << L"MB" << std::endl;
std::wcout << L"Shared System Memory: " << displayAdapter->get_SharedSystemMemory()/1024/1024 << L"MB" << std::endl << std::endl;
for (uint32 i = 0; i < displayAdapter->get_DeviceOutputs().size(); ++i)
{
IOutputDevice* outputDevice = displayAdapter->get_DeviceOutputs()[i];
if (i == 0)
std::wcout << L"Primary Output: ";
else
std::wcout << L"Output: ";
std::wcout << outputDevice->get_Name() << std::endl;
IDisplayMode* displayMode = outputDevice->FindBestDisplayMode();
int bpp = DataFormat::GetDataFormatByteSize(displayMode->get_Format()) * 8;
std::wcout << L"Display: " << displayMode->get_Width() << L"x" << displayMode->get_Height() << L"x" << bpp << L" @" << displayMode->get_RefreshRate() << L"Hz" << std::endl << std::endl;
}
}