可显示图面

在推出可显示图面功能之前,呈现时通常会创建具有相同属性的缓冲区交换链,然后按顺序重复循环(翻转),从而在屏幕上呈现。 如果要更改要呈现的缓冲区属性,则必须首先销毁该交换链,然后创建一个新缓冲区,并将所有缓冲区更新为相同的新属性。

可显示图面功能添加了新的操作系统 (OS) 行为,消除了这些限制(但需要驱动程序支持才能正常运行)。 特别是由于这一功能,呈现的缓冲区可以具有不同的属性,并且可以按任意顺序呈现。

Windows 11(内部版本 10.0.22000.194)中引入了可显示图面(和灵活呈现)功能及其 API。 从 WDDM 3.0 驱动程序开始,受支持的驱动程序都已启用该功能,从而启用 Direct3D 11 的增强呈现方案。

检查是否支持,并使用可显示图面

要确定系统是否支持可显示图面功能,请调用 ID3D11Device::CheckFeatureSupport。 传递 D3D11_FEATURE::D3D11_FEATURE_DISPLAYABLE,并接收 D3D11_FEATURE_DATA_DISPLAYABLE结构。

ID3D11Device::CreateTexture2D API 支持 D3D11_RESOURCE_MISC_FLAG::D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE,后者可以在你通过 pDesc 参数传递到 CreateTexture2D 的结构的 D3D11_TEXTURE2D_DESC::MiscFlags 成员中使用。

具有 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 的纹理限制为数组大小 1,mip 级别 1。

在纹理上使用 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 标志时,可以在任何活动输出(包括同时包含多个输出)上显示纹理。 根据具体场景,纹理最终可能会被合成器 (DWM) 使用、扫描或绑定到管道的各个部分(可能同时使用)。 例如,可能在两个显示器上显示来自相机的捕获纹理,并在第三个显示器上显示缩略图,并且同时显示,全部来自同一分配,无需额外的副本。 如果要在多个显示器上扫描可显示图面,OS 将协调所涉及的输出的翻转完成,然后通知应用程序该图面被释放回,无需协调驱动程序的翻转完成。

要向屏幕呈现可显示的纹理,可以使用合成交换链 API。 通过使用可显示的图面而不是普通图面,系统在某些情况下能够优化演示以绕过系统合成器并直接扫描图面,从而减少 GPU/CPU 开销以及整体延迟。 这类似于将 DXGI 交换链与“翻转”演示模式配合使用。 有关详细信息,请参阅使用 DXGI 翻转模型获得最佳性能

如上文所述,此类纹理必须可显示,才能支持灵活呈现使用场景。 这些纹理不需要具有相同的属性,例如格式和大小可以不同,并且这些纹理必须能够按任意顺序显示(“无序呈现”)。 呈现将使用现有的 Present1 DDI 及其现有调用模式进行。 例如,假设有 6 个缓冲区池,其中 3 个是 720p(A、B 和 C),3 个是 4K(D、E 和 F):有效的呈现顺序可以是 A->E->C->B->F->E->D->C。

格式

Direct3D 11 中的以下格式支持 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 标志:

驱动程序还可以(可选)支持以下格式:

  • DXGI_FORMAT_P010

可以使用以下代码示例检查上述可选格式是否支持可显示图面功能。 此示例涉及调用 ID3D11Device::CheckFeatureSupport,以及检查 D3D11_FEATURE_FORMAT_SUPPORT2

D3D11_FEATURE_DATA_FORMAT_SUPPORT2 FormatSupport2;
FormatSupport2.InFormat = DXGI_FORMAT_P010;
if (SUCCEEDED (hr = GetDevice()->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2, &FormatSupport2, sizeof(FormatSupport2))))
{
    if (FormatSupport2.OutFormatSupport2 & D3D11_FORMAT_SUPPORT2_DISPLAYABLE)
    {
        // optional displayable format is supported
    }
}

Flags

可共享格式通常支持以下绑定标记:D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCED3D11_BIND_UNORDERED_ACCESSD3D11_BIND_RENDER_TARGETD3D11_BIND_DECODER

对于具有 D3D11_BIND_VIDEO_ENCODER 标志的共享资源,扩展了现有受支持的使用场景,还支持在这些情况下添加 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 标志。 对于具有 D3D11_BIND_VIDEO_ENCODER 的共享资源的使用,现有相关限制保持不变。

D3D11_BIND_VIDEO_ENCODERD3D11_BIND_SHADER_RESOURCE 以前是互斥的,但与某些其他绑定标记结合使用时除外。 扩展了例外,允许在使用 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 时同时使用 D3D11_BIND_VIDEO_ENCODERD3D11_BIND_SHADER_RESOURCE

D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 标志支持与 D3D11_RESOURCE_MISC_HW_PROTECTED 标志结合使用。