{"id":4482,"date":"2015-12-08T16:37:39","date_gmt":"2015-12-08T16:37:39","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=4482"},"modified":"2015-12-10T09:19:05","modified_gmt":"2015-12-10T09:19:05","slug":"obtenir-les-informations-sur-votre-cg-avec-les-interfaces-dxgi","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=4482","title":{"rendered":"Obtenir les informations de votre CG avec les interfaces DXGI*"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/gtx.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-4485\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/gtx.jpg\" alt=\"gtx\" width=\"506\" height=\"253\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/gtx.jpg 600w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/gtx-300x150.jpg 300w\" sizes=\"(max-width: 506px) 100vw, 506px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Il peut \u00eatre utile d&rsquo;obtenir le nom de la carte vid\u00e9o, sa m\u00e9moire vive maximum et tous ses modes d&rsquo;affichage possibles pour un jeu vid\u00e9o.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir initialiser DirectX 10<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Avant tout, voici deux petites macros affichant les erreurs tout en retournant <em>false <\/em>s&rsquo;il y a en une !<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#define ShowMessageBoxDXError(hr) char buf[2048]; \\\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 sprintf(buf, &quot;Error : %s\\nDescription : %s\\n\\nFile : %s\\n\\nLine : %d\\n\\nFunction : %s&quot;, DXGetErrorStringA(hr), DXGetErrorDescriptionA(hr), __FILE__, __LINE__, __FUNCTION__); \\\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 MessageBoxA(nullptr, buf, &quot;Erreur&quot;, MB_ICONHAND | MB_OK);\r\n\r\n#if defined(DEBUG) | defined(_DEBUG)\r\n\u00a0\u00a0\u00a0 #ifndef HR_FAILED_RETURN_FALSE\r\n\u00a0\u00a0\u00a0 #define HR_FAILED_RETURN_FALSE(x)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (FAILED(x))\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(x)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 #endif\r\n\u00a0\r\n#else\r\n\u00a0\u00a0\u00a0 #ifndef HR_FAILED_RETURN_FALSE\r\n\u00a0\u00a0\u00a0 #define HR_FAILED_RETURN_FALSE(x) x;\r\n\u00a0\u00a0\u00a0 #endif\r\n#endif\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici la fonction qui affiche les informations sur la carte graphique :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nbool GetGPUInfo()\r\n{\r\n\u00a0\u00a0 \u00a0HRESULT hr = S_OK;\r\n\r\n\u00a0\u00a0 \u00a0uint32 iNumModes;\r\n\r\n\u00a0\u00a0 \u00a0IDXGIFactory* pDXGIFactory = nullptr;\r\n\u00a0\u00a0 \u00a0IDXGIAdapter* pDXGIAdapter = nullptr;\r\n\u00a0\u00a0 \u00a0IDXGIOutput* pDXGIAdapterOutput = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0DXGI_MODE_DESC* pDisplayModeList = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0DXGI_ADAPTER_DESC adapterDesc;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9e une interface m\u00e9tier &quot;factory&quot; DirectX\r\n\u00a0\u00a0 \u00a0hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&amp;pDXGIFactory);\r\n\r\n\u00a0\u00a0 \u00a0HR_FAILED_RETURN_FALSE(hr);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Utilise la &quot;factory&quot;\r\n\u00a0\u00a0 \u00a0hr = pDXGIFactory-&gt;EnumAdapters(0, &amp;pDXGIAdapter);\r\n\r\n\u00a0\u00a0 \u00a0HR_FAILED_RETURN_FALSE(hr);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Enum\u00e8re l'adpatateur principal de l'\u00e9cran\r\n\u00a0\u00a0 \u00a0hr = pDXGIAdapter-&gt;EnumOutputs(0, &amp;pDXGIAdapterOutput);\r\n\r\n\u00a0\u00a0 \u00a0HR_FAILED_RETURN_FALSE(hr);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Obtient le nombre de modes d'affichage qui corresppond \u00e0 DXGI_FORMAT_R8G8B8A8_UNORM \u00a0\r\n\u00a0\u00a0 \u00a0hr = pDXGIAdapterOutput-&gt;GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &amp;iNumModes, nullptr);\r\n\r\n\u00a0\u00a0 \u00a0HR_FAILED_RETURN_FALSE(hr);\r\n\r\n\u00a0\u00a0 \u00a0\/* Cr\u00e9\u00e9 une liste qui d\u00e9tient tous les modes d'affichage possibles pour cette carte graphique et\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 le format d'affichage *\/\r\n\u00a0\u00a0 \u00a0pDisplayModeList = new DXGI_MODE_DESC[iNumModes];\r\n\r\n\u00a0\u00a0 \u00a0if (!pDisplayModeList)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Remplie la pr\u00e9c\u00e9dente structure\r\n\u00a0\u00a0 \u00a0hr = pDXGIAdapterOutput-&gt;GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &amp;iNumModes, pDisplayModeList);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0HR_FAILED_RETURN_FALSE(hr);\r\n\r\n\u00a0\u00a0 \u00a0\/* On parcourt tous les modes d'affichages possibles\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 et on trouve celui qui correspond \u00e0 la taille sp\u00e9cifi\u00e9e\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 en param\u00e8tre ; puis on enregistre le num\u00e9rateur et le d\u00e9nominateur\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 du taux de rafraichissement de l'\u00e9cran\r\n\u00a0\u00a0 \u00a0*\/\r\n\u00a0\u00a0 \u00a0std::cout &lt;&lt; &quot;Modes d'affichage pour le format : DXGI_FORMAT_R8G8B8A8_UNORM&quot; &lt;&lt; std::endl &lt;&lt; std::endl;\r\n\r\n\u00a0\u00a0 \u00a0for (uint32 i = 0; i &lt; iNumModes; i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DXGI_MODE_DESC desc = pDisplayModeList[i];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::string sRefreshRate = std::to_string(desc.RefreshRate.Numerator \/ desc.RefreshRate.Denominator) + &quot;Hz&quot;;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::cout &lt;&lt; desc.Width &lt;&lt; &quot;x&quot; &lt;&lt; desc.Height &lt;&lt; &quot; &quot; &lt;&lt; sRefreshRate &lt;&lt; std::endl;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0std::cout &lt;&lt; std::endl;\r\n\r\n\u00a0\u00a0 \u00a0hr = pDXGIAdapter-&gt;GetDesc(&amp;adapterDesc);\r\n\r\n\u00a0\u00a0 \u00a0HR_FAILED_RETURN_FALSE(hr);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On enregistre la taille de la m\u00e9moire vid\u00e9o en m\u00e9gabytes\r\n\u00a0\u00a0 \u00a0m_iVideoCardMemory = (adapterDesc.DedicatedVideoMemory \/ 1024 \/ 1024);\r\n\r\n\u00a0\u00a0 \u00a0size_t iStringLength = 0;\r\n\u00a0\u00a0 \u00a0\/\/ Convertie le nom la carte vid\u00e9o dans une cha\u00eene de caract\u00e8res\r\n\u00a0\u00a0 \u00a0int iError = wcstombs_s(&amp;iStringLength, m_sVideoCardDescription, 128, adapterDesc.Description, 128);\r\n\r\n\u00a0\u00a0 \u00a0if (iError != 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0std::cout &lt;&lt; std::endl;\r\n\r\n\u00a0\u00a0 \u00a0std::cout &lt;&lt; m_sVideoCardDescription &lt;&lt; std::endl;\r\n\r\n\u00a0\u00a0 \u00a0std::cout &lt;&lt; &quot;Video memory = &quot; &lt;&lt; std::to_string(m_iVideoCardMemory) &lt;&lt; &quot; MB&quot; &lt;&lt; std::endl;\r\n\r\n\u00a0\u00a0 \u00a0std::cout &lt;&lt; std::endl;\r\n\r\n\u00a0\u00a0 \u00a0SAFE_DELETE_ARRAY(pDisplayModeList);\r\n\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(pDXGIAdapterOutput);\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(pDXGIAdapter);\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(pDXGIFactory);\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici la fonction qui affiche les capacit\u00e9s de la carte graphique en mati\u00e8re d&rsquo;anti-aliasing (d\u00e9j\u00e0 pr\u00e9sent\u00e9e dans les articles pr\u00e9c\u00e9dents) :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nvoid PrintFSAAMaximumLevel()\r\n{\r\n\u00a0\u00a0 \u00a0HRESULT hr = S_OK;\r\n\u00a0\u00a0 \u00a0UINT maxQualityLevel = 1;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0for (uint32 iSampleCount = 1; iSampleCount &lt;= D3D10_MAX_MULTISAMPLE_SAMPLE_COUNT; iSampleCount++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0hr = m_pd3dDevice-&gt;CheckMultisampleQualityLevels(\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DXGI_FORMAT_R8G8B8A8_UNORM, iSampleCount, &amp;maxQualityLevel);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (hr != S_OK)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::cout &lt;&lt; &quot;CheckMultisampleQualityLevels a \u00e9choue.&quot; &lt;&lt; std::endl;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (maxQualityLevel &gt; 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::cout &lt;&lt; &quot;MSAA &quot; &lt;&lt; iSampleCount &lt;&lt; &quot;X supportee par la carte video avec &quot; &lt;&lt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0maxQualityLevel &lt;&lt; &quot; niveau(x) de qualite.&quot; &lt;&lt; std::endl;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici la sortie de la console une fois affich\u00e9s les modes d&rsquo;affichage :<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/CG_specs1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-4495\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/CG_specs1.png\" alt=\"CG_specs\" width=\"637\" height=\"743\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/CG_specs1.png 637w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/CG_specs1-257x300.png 257w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/CG_specs1-624x728.png 624w\" sizes=\"(max-width: 637px) 100vw, 637px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons appris comment obtenir les informations \u00e0 partir de la carte graphique.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Il peut \u00eatre utile d&rsquo;obtenir le nom de la carte vid\u00e9o, sa m\u00e9moire vive maximum et tous ses modes d&rsquo;affichage possibles pour un jeu vid\u00e9o. Pr\u00e9requis : &#8211; Savoir initialiser DirectX 10 Explications : Avant tout, voici deux petites macros affichant les erreurs tout en retournant false s&rsquo;il y a en une ! [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4482"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4482"}],"version-history":[{"count":23,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4482\/revisions"}],"predecessor-version":[{"id":4515,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4482\/revisions\/4515"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}