可顯示的表面

在可顯示的表面之前,簡報通常是藉由建立具有相同屬性的緩衝區交換鏈結來完成,然後重複迴圈處理(翻轉),以便呈現到螢幕。 如果您想要變更要呈現的緩衝區屬性,則必須終結該交換鏈結,並建立新的緩衝區,並將所有緩衝區更新為相同的新屬性。

可顯示的表面功能會新增新的操作系統 (OS) 行為,以消除這些限制(但需要驅動程序支援才能正常運作)。 具體而言,此功能表示呈現的緩衝區可能會有不同的屬性,而且您可以依任何順序呈現它們。

Windows 11 (組建 10.0.22000.194) 中引進了可顯示的表面(和彈性呈現)功能及其 API。 此功能會在支持的驅動程式上啟用,從 WDDM 3.0 驅動程式開始,啟用 Direct3D 11 的增強簡報案例。

檢查支援,並使用可顯示的表面

若要判斷系統上是否有可顯示的表面功能,請呼叫ID3D11Device::CheckFeatureSupport 傳遞 D3D11_FEATURE::D 3D11_FEATURE_DISPLAYABLE,並接收D3D11_FEATURE_DATA_DISPLAYABLE結構。

ID3D11Device::CreateTexture2D API 支援 D3D11_RESOURCE_MISC_FLAG::D 3D11_RESOURCE_MISC_SHARED_DISPLAYABLE,您可以在 pDesc 參數中傳遞給 CreateTexture2D 之結構的 D3D11_TEXTURE2D_DESC::MiscFlags 成員中使用。

具有 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 的紋理限制為數位大小為1,且限製為1 mip層級。

當您在 紋理上使用D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 旗標時,可以在任何使用中輸出上顯示紋理(包括同時多個輸出)。 視案例而定,紋理最終可能會由組合器 (DWM) 取用、掃描或系結至管線的各個部分,可能全部同時取用。 例如,相機的擷取紋理可能會顯示在兩個顯示器上,而第三個顯示器上顯示它的縮圖,全都在同一個配置中,沒有額外的複本。 在多個顯示器上掃描可顯示表面的情況下,OS 會協調從相關輸出完成的翻轉完成集合,然後向應用程式發出提示,讓表面放回該介面,而不需要驅動程式協調翻轉完成。

如上所述這類紋理必須可顯示,才能使用彈性的簡報。 這些紋理不需要具有相同的屬性,例如格式和大小可能會不同,而且這些紋理必須能夠依任意順序顯示(「順序失序的呈現」)。 簡報將會使用現有的 Present1 DDI,以及其現有的呼叫模式。 例如,假設有六個緩衝區的集區,三個是 720p(A、B 和 C),三個是 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
    }
}

旗標

可共用的格式通常支援下列系結旗標:D3D11_BIND_FLAG::D 3D11_BIND_SHADER_RESOURCED3D11_BIND_UNORDERED_ACCESS、D3D11_BIND_RENDER_TARGETD3D11_BIND_DECODER

使用 D3D11_BIND_VIDEO_ENCODER 旗標的現有共用資源使用方式也會擴充,以支援在這些情況下新增D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE旗標。 維護與使用共用資源與 D3D11_BIND_VIDEO_ENCODER 相關的現有限制。

D3D11_BIND_VIDEO_ENCODER和D3D11_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旗標。