Compartir a través de


Superficies que se pueden mostrar

Antes de las superficies visibles, la presentación se hacía generalmente creando una cadena de intercambio de búferes con propiedades idénticas, que luego se revertían (invertir) a través de repetidas veces, para que puedan aparecer en la pantalla. Si quería cambiar las propiedades de un búfer que se va 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 visibles agrega un nuevo comportamiento del sistema operativo (SO) que elimina esas restricciones (pero es necesario que sea compatible con driver para que funcione correctamente). En concreto, la característica significa que los búferes que se presentan pueden tener propiedades variables y se pueden presentar en cualquier orden.

Las superficies visibles (y la presentación flexible) y sus API se introdujeron en Windows 11 (compilación 10.0.22000.194). La funcionalidad está habilitada en drivers compatibles, a partir de drivers WDDM 3.0, lo que permite mejores escenarios de presentación para Direct3D 11.

Comprobar la compatibilidad y usar superficies visibles

Para determinar si la característica de superficies visibles está disponible en un sistema, llame a ID3D11Device::CheckFeatureSupport. Pase D3D11_FEATURE::D 3D11_FEATURE_DISPLAYABLE y reciba una estructura de 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 marca 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 se examine una superficie visible en varias pantallas, el sistema operativo coordinará la colección de resultados invertibles de las salidas implicadas antes de alertar a la aplicación de que la superficie se libera de nuevo, no es necesario cordinar la finalización de invertir el driver.

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 se producirá con 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, debe llamar a ID3D11Device::CheckFeatureSupport y comprobar si hay 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

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 la marca D3D11_BIND_VIDEO_ENCODER se extienden para admitir también la marca D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE que se agrega 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 marca D3D11_RESOURCE_MISC_HW_PROTECTED es compatible con la marca D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE .