Intro :
Il peut être utile d’obtenir le nom de la carte vidéo, sa mémoire vive maximum et tous ses modes d’affichage possibles pour un jeu vidéo.
Prérequis :
– Savoir initialiser DirectX 10
Explications :
Avant tout, voici deux petites macros affichant les erreurs tout en retournant false s’il y a en une !
#define ShowMessageBoxDXError(hr) char buf[2048]; \
sprintf(buf, "Error : %s\nDescription : %s\n\nFile : %s\n\nLine : %d\n\nFunction : %s", DXGetErrorStringA(hr), DXGetErrorDescriptionA(hr), __FILE__, __LINE__, __FUNCTION__); \
MessageBoxA(nullptr, buf, "Erreur", MB_ICONHAND | MB_OK);
#if defined(DEBUG) | defined(_DEBUG)
#ifndef HR_FAILED_RETURN_FALSE
#define HR_FAILED_RETURN_FALSE(x) \
{ \
if (FAILED(x)) \
{ \
ShowMessageBoxDXError(x) \
return false; \
} \
}
#endif
#else
#ifndef HR_FAILED_RETURN_FALSE
#define HR_FAILED_RETURN_FALSE(x) x;
#endif
#endif
Voici la fonction qui affiche les informations sur la carte graphique :
bool GetGPUInfo()
{
HRESULT hr = S_OK;
uint32 iNumModes;
IDXGIFactory* pDXGIFactory = nullptr;
IDXGIAdapter* pDXGIAdapter = nullptr;
IDXGIOutput* pDXGIAdapterOutput = nullptr;
DXGI_MODE_DESC* pDisplayModeList = nullptr;
DXGI_ADAPTER_DESC adapterDesc;
// Créée une interface métier "factory" DirectX
hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&pDXGIFactory);
HR_FAILED_RETURN_FALSE(hr);
// Utilise la "factory"
hr = pDXGIFactory->EnumAdapters(0, &pDXGIAdapter);
HR_FAILED_RETURN_FALSE(hr);
// Enumère l'adpatateur principal de l'écran
hr = pDXGIAdapter->EnumOutputs(0, &pDXGIAdapterOutput);
HR_FAILED_RETURN_FALSE(hr);
// Obtient le nombre de modes d'affichage qui corresppond à DXGI_FORMAT_R8G8B8A8_UNORM
hr = pDXGIAdapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &iNumModes, nullptr);
HR_FAILED_RETURN_FALSE(hr);
/* Créé une liste qui détient tous les modes d'affichage possibles pour cette carte graphique et
le format d'affichage */
pDisplayModeList = new DXGI_MODE_DESC[iNumModes];
if (!pDisplayModeList)
{
return false;
}
// Remplie la précédente structure
hr = pDXGIAdapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &iNumModes, pDisplayModeList);
HR_FAILED_RETURN_FALSE(hr);
/* On parcourt tous les modes d'affichages possibles
et on trouve celui qui correspond à la taille spécifiée
en paramètre ; puis on enregistre le numérateur et le dénominateur
du taux de rafraichissement de l'écran
*/
std::cout << "Modes d'affichage pour le format : DXGI_FORMAT_R8G8B8A8_UNORM" << std::endl << std::endl;
for (uint32 i = 0; i < iNumModes; i++)
{
DXGI_MODE_DESC desc = pDisplayModeList[i];
std::string sRefreshRate = std::to_string(desc.RefreshRate.Numerator / desc.RefreshRate.Denominator) + "Hz";
std::cout << desc.Width << "x" << desc.Height << " " << sRefreshRate << std::endl;
}
std::cout << std::endl;
hr = pDXGIAdapter->GetDesc(&adapterDesc);
HR_FAILED_RETURN_FALSE(hr);
// On enregistre la taille de la mémoire vidéo en mégabytes
m_iVideoCardMemory = (adapterDesc.DedicatedVideoMemory / 1024 / 1024);
size_t iStringLength = 0;
// Convertie le nom la carte vidéo dans une chaîne de caractères
int iError = wcstombs_s(&iStringLength, m_sVideoCardDescription, 128, adapterDesc.Description, 128);
if (iError != 0)
{
return false;
}
std::cout << std::endl;
std::cout << m_sVideoCardDescription << std::endl;
std::cout << "Video memory = " << std::to_string(m_iVideoCardMemory) << " MB" << std::endl;
std::cout << std::endl;
SAFE_DELETE_ARRAY(pDisplayModeList);
SAFE_RELEASE(pDXGIAdapterOutput);
SAFE_RELEASE(pDXGIAdapter);
SAFE_RELEASE(pDXGIFactory);
return true;
}
Voici la fonction qui affiche les capacités de la carte graphique en matière d’anti-aliasing (déjà présentée dans les articles précédents) :
void PrintFSAAMaximumLevel()
{
HRESULT hr = S_OK;
UINT maxQualityLevel = 1;
for (uint32 iSampleCount = 1; iSampleCount <= D3D10_MAX_MULTISAMPLE_SAMPLE_COUNT; iSampleCount++)
{
hr = m_pd3dDevice->CheckMultisampleQualityLevels(
DXGI_FORMAT_R8G8B8A8_UNORM, iSampleCount, &maxQualityLevel);
if (hr != S_OK)
{
std::cout << "CheckMultisampleQualityLevels a échoue." << std::endl;
}
if (maxQualityLevel > 0)
{
std::cout << "MSAA " << iSampleCount << "X supportee par la carte video avec " <<
maxQualityLevel << " niveau(x) de qualite." << std::endl;
}
}
}
Voici la sortie de la console une fois affichés les modes d’affichage :
Résumé :
Nous avons appris comment obtenir les informations à partir de la carte graphique.


