port from perforce
This commit is contained in:
141
aiwaz/Aiwaz/DeviceEnumerator/DeviceEnumerator.cpp
Normal file
141
aiwaz/Aiwaz/DeviceEnumerator/DeviceEnumerator.cpp
Normal file
@@ -0,0 +1,141 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user