Files
bluflame/aiwaz/Aiwaz/DeviceEnumerator/DisplayAdapter.cpp
2026-04-18 22:31:51 +02:00

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