Introducción a un dispositivo en Direct3D 11

El modelo de objetos de Direct3D 11 separa la funcionalidad de creación y representación de recursos en un dispositivo y uno o varios contextos; esta separación está diseñada para facilitar la multithreading.

Dispositivo

Un dispositivo se usa para crear recursos y enumerar las funcionalidades de un adaptador de pantalla. En Direct3D 11, un dispositivo se representa con una interfaz ID3D11Device .

Cada aplicación debe tener al menos un dispositivo, la mayoría de las aplicaciones solo crean un dispositivo. Cree un dispositivo para uno de los controladores de hardware instalados en la máquina llamando a D3D11CreateDevice o D3D11CreateDeviceAndSwapChain y especifique el tipo de controlador con la marca D3D_DRIVER_TYPE . Cada dispositivo puede usar uno o varios contextos de dispositivo, en función de la funcionalidad deseada.

Contexto del dispositivo

Un contexto de dispositivo contiene la circunstancia o configuración en la que se usa un dispositivo. Más concretamente, se usa un contexto de dispositivo para establecer el estado de canalización y generar comandos de representación mediante los recursos que pertenecen a un dispositivo. Direct3D 11 implementa dos tipos de contextos de dispositivo, uno para la representación inmediata y el otro para la representación diferida; ambos contextos se representan con una interfaz ID3D11DeviceContext .

Contexto inmediato

Un contexto inmediato se representa directamente en el controlador. Cada dispositivo tiene uno y solo un contexto inmediato que puede recuperar datos de la GPU. Se puede usar un contexto inmediato para representar inmediatamente (o reproducir) una lista de comandos.

Hay dos maneras de obtener un contexto inmediato:

Contexto diferido

Un contexto diferido registra comandos de GPU en una lista de comandos. Un contexto diferido se usa principalmente para multithreading y no es necesario para una aplicación de un solo subproceso. Normalmente, un subproceso de trabajo usa un contexto diferido en lugar del subproceso de representación principal. Al crear un contexto diferido, no hereda ningún estado del contexto inmediato.

Para obtener un contexto diferido, llame a ID3D11Device::CreateDeferredContext.

Cualquier contexto ( inmediato o diferido) se puede usar en cualquier subproceso siempre y cuando el contexto solo se use en un subproceso a la vez.

Consideraciones sobre los subprocesos

En esta tabla se resaltan las diferencias en el modelo de subprocesos de Direct3D 11 de versiones anteriores de Direct3D.

Diferencias entre Direct3D 11 y versiones anteriores de Direct3D:
Todos los métodos de interfaz ID3D11Device son subprocesos libres, lo que significa que es seguro que varios subprocesos llamen a las funciones al mismo tiempo.

  • Todas las interfaces derivadas de ID3D11DeviceChild (ID3D11Buffer, ID3D11Query, etc.) son subprocesos libres.
  • Direct3D 11 divide la creación y representación de recursos en dos interfaces. Map, Unmap, Begin, End y GetData se implementan en ID3D11DeviceContext porque ID3D11Device define fuertemente el orden de las operaciones. Las interfaces ID3D11Resource e ID3D11Asynchronous también implementan métodos para operaciones sin subprocesos.
  • Los métodos ID3D11DeviceContext (excepto los que existen en ID3D11DeviceChild) no tienen subprocesos libres, es decir, requieren un único subproceso. Solo un subproceso puede llamar de forma segura a cualquiera de sus métodos (Draw, Copy, Map, etc.) a la vez.
  • En general, el subproceso libre minimiza el número de primitivos de sincronización usados, así como su duración. Sin embargo, una aplicación que usa la sincronización mantenida durante mucho tiempo puede afectar directamente a la simultaneidad que una aplicación puede esperar lograr.
Los métodos de interfaz ID3D10Device no están diseñados para ser subprocesos libres. ID3D10Device implementa todas las funciones de creación y representación (como ID3D9Device en Direct3D 9. Map y Unmap se implementan en interfaces derivadas de ID3D10Resource, Begin, End y GetData se implementan en interfaces derivadas de ID3D10Asynchronous.

Dispositivos