#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; } }