97 lines
2.6 KiB
C++
97 lines
2.6 KiB
C++
#include "stdafx.h"
|
|
#include "DisplayAdapter.h"
|
|
#include "outputDevice.h"
|
|
|
|
|
|
DisplayAdapter::DisplayAdapter(IDXGIAdapter* ar_Adapter_, ID3D10Device* ar_Device_)
|
|
: m_Adapter(ar_Adapter_)
|
|
, m_Device(ar_Device_)
|
|
, m_HasEnumerated(false)
|
|
, m_DesiredWidth(0)
|
|
, m_DesiredHeight(0)
|
|
, m_DesiredRefreshRate(0)
|
|
, m_DesiredFormat(DataFormat::Unknown)
|
|
{
|
|
if (m_Adapter != NULL)
|
|
{
|
|
m_Adapter->AddRef();
|
|
m_Adapter->GetDesc(&m_AdapterDesc);
|
|
}
|
|
}
|
|
|
|
|
|
DisplayAdapter::~DisplayAdapter()
|
|
{
|
|
for (uint32 i = 0; i < m_EnumeratedOutputs.size(); ++i)
|
|
delete m_EnumeratedOutputs[i];
|
|
|
|
if (m_Adapter != NULL)
|
|
m_Adapter->Release();
|
|
m_Adapter = NULL;
|
|
}
|
|
|
|
|
|
bool DisplayAdapter::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_Adapter == NULL)
|
|
return false;
|
|
|
|
int outputIndex = 0;
|
|
IDXGIOutput* output = NULL;
|
|
while (m_Adapter->EnumOutputs(outputIndex, &output) == S_OK)
|
|
{
|
|
IOutputDevice* deviceOutput = new OutputDevice(output, m_Device);
|
|
if (deviceOutput->TryEnumerate(argDesiredWidth, argDesiredHeight, argDesiredRefreshRate, argDesiredFormat))
|
|
m_EnumeratedOutputs.push_back(deviceOutput);
|
|
else
|
|
delete deviceOutput;
|
|
|
|
output->Release();
|
|
outputIndex++;
|
|
}
|
|
|
|
m_DesiredWidth = argDesiredWidth;
|
|
m_DesiredHeight = argDesiredHeight;
|
|
m_DesiredRefreshRate = argDesiredRefreshRate;
|
|
m_DesiredFormat = argDesiredFormat;
|
|
|
|
m_HasEnumerated = !m_EnumeratedOutputs.empty();
|
|
return m_HasEnumerated;
|
|
}
|
|
|
|
|
|
IOutputDevice* DisplayAdapter::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_EnumeratedOutputs.front();
|
|
}
|
|
|
|
|
|
IDisplayMode* DisplayAdapter::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_EnumeratedOutputs.front()->FindBestDisplayMode(argAllowToEnumerate, argDesiredWidth, argDesiredHeight, argDesiredRefreshRate, argDesiredFormat);
|
|
}
|