我希望我能在适当的论坛发帖!
最近,我开始在带有NVidia GeForce GT 630M GPU和Intel HD 4000芯片的戴尔LapTop上使用VC ++ 2010上的Directx 11 June(2010)SDK进行编程。
您要做的一件事是尝试枚举可用的适配器和输出,等等。这是一个例子:
IDXGIFactory1 *factory;
CreateDXGIFactory1(__uuidof(IDXGIFactory1), (LPVOID *)&factory);
IDXGIAdapter *adapter;
factory->EnumAdapters(0, &adapter);
DXGI_ADAPTER_DESC desc;
adapter->GetDesc(&desc);
当我运行它时,desc结构包含我的Intel HD芯片的信息,而不是我的GPU的信息!
现在,当我打开我的NVidia控制面板,并选择GPU作为首选处理器,然后重新运行示例时,我会在desc中获取GPU的信息 - 这是正确的!而且,当我尝试枚举此适配器的输出时,我发现至少有一个。
我的问题是:有没有办法以编程方式完成此操作,例如在DirectX 11 SDK中,这样我就不必在NVidia控制面板中设置设置了?
我浏览了SDK代码(对于EmptyProject11),并以某种方式“抓住”GPU而不是英特尔芯片。我注释掉了WinMain函数中的所有代码,并插入了上面的代码,它仍然抓住了GPU!它与项目设置,环境变量,命令行参数或....有关吗?我的意思是他们是怎么做到的!?!?!?
我很感激对此事的任何见解。
由于
答案 0 :(得分:0)
您可以运行所有适配器并通过使用您已使用的相同功能循环遍历所有可能的适配器来获取有关它们的信息:
HRESULT r = S_OK;
unsigned int adapterindex = 0;
std::unique_ptr<IDXGIAdapter, ReleaseDirectX> dxgiadapter = null;
// Save the result of EnumAdapters to r, and then check if it's S_OK
while ( ( r = factory->EnumAdapters( adapterindex, &dxgiadapter ) ) == S_OK ) {
++adapterindex;
/* Work with your adapter here, particularly DXGI_ADAPTER_DESC */
}
通常,您必须自动选择默认值或枚举所有默认值,并在某种设置面板中让用户选择。另一种方法是使用视频内存最多的Adapter Description。它不是一个万无一失的启发式算法,但它是我用来获得系统的“最佳”(使用自由)视频卡的一种。但是,通常情况下,默认值是默认值。
祝你好运!