通过现有 IDXGIDevice 获取新连接的显示器

Get new connected display via existing IDXGIDevice

我有一个程序可以在启动时创建 ID3D11Device 设备并在关闭时销毁。我在创建 ID3D11Device 后连接第二台显示器时遇到了这个问题。 在这段简化的代码中,它枚举了适配器输出,并且这个枚举 returns 只有一个监视器,第一个在程序启动之前连接的监视器。

一个

IDXGIDevice* DXGIDevice;
D3D11Device->QueryInterface(IID_IDXGIDevice, (void**)&DXGIDevice);

IDXGIAdapter* DXGIAdapter;
DXGIDevice->GetAdapter(&DXGIAdapter);

IDXGIOutput* Output;
int i = 0;
while (DXGIAdapter->EnumOutputs(i, &Output) != DXGI_ERROR_NOT_FOUND)
{
    DXGI_OUTPUT_DESC desc;
    Output->GetDesc(&desc);

    PrintMonitor(desc.Monitor);
}

但是如果我尝试手动创建工厂并获取主适配器,它会枚举两个监视器。

B

IDXGIFactory* DXGIFactory;
IDXGIAdapter* DXGIAdapter;

CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&DXGIFactory);
factory->EnumAdapters(0, &DXGIAdapter);

IDXGIOutput* Output;
int i = 0;
while (DXGIAdapter->EnumOutputs(i, &Output) != DXGI_ERROR_NOT_FOUND)
{
    DXGI_OUTPUT_DESC desc;
    Output->GetDesc(&desc);

    PrintMonitor(desc.Monitor);
}

我的问题是:从 DXGIDevice 设备获取的适配器是否可能“刷新”输出列表而无需重新创建此设备,并在代码中看到任何监视器 plug-in/plug-out 与第一个一样( A)?

IDXGIFactory1::IsCurrent() 方法应该有所帮助。如果它 returns FALSE,那么你应该销毁并重新创建工厂以刷新信息。每次都检查一下就可以了 Present.

我在我的 directx-vs-templates 项目中使用此方法支持 HDR10 输出。参见 DX11 and DX12