Leer en inglés

Compartir a través de


Ruta de presentación de DXGI

DXGI proporciona a las aplicaciones una metodología de presentación que "solo funciona". Por ejemplo, no es necesario que las aplicaciones realicen operaciones especiales para realizar la transición entre el modo de ventana y el modo de pantalla completa. Esta metodología de presentación es posible porque DXGI y el controlador de pantalla en modo de usuario funcionan conjuntamente para conservar la presentación entre combinaciones de suavizado de contorno de muestra múltiple (MSAA), la rotación del monitor, las diferencias de búfer frontal y de tamaño y formato, y los modos de pantalla completa frente a los modos de ventana. Otra ventaja de DXGI es que permite que un adaptador de pantalla tenga una capacidad limitada para escanear MSAA y superficies rotadas porque DXGI proporciona una DDI "sin estado". En un DDI sin estado, el controlador del adaptador no es necesario para registrar datos en llamadas DDI.

La tarea básica de presentación es mover los datos de un búfer de reserva representado a la superficie principal para su visualización. Esta tarea se realiza en las diferentes situaciones que se describen en las secciones siguientes.

Modo de ventana con DWM en

En el modo de ventana con el Administrador de Windows de escritorio (DWM) en mayúsculas y minúsculas, DXGI se comunica con DWM y abre una vista de un recurso compartido que es un destino de representación para el productor DXGI y una textura para DWM. Este recurso compartido existe además de los búferes de reserva que crea la aplicación. DXGI llama a la función BltDXGI del controlador para mover datos de cualquiera de los búferes de reserva a la superficie compartida. Esta operación puede requerir la resolución de extensión, conversión de color y MSAA. Sin embargo, esta operación nunca requiere subrectángulos de origen y destino. De hecho, estos subctángulos no se pueden expresar en la llamada a BltDXGI. Esta transferencia de bloque de bits (bitblt) siempre tiene la marca Present establecida en el miembro Flags de la estructura DXGI_DDI_ARG_BLT a la que apunta el parámetro pBltData . Establecer la marca Present indica que el controlador debe realizar la operación de forma atómica. El controlador realiza la operación bitblt de forma atómica para minimizar la posibilidad de desmontaje mientras DWM lee el recurso compartido para la composición.

Modo de ventana con DWM desactivado

En el modo de ventana con mayúsculas y minúsculas de DWM desactivado, DXGI llama a la función PresentDXGI del controlador con la marca Blt establecida en el miembro Flags de la estructura DXGI_DDI_ARG_PRESENT a la que apunta el parámetro pPresentData. En esta llamada PresentDXGI , DXGI puede especificar cualquiera de los búferes de reserva creados por la aplicación en los miembros hSurfaceToPresent y SrcSubResourceIndex de DXGI_DDI_ARG_PRESENT. No hay ninguna superficie compartida adicional.

Modo de pantalla completa

El caso de pantalla completa es más complicado que el modo con ventanas con DWM activado o desactivado.

Cuando DXGI realiza la transición al modo de pantalla completa, intenta aprovechar una operación de volteo para reducir el ancho de banda y obtener sincronización vertical. Las condiciones siguientes pueden impedir el uso de una operación de volteo:

  • La aplicación no volvió a asignar sus búferes de reserva de forma que coincidan con la superficie principal.

  • El controlador especificó que no examinará el búfer de reserva (por ejemplo, porque el búfer de reserva se gira o es MSAA).

  • La aplicación especificó que no puede aceptar el tiempo de ejecución de Direct3D descartando el contenido del búfer de reserva y solicitó solo un búfer (total) en la cadena. (En este caso, DXGI asigna una superficie trasera y una superficie principal; sin embargo, DXGI usa la función PresentDXGI del controlador con el conjunto de marcas Blt ).

Cuando se ha producido una de las condiciones anteriores, lo que impide una operación de volteo y una llamada a la función PresentDXGI del controlador con el conjunto de marcas Blt tampoco es adecuado (porque el búfer de reserva no coincide exactamente con el búfer frontal), DXGI asigna la superficie del proxy. Esta superficie de proxy coincide con el búfer frontal. Por lo tanto, se puede cambiar entre la superficie del proxy y el búfer frontal. Si la superficie de proxy existe, DXGI usa la función BltDXGI del controlador con la marca Present desactivada (0) para copiar los búferes de reserva de la aplicación en la superficie del proxy. En esta llamada BltDXGI , DXGI podría solicitar la conversión, el extendido y la resolución. A continuación, DXGI llama a la función PresentDXGI del controlador con la marca Flip establecida en el miembro Flags de la estructura DXGI_DDI_ARG_PRESENT para mover los bits de superficie del proxy para examinar.

Para notificar al controlador de pantalla en modo de usuario que el controlador puede rechazar el examen, el controlador recibirá llamadas de creación de recursos para clases opcionales y no opcionales de superficies de exploración. Las superficies de exploración opcionales se designan mediante la marca DXGI_DDI_PRIMARY_OPTIONAL. Las superficies de exploración no opcionales no tienen establecida la marca DXGI_DDI_PRIMARY_OPTIONAL. Para obtener más información sobre estos tipos de llamadas de creación de recursos, vea Pasar información de DXGI en tiempo de creación de recursos.

DXGI establece la marca DXGI_DDI_PRIMARY_OPTIONAL para crear todas las superficies de búfer de reserva (es decir, superficies opcionales) y no establece la marca para ninguna superficie de proxy o búfer frontal (es decir, superficie no opcional).

Si DXGI_DDI_PRIMARY_OPTIONAL se establece para un búfer de reserva, el controlador puede establecer la marca DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT. Para obtener más información sobre cómo establecer esta marca, vea Pasar información de DXGI en tiempo de creación de recursos. Si el controlador establece DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT para un búfer opcional, no tiene ningún efecto que haga que DXGI llame a la función PresentDXGI del controlador con la marca Blt establecida en lugar de con el conjunto de marcas Flip .

Si no se establece DXGI_DDI_PRIMARY_OPTIONAL para un búfer frontal o la superficie de proxy, el controlador todavía puede optar por no realizar el examen si se produce un error en la llamada de creación de recursos con código de error DXGI_DDI_ERR_UNSUPPORTED y al establecer DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT.

Nota Si se produce un error en la llamada de creación sin establecer DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT, se reserva para casos de error reales, como memoria insuficiente.

DXGI aprovecha esta metodología de exclusión cuando intenta crear una cadena de presentación de pantalla completa para un MSAA o un búfer de reserva girado. Si el controlador no examinará ninguno de estos tipos o ambos tipos, el controlador rechazará. A continuación, DXGI intentará crear una superficie no rotada, una superficie que no sea MSAA o ambas hasta que el controlador acepte la creación de recursos. Por lo tanto, DXGI se revertirá progresivamente hasta que la superficie no opcional coincida exactamente con el formato del búfer frontal, el recuento de muestras, la rotación y el tamaño.

Si el controlador no acepta ninguna superficie no opcional, DXGI todavía debe tener una manera de mover bits del búfer de reserva a la superficie principal. Por lo tanto, si el controlador opta por no examinar MSAA y rotación, el controlador opta por resolver, girar o ambos cuando DXGI llama a la función BltDXGI del controlador. Cuando el controlador opte por no participar, DXGI creará una superficie de proxy y llamará a BltDXGI para mover datos de los búferes de reserva a esa superficie de proxy. El controlador no debe tener ninguna razón para no participar en esta superficie de proxy porque el proxy coincide exactamente con el búfer frontal.

Las siguientes situaciones inusuales se producen cuando la aplicación no vuelve a crear sus superficies después de una transición en modo de pantalla completa o fuera de ella:

  • Si la aplicación no vuelve a crear sus superficies cuando entra en modo de pantalla completa, DXGI determina que los búferes de reserva no coinciden con el búfer frontal, incluso si realmente coinciden con el formato, el tamaño, la rotación y el recuento de muestras. El motivo de esta determinación es que el sistema operativo requiere que se etiqueten búferes de reserva para el examen en un monitor determinado cuando se creen esos búferes. Todavía no se pueden asignar búferes de reserva con ventanas a un monitor determinado porque el monitor se elige dinámicamente cuando se escribe la pantalla completa. Por lo tanto, DXGI no debe enviar estos búferes de reserva al controlador para el examen (a través de una operación de volteo). Las aplicaciones de este tipo normalmente obligan a DXGI a crear la superficie de proxy.

  • Si la aplicación no vuelve a crear sus búferes de reserva cuando vuelve al modo con ventanas, DXGI podría llamar al BltDXGI del controlador o PresentDXGI (con el conjunto Blt ) para realizar un bitblt en una superficie que se creó anteriormente para una operación de volteo. Esta situación no debe ser un problema, pero se menciona aquí por integridad. Tenga en cuenta que DXGI siempre destruye la superficie de proxy cuando la aplicación pasa al modo de ventana.

Además, tenga en cuenta que las aplicaciones pueden cambiar el tamaño de sus búferes de reserva dinámicamente mientras las aplicaciones están en modo de pantalla completa. Esta acción hace que la lógica que se describe en las situaciones anteriores se vuelva a producir. Por lo tanto, es posible que la superficie de proxy se cree y destruya, y es posible que no se requiera o no con el tiempo, aunque la aplicación permanezca en modo de pantalla completa. La aplicación también puede transferir su salida a otro monitor dinámicamente sin salir del modo de pantalla completa. Por lo tanto, la aplicación incurre en un cambio al modo bitblt porque los búferes de reserva de la aplicación se etiquetaron para un monitor diferente.

Por último, debe tener en cuenta la situación que se produce con respecto a los búferes de reserva de MSAA si el controlador no rechaza el examen de MSAA. En esta situación, el controlador opta por el examen de MSAA. Por lo tanto, DXGI intercambia el búfer de reserva de MSAA y el búfer frontal de MSAA a través de operaciones de volteo, y realiza una operación de resolución por lo que es equivalente al convertidor digital a analógico (DAC). En esta situación, la aplicación puede cambiar el tamaño de sus búferes de reserva dinámicamente mientras está en modo de pantalla completa, lo que obliga a DXGI a cambiar a llamar a la función BltDXGI del controlador. Dado que las características de MSAA del búfer de reserva y el búfer frontal siguen coinciden, DXGI especificará que el controlador realice una operación de conversión de colores, posiblemente de conversión de colores y bitblt extendido. A continuación, el controlador debe replicar, sin resolver, varios muestreos en el búfer frontal, lo que es necesario si un controlador decide examinar la MSAA.