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