如何使用Direct3D9确定哪些显示器连接到同一物理设备?

时间:2009-03-25 10:22:51

标签: winapi direct3d multiple-monitors

使用Direct3D9,我可以使用IDirect3D9::GetAdapterCount()计算可用的适配器。但是,这会返回输出数量,即单个双头图形卡的输出数量。使用Win32 API,我可以使用以下代码片段枚举显示设备和附加的监视器:

DISPLAY_DEVICE displayDevice;
::ZeroMemory(&displayDevice, sizeof(displayDevice));
displayDevice.cb = sizeof(displayDevice);

/* Enumerate adapters. */
for (UINT i = 0; ::EnumDisplayDevices(NULL, i, &displayDevice, 0); i++) {

    /* Enumerate the monitors. */
    for (UINT j = 0; ::EnumDisplayDevices(displayDevice.DeviceName, j, 
            &displayDevice, 0); j++) {
        // Do stuff here
    } 
}

我的问题是:在D3D中是否有相同的功能,如果我之后使用D3DCREATE_ADAPTERGROUP_DEVICE创建D3D设备,它也能正常工作?如果没有,我可以对设备的枚举顺序做出任何假设,我可以使用它来将Win32 API结果与D3D适配器相匹配吗?换句话说:Direct3D适配器0是否保证是EnumDisplayDevices返回的第一个适配器?

补充:我刚刚发现,我可以将设备名称从D3DADAPTER_IDENTIFIER9匹配到Win32的设备名称。但是,有没有办法从D3D获得物理设备?

1 个答案:

答案 0 :(得分:2)

如果有人感兴趣,我发现了如何做到:NumberOfAdaptersInGroup中的D3DCAPS9包含适配器组主服务器的输出数量(具有多个交换链的物理设备)和对于从属(“非物理”适配器)为零。 MSDN声明:

  

对于传统适配器,NumberOfAdaptersInGroup为1,对于多头卡的主适配器,NumberOfAdaptersInGroup大于1。对于多头卡的从属适配器,该值将为0。每张卡最多只能有一个主人,但可能有很多下属。