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