次の方法で共有


表示可能なサーフェス

表示可能なサーフェスの前に、通常は、同じプロパティのバッファーのスワップ チェーンを作成し、画面に表示するために繰り返し循環 (反転) てプレゼンテーションが行われました。 提示するバッファーのプロパティを変更する場合は、そのスワップ チェーンを破棄して、バッファーすべてが同じ新しいプロパティに更新された新しいスワップ チェーンを作成する必要がありました。

表示可能なサーフェス機能では、これらの制限を排除する新しいオペレーティング システム (OS) 動作を追加します (ただし、適切に動作するにはドライバーのサポートが必要です)。 具体的には、この機能は、表示されるバッファーにさまざまなプロパティがあって、任意の順序で提示できる可能性があることを意味します。

表示可能なサーフェス (および柔軟なプレゼンテーション) 機能とその API は、Windows 11 (ビルド 10.0.22000.194) で導入されました。 この機能は、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、ミップ レベルが 1 に制限されます。

テクスチャで D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE フラグを使用すると、アクティブな出力 (複数の出力を同時に含む) にテクスチャが表示できます。 シナリオによっては、テクスチャがコンポジター (DWM) で消費されたり、スキャンアウトされたり、パイプラインのさまざまな部分にバインドされたりする可能性があります(すべて同時に実行される可能性があります)。 たとえば、カメラからのキャプチャ テクスチャが 2台のディスプレイに表示され、そのサムネイルが 3台目のディスプレイに同時に表示され、すべてのテクスチャが同じ割り当てから追加のコピーなしで表示される場合があります。 表示可能なサーフェスを複数のディスプレイでスキャンアウトする場合は、OS は、サーフェスが解放されたことをアプリケーションに警告する前に、関連する出力からのフリップ完了のコレクションを調整します。ドライバーからのフリップ完了の調整は必要ありません。

表示可能なテクスチャを画面に表示するには、コンポジション スワップ チェーン API を使用します。 単純なサーフェスではなく表示可能なサーフェスを使用することで、システムは場合によりプレゼンテーションを最適化してシステム コンポジターをバイパスし、サーフェスを直接スキャンアウトできるため、GPU/CPU のオーバーヘッドと全体的な待ち時間が削減されます。 これは、"フリップ" 表示モードで DXGI スワップチェーンを使用する場合と似ています。 詳細については、「パフォーマンスを最大限に高めるために DXGI フリップ モデルを使用する」を参照してください。

上記のようなテクスチャは、柔軟なプレゼンテーションを使用するために表示可能であることが必要です。 これらのテクスチャは、同じプロパティを持つ必要はありません。たとえば、形式やサイズが異なる場合があり、これらのテクスチャを任意の順序で表示できることが必要です ("順不同のプレゼンテーション")。 プレゼンテーションは、既存の Present1 DDI と既存の呼び出しパターンを使用して行われます。 たとえば、6 つのバッファー 、720p (A、B、C) の 3 つ、4K (D、E、F) の 3 つのバッファーを考えてみましょう。有効な表示順序はA->E->C->B->F->E->D->C となります。

形式

D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE フラグは、Direct3D 11 の次の形式でサポートされています。

ドライバーは、必要に応じて、次の形式をサポートすることもできます。

  • 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::D 3D11_BIND_SHADER_RESOURCED3D11_BIND_UNORDERED_ACCESSD3D11_BIND_RENDER_TARGET、および D3D11_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_HW_PROTECTED フラグは、D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE フラグでサポートされています。