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:
Comentarios
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 miembro dwhContext 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 D3DHAL_DP2COMMAND agregando el número de bytes en el miembro dwCommandOffset de D3DHAL_DRAWPRIMITIVES2DATA al búfer de comandos al que pertenece lpDDCommands de puntos de D3DHAL_DRAWPRIMITIVES2DATA.
- Determine la ubicación del primer vértice en el 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 D3DDP2OP_Xxx (excepto cuando el token es D3DDP2OP_LINELIST_IMM o D3DDP2OP_TRIANGLEFAN_IMM). Estos dos códigos de operación indican que los datos del vértice se pasan inmediatamente en el flujo de comandos, en lugar de en un búfer de vértices. Por lo tanto, suponiendo que hay 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 apunta lpVertices . De lo contrario, el controlador debe aplicar dwVertexOffset a la memoria asociada a la estructura de DD_SURFACE_LOCAL a la que apunta lpDDVertex . dwVertexOffset, lpVertices y lpDDVertex son miembros de D3DHAL_DRAWPRIMITIVES2DATA.
- Compruebe el miembro dwVertexType de D3DHAL_DRAWPRIMITIVES2DATA para asegurarse de que el controlador admite el FVF solicitado. 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 wStateCount D3DHAL_DP2RENDERSTATE que siguen 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 apunta lpdwRStates . 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 de D3DHAL_DP2VIEWPORTINFO que sigue 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 de D3DHAL_DP2WINFO que sigue 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 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 devolución de llamada D3dParseUnknownCommand del runtime. El tiempo de ejecución proporciona esta devolución de llamada a la devolución de llamada DdGetDriverInfo del controlador 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 la primera D3DHAL_DP2COMMAND no controlada.
Los comentarios siguientes 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 miembro lpDDVertex de D3DHAL_DRAWPRIMITIVES2DATA). Por lo tanto, con estas aplicaciones, la función D3dDrawPrimitives2 del controlador nunca debe hacer 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, a veces el controlador 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 tiempo de ejecución de DirectX 8.0 llama a la función D3dDrawPrimitives2 del controlador 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 (identificadas 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 normalmente se representa desde un búfer de vértices actual 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 actual 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 cuando 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 Value Plataforma de destino Escritorio Encabezado d3dhal.h (incluya D3dhal.h) Consulte también