Superficies que se pueden mostrar

Antes de las superficies mostrables, la presentación se hacía generalmente creando una cadena de intercambio de búferes con propiedades idénticas, que luego se alternaban de manera repetida, para ser presentados en la pantalla. Si quería cambiar las propiedades de un búfer que se iba a presentar, tenía que destruir esa cadena de intercambio y crear una nueva con todos los búferes actualizados a las mismas propiedades nuevas.

La característica de superficies mostrables agrega un nuevo comportamiento del sistema operativo (SO) que elimina esas restricciones (pero es necesario que haya compatibilidad con el controlador para que funcione correctamente). En concreto, esta característica significa que los búferes que se muestran pueden tener propiedades variables y que se pueden presentar en cualquier orden.

Las características de las superficies que se pueden mostrar (y presentación flexible) y sus API, se introdujeron en Windows 11 (compilación 10.0.22000.194). La funcionalidad está habilitada en controladores compatibles, comenzando con los controladores WDDM 3.0, lo que permite mejorar los escenarios de presentación para Direct3D 11.

Verificar el soporte y usar superficies mostrables

Para determinar si la característica de superficies visibles está disponible en un sistema, llame a ID3D11Device::CheckFeatureSupport. Pase D3D11_FEATURE::D3D11_FEATURE_DISPLAYABLE y reciba una estructura D3D11_FEATURE_DATA_DISPLAYABLE.

La API ID3D11Device::CreateTexture2D admite D3D11_RESOURCE_MISC_FLAG::D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE, que puede usar en el miembro D3D11_TEXTURE2D_DESC::MiscFlags de la estructura que se pasa a CreateTexture2D en el parámetro pDesc.

Las texturas con D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE están restringidas a un tamaño de matriz de 1 y a 1 nivel mip.

Al usar la bandera D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE en la textura, puede mostrar la textura en cualquier salida activa (incluidas varias salidas simultáneamente). En función del escenario, la textura podría acabar siendo consumida por el compositor (DWM), digitalizada o enlazada a varias partes de la canalización, posiblemente todas simultáneamente. Por ejemplo, una textura de captura de una cámara podría aparecer en dos pantallas y una miniatura de ella aparecer en una tercera pantalla, al mismo tiempo, y todas desde la misma asignación sin copias adicionales. En el caso de que una superficie visible deba ser escaneada en varias pantallas, el sistema operativo coordinará la recopilación de completados de volteo de las pantallas implicadas antes de alertar a su aplicación que la superficie se ha liberado de nuevo; no se requiere coordinación de la finalización del volteo por parte del controlador.

Para presentar una textura que se pueda mostrar en la pantalla, puede usar la API de cadena de intercambio de composición. Mediante el uso de superficies que se pueden mostrar en lugar de superficies sin formato, el sistema puede optimizar la presentación en algunas situaciones para omitir el compositor del sistema y analizar las superficies directamente, lo que reduce la sobrecarga de GPU/CPU, así como la latencia general. Esto es similar al uso de cadenas de intercambio DXGI con los modos de presentación de "giro". Para obtener más información, consulte Para obtener el mejor rendimiento, use el modelo de giro de DXGI.

Estas texturas, como se describió anteriormente, deben ser visibles para uso flexible de la presentación. No es necesario que estar texturas tengan las mismas propiedades; por ejemplo, los formatos y los tamaños pueden diferir, y estas texturas deben se visibles en orden arbitrario ("presentación desordenada"). La presentación tendrá lugar usando la DDI Present1 actual, con sus patrones de llamada existentes. Por ejemplo, tenga en cuenta un grupo de seis búferes, tres que son 720p (A, B y C) y tres que son 4K (D, E y F): un orden de presentación válido podría ser A->E->C->B->F->E->D->C.

Formatos

La marca D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE es compatible con los siguientes formatos en Direct3D 11:

Un driver también puede admitir, opcionalmente, los siguientes formatos:

  • DXGI_FORMAT_P010

Puede usar el siguiente ejemplo de código para comprobar si hay superficies visibles compatibles con los formatos opcionales anteriores. El ejemplo consiste en llamar a ID3D11Device::CheckFeatureSupport y comprobar 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
    }
}

Banderas

Los formatos que se pueden compartir ya admiten normalmente las siguientes marcas de enlace: D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE, D3D11_BIND_UNORDERED_ACCESS, D3D11_BIND_RENDER_TARGET y D3D11_BIND_DECODER.

Los usos admitidos existentes de recursos compartidos con el indicador D3D11_BIND_VIDEO_ENCODER se amplían para admitir también el indicador D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE que se añade en estos casos. Se mantienen las restricciones existentes relacionadas con el uso de recursos compartidos con D3D11_BIND_VIDEO_ENCODER.

D3D11_BIND_VIDEO_ENCODER y D3D11_BIND_SHADER_RESOURCE anteriormente eran mutuamente excluyentes, excepto cuando se combinaban con otras marcas de enlace. La excepción se ha ampliado para permitir que se usen conjuntamente D3D11_BIND_VIDEO_ENCODER y D3D11_BIND_SHADER_RESOURCE cuando se usa D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE .

La bandera D3D11_RESOURCE_MISC_HW_PROTECTED es compatible con la bandera D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE.