142 lines
4.7 KiB
C++
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;
|
|
}
|
|
}
|