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 !
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
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) :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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.



