Surfaces affichables
Avant les surfaces affichables, la présentation a généralement été effectuée en créant une chaîne d’échange de mémoires tampons avec des propriétés identiques, qui ont ensuite été parcourues (retournées) à plusieurs reprises, afin d’être présentées à l’écran. Si vous souhaitez changer les propriétés d’une mémoire tampon à présenter, vous devez détruire cette chaîne d’échange et en créer une nouvelle avec toutes les mémoires tampons mises à jour avec les mêmes nouvelles propriétés.
La fonctionnalité de surfaces affichables ajoute un nouveau comportement de système d’exploitation qui élimine ces restrictions (mais nécessite la prise en charge du gestionnaire pour se comporter correctement). Plus spécifiquement, la fonctionnalité signifie que les mémoires tampons présentées peuvent avoir des propriétés variables et que vous pouvez les présenter dans n’importe quel ordre.
Les fonctionnalités de surfaces affichables (et de présentation flexible), ainsi que leurs API, ont été introduites dans Windows 11 (version 10.0.22000.194). La fonctionnalité est activée sur les gestionnaires pris en charge, à compter des gestionnaires WDDM 3.0, ce qui permet d’améliorer les scénarios de présentation pour Direct3D 11.
Vérifier la prise en charge et utiliser les surfaces affichables
Pour déterminer si la fonctionnalité de surfaces affichables est disponible sur un système, appelez ID3D11Device::CheckFeatureSupport. Transférez D3D11_FEATURE::D3D11_FEATURE_DISPLAYABLE et recevez une structure D3D11_FEATURE_DATA_DISPLAYABLE.
L’API ID3D11Device::CreateTexture2D prend en charge D3D11_RESOURCE_MISC_FLAG::D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE, que vous pouvez utiliser dans le membre D3D11_TEXTURE2D_DESC::MiscFlags de la structure que vous transférez à CreateTexture2D dans le paramètre pDesc.
Les textures avec D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE sont limitées à une taille de tableau de 1 et à 1 niveau MIP.
Lorsque vous utilisez l’indicateur D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE sur la texture, vous pouvez afficher la texture sur n’importe quelle production active (y compris plusieurs productions simultanément). Selon le scénario, la texture peut finir par être consommée par le compositeur (gestionnaire de fenêtrage), analysée ou liée à différentes parties du pipeline, potentiellement toutes simultanément. Par exemple, une texture de capture à partir d’une caméra peut apparaître sur deux affichages, et une miniature de celle-ci affichée sur un troisième affichage, le tout simultanément, et à partir de la même répartition sans copies supplémentaires. Dans le cas où une surface affichable doit être analysée sur plusieurs affichages, le système d’exploitation coordonne la collection de sorties retournées à partir des productions impliquées avant d’alerter votre application que la surface est renvoyée à celle-ci – aucune coordination de la sortie retournée n’est requise de la part du gestionnaire.
Pour présenter une texture affichable à l’écran, vous pouvez utiliser l’API Composition Swapchain. En utilisant des surfaces affichables plutôt que des surfaces simples, le système est capable d’optimiser la présentation dans certaines situations pour contourner le compositeur du système et scanner directement les surfaces, ce qui réduit la charge sur le GPU/CPU ainsi que la latence globale. Cela est similaire à l’utilisation des swapchains DXGI avec les modes de présentation « flip ». Veuillez consulter Pour des performances optimales, utilisez le modèle flip de DXGI pour plus d’informations.
Les textures décrites ci-dessus doivent être affichables pour une utilisation flexible de la présentation. Ces textures ne sont pas tenues d’avoir les mêmes propriétés – par exemple, les formats et les tailles peuvent différer, et ces textures doivent pouvoir être affichées dans un ordre arbitraire (« présentation dans le désordre »). La présentation se fait à l’aide de l’instance Present1 DDI existante, avec ses motifs d’appel existants. Par exemple, supposez une poule de six mémoires tampons, trois qui sont 720p (A, B et C) et trois qui sont 4K (D, E et F) : un ordre de présentation valide peut être A->E->C->B->F->E->D->C.
Formats
L’indicateur D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE est pris en charge pour les formats suivants dans Direct3D 11 :
- DXGI_FORMAT::DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_NV12
- DXGI_FORMAT_YUY2
Un gestionnaire peut également (de manière facultative) prendre en charge les formats suivants :
- DXGI_FORMAT_P010
Vous pouvez utiliser l’exemple de code suivant pour vérifier la prise en charge des surfaces affichables pour les formats facultatifs ci-dessus. L’exemple implique d’appeler ID3D11Device::CheckFeatureSupport et de vérifier la présence de 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
}
}
Indicateurs
Les formats partageables prennent déjà en charge les indicateurs de liaison suivants : D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE, D3D11_BIND_UNORDERED_ACCESS, D3D11_BIND_RENDER_TARGET et D3D11_BIND_DECODER.
Les utilisations existantes prises en charge des ressources partagées avec l’indicateur D3D11_BIND_VIDEO_ENCODER sont étendues pour prendre également en charge l’indicateur D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE ajouté dans ces cas. Les restrictions existantes relatives à l’utilisation de ressources partagées avec D3D11_BIND_VIDEO_ENCODER sont conservées.
D3D11_BIND_VIDEO_ENCODER et D3D11_BIND_SHADER_RESOURCE étaient auparavant mutuellement exclusifs, sauf lorsqu’ils étaient combinés avec certains autres indicateurs de liaison. L’exception a été étendue pour permettre à D3D11_BIND_VIDEO_ENCODER et D3D11_BIND_SHADER_RESOURCE d’être utilisés ensemble lorsque D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE est utilisé.
L’indicateur D3D11_RESOURCE_MISC_HW_PROTECTED est pris en charge avec l’indicateur D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE.