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.
El controlador no necesita sondear la legibilidad de la memoria donde se almacenan el comando y los búferes de vértices. Sin embargo, el controlador debe permanecer dentro de los límites especificados por los miembros dwCommandLength y dwVertexLength de D3DHAL_DRAWPRIMITIVES2DATA.

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.

Nota Los comentarios siguientes solo son válidos para las aplicaciones escritas mediante interfaces de Microsoft DirectX 7.0 y que se comunican con controladores a través de los entornos de ejecución de DirectX 8.0 y DirectX 8.1.

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.1 o posterior, la función D3dDrawPrimitives2 del controlador nunca debe provocar que la representación del búfer de vértices actual (pasado a través de lpDDVertex) se detenga si el búfer está implícito. Si el búfer es explícito y hay un bloqueo pendiente en él, el controlador debe detenerse al final de su función D3dDrawPrimitives2 si no cambia el nombre del búfer (no establece D3DHALDP2_SWAPVERTEXBUFFER). Si el controlador cambia el nombre del búfer, el controlador no se detiene. Los entornos de ejecución de DirectX 8.1 y versiones posteriores llaman a la función D3dDrawPrimitives2 del controlador para representar desde un búfer de vértices explícito bloqueado solo cuando sea necesario, por lo que el rendimiento rara vez se ve afectado. El búfer de vértices implícito se crea mediante la devolución de llamada CreateD3DBuffer del controlador con solo la marca DDSCAPS_EXECUTEBUFFER establecida. El búfer de vértices explícito se crea mediante la devolución de llamada CreateD3DBuffer del controlador con las marcas DDSCAPS_EXECUTEBUFFER y DDSCAPS2_VERTEXBUFFER establecidas. El búfer de vértices explícito se bloquea mediante la devolución de llamada LockD3DBuffer del controlador.

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

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF