DXGI EnumOutputs - 没有 DXGI_OUTPUT_DESC 和空显示模式数组

Posted

技术标签:

【中文标题】DXGI EnumOutputs - 没有 DXGI_OUTPUT_DESC 和空显示模式数组【英文标题】:DXGI EnumOutputs - no DXGI_OUTPUT_DESC and empty display modes array 【发布时间】:2015-07-04 19:58:33 【问题描述】:

在尝试获取可用的显示模式时遇到了奇怪的问题。让我解释一下……

首先,我列举了可用的适配器,然后推送到 std::vector ,这工作正常:

for(UINT i = 0; pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i)
    vAdapters->push_back(pAdapter);

然后我用这些适配器填充组合框并允许选择我想要使用的一个。

当我尝试枚举输出并获取可用的显示模式时,首先我从组合框中选择了适配器:

IDXGIAdapter* pSelectedAdapter = (*vAdapters)[index];

我检查了所选适配器的地址,它与枚举适配器时获得的匹配。

然后,尝试枚举输出并获取它们的描述:

IDXGIOutput* pOutput;
DXGI_OUTPUT_DESC *odesc = 0;
for(UINT i = 0; pSelectedAdapter->EnumOutputs(i, &pOutput) != DXGI_ERROR_NOT_FOUND; ++i)

    pOutput->GetDesc(odesc);

还有问题。循环找到我的两个监视器并为所有监视器返回 pOutput 指针,但是当我尝试触发 GetDesc(odesc) 时,不会返回 odesc。看起来 pOutput 指针指向...空对象。无论我要检查哪种后台缓冲区格式,枚举可用的显示模式都会产生 0 个可用模式。

谢谢, 帕特里克

【问题讨论】:

【参考方案1】:

当 GetDesc 需要一个指向 DXGI_OUTPUT_DESC 结构的指针时,您将一个空指针传递给它。试试下面:

IDXGIOutput* pOutput;
DXGI_OUTPUT_DESC odesc;
for(UINT i = 0; pSelectedAdapter->EnumOutputs(i, &pOutput) != DXGI_ERROR_NOT_FOUND; ++i)

    pOutput->GetDesc(&odesc);

【讨论】:

是的,我已经意识到了。还解决了没有可用显示模式的问题。我正在轮询 DXGI_FORMAT_R32G32B32A32_FLOAT 后台缓冲区格式,结果显示格式为 0。枚举 R8G8B8A8_UNORM 就可以了。【参考方案2】:

还记得释放 IDXGIOutput 否则你会有内存泄漏: 见here。

【讨论】:

以上是关于DXGI EnumOutputs - 没有 DXGI_OUTPUT_DESC 和空显示模式数组的主要内容,如果未能解决你的问题,请参考以下文章

nvidia 显卡报错

DXGI 1.5 DuplicateOutput1 因 DXGI_ERROR_UNSUPPORTED (0x887a0004) 而失败

dxg:GridColumn DevExpress 中的数据触发器

DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

DXGI:尝试从输出(监视器)中获取正确的显示模式

DXGI 1.4的新特性