LPD3DHAL_DRAWPRIMITIVES2CB función de devolución de llamada (d3dhal.h)
La función D3dDrawPrimitives2 representa primitivos y devuelve el estado de representación actualizado.
Sintaxis
LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;
DWORD Lpd3dhalDrawprimitives2cb(
LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}
Parámetros
unnamedParam1
pdp [in]
Apunta a una estructura de D3DHAL_DRAWPRIMITIVES2DATA que contiene la información necesaria para que el controlador represente uno o varios primitivos.
Valor devuelto
D3dDrawPrimitives2 devuelve uno de los siguientes códigos de devolución de llamada:
Observaciones
D3dDrawPrimitives2 debe implementarse en controladores de Microsoft Direct3D.
El controlador debe hacer lo siguiente:
- Asegúrese de que el identificador de contexto especificado por el dwhContext miembro de la estructura D3DHAL_DRAWPRIMITIVES2DATA en pdp sea válido.
- Compruebe que una voltea a la superficie de dibujo asociada al contexto no está en curso. Si la superficie de dibujo está implicada en un volteo, el controlador debe establecer el miembro ddrval de D3DHAL_DRAWPRIMITIVES2DATA en DDERR_WASSTILLDRAWING y devolver DDHAL_DRIVER_HANDLED.
- Determine la ubicación de la primera estructura de D3DHAL_DP2COMMAND agregando el número de bytes en el miembro dwCommandOffset de D3DHAL_DRAWPRIMITIVES2DATA al búfer de comandos al que el lpDDCommands miembro de puntos de D3DHAL_DRAWPRIMITIVES2DATA.
- Determine la ubicación del primer vértice del búfer de vértices. Esto solo debe hacerse si hay datos en el búfer de vértices; es decir, cuando se recibe un token de comando dexxx D3DDP2OP_ D3DDP2OP_LINELIST_IMM o D3DDP2OP_TRIANGLEFAN_IMM. Estos dos códigos de operación indican que los datos de vértices se pasan inmediatamente en el flujo de comandos, en lugar de en un búfer de vértices. Por lo tanto, suponiendo que haya datos en el búfer de vértices, si el búfer de vértices está en la memoria del usuario, el primer vértice es dwVertexOffset bytes en el búfer al que lpVertices apunta. De lo contrario, el controlador debe aplicar dwVertexOffset a la memoria asociada a la estructura de DD_SURFACE_LOCAL a la que puntos de lpDVertex. dwVertexOffset, lpVerticesy lpDDVertex son miembros de D3DHAL_DRAWPRIMITIVES2DATA.
- Compruebe el miembro dwVertexType de D3DHAL_DRAWPRIMITIVES2DATA para asegurarse de que el controlador admite el FVFsolicitado. El controlador debe producir un error en la llamada si existe alguna de las condiciones siguientes:
- No se especifican coordenadas de vértice; es decir, si no se establece D3DFVF_XYZRHW.
- Se especifican los normales; es decir, si se establece D3DFVF_NORMAL.
- Se establece cualquiera de los bits D3DFVF_RESERVED x reservados.
- Procese todos los comandos del búfer de comandos secuencialmente. Para cada estructura de D3DHAL_DP2COMMAND, el controlador debe hacer lo siguiente:
- Si el comando es D3DDP2OP_RENDERSTATE, procese las estructuras de wStateCount D3DHAL_DP2RENDERSTATE siguientes en el búfer de comandos, actualizando el estado del controlador para cada estructura de estado de representación. Cuando se establece la marca D3DHALDP2_EXECUTEBUFFER, el controlador también debe reflejar el cambio de estado en la matriz a la que lpdwRStates apunta. wStateCount y lpdwRStates son miembros de D3DHAL_DRAWPRIMITIVES2DATA.
- Si el comando es D3DDP2OP_TEXTURESTAGESTATE, procese las estructuras wStateCount D3DHAL_DP2TEXTURESTAGESTATE que siguen en el búfer de comandos, actualizando el estado de textura del controlador asociado a la fase de textura especificada para cada estructura de estado de textura.
- Si el comando es D3DDP2OP_VIEWPORTINFO, procese la estructura D3DHAL_DP2VIEWPORTINFO siguiente en el búfer de comandos, actualizando la información de la ventanilla almacenada en el contexto de representación interno del controlador.
- Si el comando es D3DDP2OP_WINFO, procese la estructura D3DHAL_DP2WINFO siguiente en el búfer de comandos, actualizando la información de almacenamiento en búfer w almacenada en el contexto de representación interno del controlador.
- De lo contrario, procese las estructuras primitivas de D3DHAL_DP2Xxx que siguen el comando de representación primitiva D3DDP2OP_Xxx en el búfer de comandos.
- Si el comando es desconocido, llame a la D3dParseUnknownCommand devolución de llamada. El tiempo de ejecución proporciona esta devolución de llamada al DdGetDriverInfo del controlador devolución de llamada con el GUID de GUID_D3DParseUnknownCommandCallback.
Si el controlador debe producir un error D3dDrawPrimitives2, debe rellenar el miembro dwErrorOffset de D3DHAL_DRAWPRIMITIVES2DATA con el desplazamiento en el búfer de comandos donde se puede encontrar el primer D3DHAL_DP2COMMAND no controlado.
Los siguientes comentarios no son válidos para las aplicaciones escritas con DirectX 8.0 y interfaces posteriores porque estas aplicaciones ya no usan el concepto de búfer de vértices actual (es decir, los datos de vértices ya no se pasan a través del lpDDVertex miembro de D3DHAL_DRAWPRIMITIVES2DATA). Por lo tanto, con estas aplicaciones, la función D3dDrawPrimitives 2 del controlador nunca debe provocar que la representación de un búfer de vértices se detenga incluso si el búfer es implícito o explícito y hay un bloqueo pendiente en él.
Si el controlador se usa con un entorno de ejecución de DirectX 8.0, el controlador a veces debe detenerse al representar desde un búfer de vértices actual implícito para evitar problemas de sincronización y daños resultantes. Además, el entorno de ejecución de DirectX 8.0 llama al D3dDrawPrimitives2 del controlador función para representar desde un búfer de vértices actual explícito bloqueado con más frecuencia, por lo que el rendimiento se degrada. A continuación se describen las soluciones alternativas para un controlador que se usa con un entorno de ejecución de DirectX 8.0:
-
El controlador debe detenerse cuando realiza la transición entre la representación de primitivos de memoria de usuario (identificados por D3DHALDP2_USERMEMVERTICES) y la representación desde un búfer de vértices actual implícito solo si no cambia el nombre del búfer (no establece D3DHALDP2_SWAPVERTEXBUFFER).
En el ejemplo siguiente se muestra cuándo D3dDrawPrimitives2 debe detenerse en un búfer de vértices actual implícito:
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, 0); // Stall
En el ejemplo siguiente se muestra cuando D3dDrawPrimitives2 no debe detenerse en un búfer de vértices actual implícito:
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Explicit VB, 0); // Do not stall if not locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall because D3DHALDP2_SWAPVERTEXBUFFER is set
Si el tiempo de ejecución establece la marca D3DHALDP2_REQCOMMANDBUFSIZE, no es necesario que el controlador se detenga. Por coincidencia, el tiempo de ejecución de DirectX 8.0 también establece D3DHALDP2_REQCOMMANDBUFSIZE cuando se representa normalmente desde un búfer de vértices explícito explícito bloqueado. Por lo tanto, el controlador puede mejorar el rendimiento si no se detiene cuando detecta D3DHALDP2_REQCOMMANDBUFSIZE mientras se representa desde un búfer de vértices explícito bloqueado.
En el ejemplo siguiente se muestra cuándo D3dDrawPrimitives2 debe detenerse en un búfer de vértices actual explícito:
DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
En el ejemplo siguiente se muestra cuándo D3dDrawPrimitives2 no debe detenerse en un búfer de vértices actual explícito:
DrawPrimitives2(Explicit VB, D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER | D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall
Requisitos
Requisito Valor de la plataforma de destino de Escritorio encabezado de d3dhal.h (incluya D3dhal.h) Consulte también