【问题标题】:DXGI Integred adapterDXGI 集成适配器
【发布时间】:2018-04-06 23:04:00
【问题描述】:

使用 DXGI,我得到了所有显卡的列表。

IDXGIFactory* factory;
vector<IDXGIAdapter*> all_adapters;

HRESULT result(S_FALSE);
result = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory);
if (FAILED(result))
    return false;

for (int i(0);; i++)
{
    IDXGIAdapter* adpt(nullptr);
    result = factory->EnumAdapters(i, &adpt);
    if (FAILED(result))
        break;
    DXGI_ADAPTER_DESC adesc;
    ZeroMemory(&adesc, sizeof(adesc));
    adpt->GetDesc(&adesc);
    if ((adesc.VendorId == 0x1414) && (adesc.DeviceId == 0x8c)) // no add WARP
    {
        adpt->Release();
        continue;
    }
    all_adapters.push_back(adpt);
}

如何定义集成显卡?

我想识别独立显卡和集成显卡。

【问题讨论】:

    标签: c++ directx directx-11 dxgi


    【解决方案1】:

    除了供应商 ID 之外,没有其他简单的方法可以识别它们,即使这样,由于 NVidia Optimus 或 AMD PowerXpress 等混合图形解决方案,您也无法确定您真正使用的是什么。

    通常您只需使用默认设备,并可能将以下内容添加到您的代码中以提示任何混合解决方案:

    extern "C"
    {
        __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
        __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
    }
    

    更新:在 2018 年 4 月 10 日的 Windows 更新中,现在有一个新的 IDXGIFactory6 接口,它支持一个新的 EnumAdapterByGpuPreference 方法,让您可以按“最高性能”或“最低性能”枚举适配器权力'

    ComPtr<IDXGIAdapter1> adapter;
    ComPtr<IDXGIFactory6> factory6;
    HRESULT hr = m_dxgiFactory.As(&factory6);
    if (SUCCEEDED(hr))
    {
        for (UINT adapterIndex = 0;
            DXGI_ERROR_NOT_FOUND != factory6->EnumAdapterByGpuPreference(
                adapterIndex,
                DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
                IID_PPV_ARGS(adapter.ReleaseAndGetAddressOf()));
            adapterIndex++)
        {
            DXGI_ADAPTER_DESC1 desc;
            adapter->GetDesc1(&desc);
    
            if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
            {
                // Don't select the Basic Render Driver adapter.
                continue;
            }
            break;
        }
    }
    else
    {
        for (UINT adapterIndex = 0;
            DXGI_ERROR_NOT_FOUND != m_dxgiFactory->EnumAdapters1(
                adapterIndex,
                adapter.ReleaseAndGetAddressOf());
                adapterIndex++)
        {
            DXGI_ADAPTER_DESC1 desc;
            adapter->GetDesc1(&desc);
            if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
            {
                // Don't select the Basic Render Driver adapter.
                continue;
            }
            break;
        }        
    }
    

    【讨论】:

    • 谢谢。以及在程序执行过程中如何选择设备? (例如,这取决于用户选择的适配器)。这对我来说非常重要。
    • 理论上,如果您明确提供适配器而不是使用“默认适配器”,那么集成解决方案应该尊重这一点。有一些供应商控制面板行为可以覆盖这一点。
    • 我在控制面板“自动选择”中有一个值但是,例如,如果我在程序运行时将变量 N​​vOptimusEnablement 的值更改为 0x00000001(取决于选择),那么未选择离散模块。仅在编译阶段。这个可以改吗?
    • 这是供应商驱动程序通过一些古怪的流程导入逻辑查看的静态值。基本上是一个提示,如果他们的控制面板中有其他设置,供应商将不会注意它。关键是如果您更喜欢离散的(即游戏),您可以设置它。如果用户想要集成,那么他们会在控制面板中覆盖它。这不取决于应用程序。
    • 谢谢...很遗憾:(
    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2020-12-15
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多