Anzeigbare Oberflächen

Vor anzeigefähigen Oberflächen wurde die Präsentation im Allgemeinen durch Erstellen einer Swapchain von Puffern mit identischen Eigenschaften durchgeführt, die dann wiederholt durchlaufen (umgedreht) wurden, um auf dem Bildschirm angezeigt zu werden. Wenn Sie die Eigenschaften eines zu präsentierenden Puffers ändern möchten, mussten Sie diese Swapchain zerstören und eine neue erstellen, wobei alle Puffer auf die gleichen neuen Eigenschaften aktualisiert wurden.

Das Feature für anzeigefähige Oberflächen fügt ein neues Betriebssystemverhalten (Betriebssystem) hinzu, das diese Einschränkungen beseitigt (aber es erfordert Treiberunterstützung, um sich richtig zu verhalten). Konkret bedeutet dies, dass die angezeigten Puffer unterschiedliche Eigenschaften haben können und in beliebiger Reihenfolge angezeigt werden können.

Die anzeigebaren Oberflächen (und flexible Präsentationsfeatures) und ihre APIs wurden in Windows 11 (Build 10.0.22000.194) eingeführt. Die Funktionalität ist für unterstützte Treiber aktiviert, beginnend mit WDDM 3.0-Treibern und ermöglicht erweiterte Präsentationsszenarien für Direct3D 11.

Überprüfen sie auf Unterstützung und verwenden Sie anzeigefähige Oberflächen

Rufen Sie ID3D11Device::CheckFeatureSupport auf, um zu ermitteln, ob das Feature für anzeigefähige Oberflächen in einem System verfügbar ist. Übergeben Sie D3D11_FEATURE::D 3D11_FEATURE_DISPLAYABLE und erhalten Sie eine D3D11_FEATURE_DATA_DISPLAYABLE-Struktur.

Die ID3D11Device::CreateTexture2D-API unterstützt D3D11_RESOURCE_MISC_FLAG::D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE, die Sie im Element D3D11_TEXTURE2D_DESC::MiscFlags der Struktur verwenden können, die Sie im Parameter pDesc an CreateTexture2D übergeben.

Strukturen mit D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE sind auf eine Arraygröße von 1 und auf 1 Mip-Ebene beschränkt.

Wenn Sie die D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE-Kennzeichnung für die Struktur verwenden, können Sie die Struktur in jeder aktiven Ausgabe (einschließlich mehrerer Ausgaben gleichzeitig) anzeigen. Je nach Szenario kann die Struktur schließlich vom Compositor (DWM) verbraucht, ausgelesen oder an verschiedene Teile der Pipeline gebunden werden – möglicherweise sogar gleichzeitig. So kann beispielsweise eine von einer Kamera aufgenommene Struktur auf zwei Bildschirmen und eine Miniaturansicht davon auf einem dritten Bildschirm angezeigt werden, und zwar alle gleichzeitig – und alle aus derselben Zuordnung ohne zusätzliche Kopien. Wenn eine anzeigbare Oberfläche auf mehreren Bildschirmen angezeigt werden soll, koordiniert das Betriebssystem die Sammlung von Flip-Completions von den beteiligten Ausgängen, bevor es Ihre Anwendung darüber informiert, dass die Oberfläche wieder freigegeben ist – der Treiber muss die Flip-Completions nicht koordinieren.

Die Anzeige einer anzeigbaren Textur auf dem Bildschirm ist mit der Kompositions-Swapchain-API möglich. Wenn statt gewöhnlicher Oberflächen anzeigbare Oberflächen genutzt werden, kann das System die Darstellung in manchen Situation verbessern, indem der System-Compositor umgangen wird und ein direkter Scanout der Oberflächen erfolgt. Auf diese Weise wird nicht nur der GPU/CPU-Overhead gesenkt, sondern auch die Gesamtlatenz. Diese Vorgehensweise ist mit der Nutzung von DXGI-Swapchains mit den Darstellungsmodi „Spiegeln“ vergleichbar. Weitere Informationen finden Sie unter Für beste Leistung verwenden Sie das DXGI-Flip-Modell.

Solche Strukturen wie oben beschrieben müssen für die flexible Verwendung von Präsentationen angezeigt werden. Diese Strukturen müssen nicht über die gleichen Eigenschaften verfügen, z. B. können Formate und Größen unterschiedlich sein und diese Strukturen müssen in beliebiger Reihenfolge angezeigt werden können („Präsentation außerhalb der Reihenfolge“). Die Präsentation erfolgt mithilfe des vorhandenen Present1 DDI mit den vorhandenen Aufrufmustern. Nehmen wir zum Beispiel einen Pool von sechs Puffern, von denen drei 720p (A, B und C) und drei 4K (D, E und F) sind: Eine gültige Präsentationsreihenfolge könnte A->E->C->B->F->E->D->C sein.

Formate

Das D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE-Flag wird für die folgenden Formate in Direct3D 11 unterstützt:

Ein Treiber unterstützt optional auch die folgenden Formate:

  • DXGI_FORMAT_P010

Sie können das folgende Codebeispiel verwenden, um die Unterstützung für anzeigefähige Oberflächen für die oben genannten optionalen Formate zu überprüfen. Das Beispiel umfasst das Aufrufen von ID3D11Device::CheckFeatureSupport und die Überprüfung auf 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

Freigabefähige Formate unterstützen in der Regel bereits die folgenden Bindungskennzeichnungen: D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE, D3D11_BIND_UNORDERED_ACCESS, D3D11_BIND_RENDER_TARGET und D3D11_BIND_DECODER.

Vorhandene unterstützte Verwendungen gemeinsam genutzter Ressourcen mit dem D3D11_BIND_VIDEO_ENCODER-Flag werden erweitert, um auch das in diesen Fällen hinzugefügte D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE-Flag zu unterstützen. Bestehende Einschränkungen in Bezug auf die Verwendung von gemeinsam genutzten Ressourcen mit D3D11_BIND_VIDEO_ENCODER werden beibehalten.

D3D11_BIND_VIDEO_ENCODER und D3D11_BIND_SHADER_RESOURCE schließen sich zuvor gegenseitig aus, außer wenn sie mit bestimmten anderen Bindungskennzeichnungen kombiniert wurden. Die Ausnahme wurde erweitert, damit D3D11_BIND_VIDEO_ENCODER und D3D11_BIND_SHADER_RESOURCE zusammen verwendet werden können, wenn D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE verwendet wird.

Das D3D11_RESOURCE_MISC_HW_PROTECTED-Flag wird mit dem D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE-Flag unterstützt.