Asignación de búfer de vértices y comandos
Hay tres tipos de búferes que se usan en Direct3D:
Búferes de vértice implícitos, que se crean solo para uso interno; es decir, las aplicaciones no son conscientes de ellas. Siempre se crea un búfer de vértice implícito después de la creación del contexto y Direct3D almacena los datos de vértices en ellos.
Búferes de vértice explícitos, que se crean solo en respuesta a una solicitud de aplicación. A continuación, Direct3D almacena los datos de vértices en búferes de vértice explícitos.
Búferes de comandos, que se crean solo para uso interno; es decir, las aplicaciones no son conscientes de los búferes de comandos. Direct3D almacena datos de comandos en búferes de comandos.
Los búferes de vértice implícitos son búferes de vértices especiales utilizados internamente por Direct3D para el procesamiento por lotes. Se crean durante la inicialización del dispositivo y se pueden multibuffered. Siempre son de lectura y escritura, por lo que no deben colocarse en la memoria de vídeo (para Microsoft DirectX 6.0 y las versiones posteriores). Este tipo de búfer está marcado por la ausencia de las marcas DDSCAPS2_VERTEXBUFFER y DDSCAPS2_COMMANDBUFFER de almacenamiento.
La aplicación crea y controla los búferes de vértice explícitos. No se pueden multi búfer y no se pueden colocar en la memoria de vídeo local o no local a menos que se establezca DDSCAPS_WRITEONLY marca. Los búferes de vértice explícitos se marcan con DDSCAPS_VERTEXBUFFER.
Direct3D usa búferes de comandos para los comandos por lotes. Pueden tener varios búferes y se usan para todas las API, excepto para TLVERTEX o llamadas API de búfer de ejecución sinclima. Este tipo de búfer está marcado por la marca DDSCAPS2_COMMANDBUFFER. Siempre son de solo escritura, aunque no se establece ninguna marca explícita y nunca contienen instrucciones no válidas.
De forma predeterminada, el entorno de ejecución de Direct3D asigna todos estos búferes. Se accede a los búferes de vértices implícitos y a los búferes de comandos a través de las superficies a las que están asociados. Todos los búferes se pasan a la devolución de llamada D3dDrawPrimitives2 del controlador.
Búferes de vértices y comandos asignados por el controlador
Opcionalmente, un controlador direct3D realiza la asignación de búferes de vértices y comandos mediante el suministro de funciones de devolución de llamada. Para proporcionar estas funciones de devolución de llamada, el controlador de Direct3D rellena una estructura DD_D3DBUFCALLBACKS y le señala el miembro lpD3DBufCallbacks de la estructura DD_HALINFO . DD_HALINFO drvGetDirectDrawInfo devuelve en respuesta a la inicialización del componente DirectDraw del controlador. Las devoluciones de llamada notificadas en la DD_D3DBUFCALLBACKS estructura son:
Estas funciones se llaman de la misma manera que las devoluciones de llamada de DdXxxSurface (como DdCanCreateSurface) y solo cuando se establece la marca DDSCAPS_EXECUTEBUFFER aplicación. Las marcas de creación del búfer se DDSCAPS_WRITEONLY, DDSCAPS2_VERTEXBUFFER y DDSCAPS2_COMMANDBUFFER.
Los controladores determinan el tipo de búfer que se solicita comprobando el miembro ddsCaps de la estructura DD_SURFACE_LOCAL pasada a la devolución de llamada CanCreateExecuteBuffer y CreateExecuteBuffer para las marcas siguientes:
DDSCAPS_VERTEXBUFFER indica que el controlador debe asignar un búfer de vértice explícito.
DDSCAPS_COMMANDBUFFER indica que el controlador debe asignar un búfer de comandos.
Si no se establece ninguna marca, el controlador debe asignar un búfer de vértices implícito.
El controlador asigna internamente búferes de vértices y comandos y ciclos a través de estos búferes. Direct3D rellena un par determinado mientras el hardware se representa de forma asincrónica desde los demás búferes en cola. Esto es muy útil con el acceso directo a memoria (DMA).
Los búferes de un conjunto de varios búferes pueden estar en diferentes tipos de memoria, es decir, en la memoria del sistema o de vídeo. Cuando se llama al controlador para crear el primer búfer, crea el conjunto inmediatamente y devuelve el primer búfer del conjunto en Direct3D. El controlador usa marcas para especificar el tipo de memoria que usó para asignar cada búfer del conjunto. El controlador debe devolver un nuevo búfer en la memoria del sistema para cada llamada a D3dDrawPrimitives2 si se D3DHALDP2_SWAPVERTEXBUFFER o D3DHALDP2_SWAPCOMMANDBUFFER marca. Si el búfer devuelto está en memoria de vídeo, se debe establecer D3DHALDP2_VIDMEMVERTEXBUF o D3DHALDP2_VIDMEMCOMMANDBUF correspondiente.
En ocasiones, Direct3D solicita el tamaño mínimo para el siguiente búfer. Si el tamaño es demasiado grande, el controlador debe asignar el búfer en la memoria del sistema (una superficie de respaldo). Si el tamaño es demasiado pequeño, el controlador puede proporcionar un búfer mayor. El controlador debe realizar un seguimiento de cuántos búferes y qué tipos de memoria son y limpiar todo al salir.