Superfícies exibíveis

Antes das superfícies exibíveis, a apresentação geralmente era feita criando uma cadeia de troca de buffers com propriedades idênticas, que eram então alternadas (invertidas) repetidamente, para serem apresentadas na tela. Se você quisesse alterar as propriedades de um buffer a ser apresentado, teria que destruir essa cadeia de troca 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 de driver 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 é 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 exibíveis

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

A API ID3D11Device::CreateTexture2D oferece suporta a D3D11_RESOURCE_MISC_FLAG::D3D11_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 1 nível de 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), exibida ou vinculada a várias partes do pipeline, potencialmente todas de forma simultânea. Por exemplo, uma textura de captura de uma câmera pode ser mostrada em duas telas e uma miniatura dela mostrada em uma terceira tela, tudo ao mesmo tempo, e tudo da mesma alocação sem cópias adicionais. No caso em que uma superfície exibível deve ser exibida em vários monitores, o sistema operacional coordenará a coleta de conclusões de inversão das saídas envolvidas antes de alertar seu aplicativo de que a superfície é liberada de volta para ele Nenhuma coordenação de conclusão de inversão é necessária do driver.

Para apresentar uma textura exibível na tela, você pode usar a API de cadeia de troca de composição. Ao usar superfícies exibíveis em vez de superfícies simples, o sistema consegue otimizar a apresentação em algumas situações para ignorar o compositor do sistema e escanear as superfícies diretamente, o que reduz a sobrecarga da GPU/CPU, bem como a latência geral. Isso é semelhante ao uso de cadeias de troca DXGI com os modos de apresentação "inverter". Consulte Para obter o melhor desempenho, use o modelo de inversão DXGI para obter mais informações.

As texturas descritas acima devem ser exibidas para uso flexível da 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 a DDI Present1, 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 tem suporte para os seguintes formatos no Direct3D 11:

Como alternativa, um driver também pode oferecer suporte aos seguintes formatos:

  • DXGI_FORMAT_P010

Você pode usar o exemplo de código a seguir para verificar o 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 associação: D3D11_BIND_FLAG::D3D11_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 determinados outros sinalizadores de vinculaçã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 for usado.

O sinalizador D3D11_RESOURCE_MISC_HW_PROTECTED é suportado com o sinalizador D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE.