Superfícies exibíveis

Antes das superfícies exibíveis, a apresentação era geralmente feita através da criação de uma cadeia de troca de buffers com propriedades idênticas, que eram então cicladas (invertidas) repetidamente, a fim de serem apresentadas à tela. Se você quisesse alterar as propriedades de um buffer a ser apresentado, teria que destruir essa cadeia de permuta e criar uma nova com todos os buffers atualizados para as mesmas novas propriedades.

O recurso de superfícies exibíveis adiciona um novo comportamento do sistema operacional (SO) que elimina essas restrições (mas requer suporte a drivers para se comportar corretamente). Especificamente, o recurso significa que os buffers apresentados podem ter propriedades variadas, e você pode apresentá-los em qualquer ordem.

Os recursos de superfícies exibíveis (e apresentação flexível) e suas APIs foram introduzidos no Windows 11 (Build 10.0.22000.194). A funcionalidade está habilitada em drivers com suporte, começando com drivers WDDM 3.0, permitindo cenários de apresentação aprimorados para Direct3D 11.

Verifique se há suporte e use superfícies visíveis

Para determinar se o recurso de superfícies exibiveis está disponível em um sistema, chame ID3D11Device::CheckFeatureSupport. Passe D3D11_FEATURE::D 3D11_FEATURE_DISPLAYABLE e receba uma estrutura D3D11_FEATURE_DATA_DISPLAYABLE.

A API ID3D11Device::CreateTexture2D oferece suporte a D3D11_RESOURCE_MISC_FLAG::D 3D11_RESOURCE_MISC_SHARED_DISPLAYABLE, QUE VOCÊ PODE USAR NO MEMBRO D3D11_TEXTURE2D_DESC::MiscFlags da estrutura que você passa para CreateTexture2D no parâmetro pDesc.

As texturas com D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE são restritas a um tamanho de matriz de 1 e a um nível de 1 mip.

Ao usar o sinalizador D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE na textura, você pode mostrar a textura em qualquer saída ativa (incluindo várias saídas simultaneamente). Dependendo do cenário, a textura pode acabar sendo consumida pelo compositor (DWM), digitalizada ou vinculada a várias partes do pipeline — potencialmente todas simultaneamente. Por exemplo, uma textura de captura de uma câmera pode ser mostrada em dois monitores e uma miniatura dela mostrada em um terceiro monitor, tudo ao mesmo tempo — e tudo a partir da mesma alocação sem cópias adicionais. No caso em que uma superfície exibível deve ser digitalizada em vários monitores, o sistema operacional coordenará a coleta de flip completes a partir das saídas envolvidas antes de alertar seu aplicativo de que a superfície é liberada de volta para ela — nenhuma coordenação de conclusão de flip é necessária do driver.

As texturas acima descritas devem poder ser visualizadas para uma utilização flexível na apresentação. Essas texturas não precisam ter as mesmas propriedades — por exemplo, formatos e tamanhos podem ser diferentes, e essas texturas devem poder ser exibidas em ordem arbitrária ("apresentação fora de ordem"). A apresentação ocorrerá usando o DDI Present1 existente, com seus padrões de chamada existentes. Por exemplo, considere um pool de seis buffers, três que são 720p (A, B e C) e três que são 4K (D, E e F): uma ordem de apresentação válida pode ser A-E-C-B-F-E-D-C>>>>>>>.

Formatos

O sinalizador D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE é suportado para os seguintes formatos no Direct3D 11:

Um driver também pode, opcionalmente, oferecer suporte aos seguintes formatos:

  • DXGI_FORMAT_P010

Você pode usar o exemplo de código a seguir para verificar se há suporte a superfícies exibíveis para os formatos opcionais acima. O exemplo envolve chamar ID3D11Device::CheckFeatureSupport e verificar se há 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
    }
}

Sinalizadores

Os formatos compartilháveis geralmente já oferecem suporte aos seguintes sinalizadores de ligação: D3D11_BIND_FLAG::D 3D11_BIND_SHADER_RESOURCE, D3D11_BIND_UNORDERED_ACCESS, D3D11_BIND_RENDER_TARGET e D3D11_BIND_DECODER.

Os usos existentes com suporte de recursos compartilhados com o sinalizador D3D11_BIND_VIDEO_ENCODER são estendidos para também oferecer suporte ao sinalizador D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE que está sendo adicionado nesses casos. As restrições existentes relacionadas ao uso de recursos compartilhados com D3D11_BIND_VIDEO_ENCODER são mantidas.

D3D11_BIND_VIDEO_ENCODER e D3D11_BIND_SHADER_RESOURCE eram anteriormente mutuamente exclusivos, exceto quando combinados com certos outros sinalizadores de ligação. A exceção foi estendida para permitir que D3D11_BIND_VIDEO_ENCODER e D3D11_BIND_SHADER_RESOURCE sejam usados juntos quando D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE é usado.

O sinalizador D3D11_RESOURCE_MISC_HW_PROTECTED é suportado com o sinalizador D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE.