Asignación de búfer de vértices y comandos

Hay tres tipos de búferes usados en Direct3D:

  • Búferes de vértices 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értices implícito después de la creación del contexto y Direct3D almacena los datos de vértices en ellos.

  • Búferes de vértices explícitos, que solo se crean en respuesta a una solicitud de aplicación. Direct3D almacena los datos de vértices en búferes de vértices 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értices implícitos son búferes de vértices especiales usados internamente por Direct3D para el procesamiento por lotes. Se crean durante la inicialización del dispositivo y pueden ser multibuffered. Siempre son de lectura y escritura, por lo que no deben colocarse en 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 de DDSCAPS2_VERTEXBUFFER y DDSCAPS2_COMMANDBUFFER.

La aplicación crea y controla los búferes de vértices explícitos. No se pueden usar multibuffered y no se pueden colocar en memoria de vídeo local o no local, a menos que se establezca la marca de DDSCAPS_WRITEONLY. Los búferes de vértices explícitos se marcan con DDSCAPS_VERTEXBUFFER.

Los búferes de comandos los usa Direct3D para los comandos por lotes. Pueden ser multibuffered y se usan para todas las API, excepto para TLVERTEX o llamadas API de ejecución no recortadas. 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 con las que están asociadas. Todos los búferes se pasan a la devolución de llamada D3dDrawPrimitives2 del controlador.

Vértices asignados por controladores y búferes de comandos

Opcionalmente, un controlador direct3D realiza la asignación de vértices y búferes de comandos proporcionando funciones de devolución de llamada. Para proporcionar estas funciones de devolución de llamada, el controlador direct3D rellena una estructura de DD_D3DBUFCALLBACKS y apunta al miembro lpD3DBufCallbacks de la estructura de DD_HALINFO . DrvGetDirectDrawInfo devuelve DD_HALINFO en respuesta a la inicialización del componente DirectDraw del controlador. Las devoluciones de llamada notificadas en la estructura DD_D3DBUFCALLBACKS son:

Estas funciones se llaman de la misma manera que las devoluciones de llamada DdXxxSurface (como DdCanCreateSurface) y solo cuando se establece la marca de DDSCAPS_EXECUTEBUFFER. 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értices 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 recorre estos búferes. Direct3D rellena un par determinado mientras el hardware se representa de forma asincrónica desde los otros búferes en cola. Esto es muy útil con el acceso directo a la memoria (DMA).

Los búferes de un conjunto de multibuffering pueden estar en diferentes tipos de memoria, es decir, en 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 establece la marca D3DHALDP2_SWAPVERTEXBUFFER o D3DHALDP2_SWAPCOMMANDBUFFER. Si el búfer devuelto está en memoria de vídeo, se debe establecer la marca 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 más grande. El controlador debe realizar un seguimiento de cuántos búferes y qué tipos de memoria son y limpiar todo lo que está al salir.