Compartilhar via


LPD3DHAL_DRAWPRIMITIVES2CB função de retorno de chamada (d3dhal.h)

A função D3dDrawPrimitives2 renderiza primitivas e retorna o estado de renderização atualizado.

Sintaxe

LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;

DWORD Lpd3dhalDrawprimitives2cb(
  LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}

Parâmetros

unnamedParam1

pdp [in]

Aponta para uma estrutura D3DHAL_DRAWPRIMITIVES2DATA que contém as informações necessárias para o driver renderizar um ou mais primitivos.

Valor de retorno

D3dDrawPrimitives2 retorna um dos seguintes códigos de retorno de chamada:

Observações

D3dDrawPrimitives2 deve ser implementada em drivers do Microsoft Direct3D.

O driver deve fazer o seguinte:

  • Verifique se o identificador de contexto especificado pelo dwhContext membro da estrutura D3DHAL_DRAWPRIMITIVES2DATA em pdp é válido.
  • Verifique se uma inversão para a superfície de desenho associada ao contexto não está em andamento. Se a superfície de desenho estiver envolvida em uma inversão, o driver deverá definir o ddrval membro do D3DHAL_DRAWPRIMITIVES2DATA para DDERR_WASSTILLDRAWING e retornar DDHAL_DRIVER_HANDLED.
  • Determine o local da primeira estrutura D3DHAL_DP2COMMAND adicionando o número de bytes no membro dwCommandOffset do D3DHAL_DRAWPRIMITIVES2DATA ao buffer de comando ao qual o lpDDCommands membro de pontos D3DHAL_DRAWPRIMITIVES2DATA.
  • Determine o local do primeiro vértice no buffer de vértice. Isso só deve ser feito se houver dados no buffer de vértice; ou seja, quando um token de comando D3DDP2OP_Xxx é recebido (exceto quando o token é D3DDP2OP_LINELIST_IMM ou D3DDP2OP_TRIANGLEFAN_IMM). Esses dois opcodes indicam que os dados de vértice são passados imediatamente no fluxo de comando, em vez de em um buffer de vértice. Portanto, supondo que haja dados no buffer de vértice, se o buffer de vértice estiver na memória do usuário, o primeiro vértice será dwVertexOffset bytes no buffer para o qual lpVertices aponta. Caso contrário, o driver deve aplicar dwVertexOffset à memória associada à estrutura DD_SURFACE_LOCAL à qual pontos de lpDDVertex. dwVertexOffset, lpVerticese lpDDVertex são membros do D3DHAL_DRAWPRIMITIVES2DATA.
  • Verifique o membro do dwVertexType do D3DHAL_DRAWPRIMITIVES2DATA para garantir que o driver dê suporte ao FVF solicitado. O driver deverá falhar na chamada se houver alguma das seguintes condições:
    • Coordenadas de vértice não são especificadas; ou seja, se D3DFVF_XYZRHW não estiver definido.
    • Os normais são especificados; ou seja, se D3DFVF_NORMAL estiver definido.
    • Qualquer um dos bits de D3DFVF_RESERVED x reservados está definido.
  • Processe todos os comandos no buffer de comando sequencialmente. Para cada estrutura D3DHAL_DP2COMMAND, o driver deve fazer o seguinte:
    • Se o comando for D3DDP2OP_RENDERSTATE, processe as estruturas wStateCount D3DHAL_DP2RENDERSTATE que seguem no buffer de comando, atualizando o estado do driver para cada estrutura de estado de renderização. Quando o sinalizador de D3DHALDP2_EXECUTEBUFFER é definido, o driver também deve refletir a alteração de estado na matriz à qual lpdwRStates aponta. wStateCount e lpdwRStates são membros do D3DHAL_DRAWPRIMITIVES2DATA.
    • Se o comando for D3DDP2OP_TEXTURESTAGESTATE, processe as estruturas wStateCount D3DHAL_DP2TEXTURESTAGESTATE que seguem no buffer de comando, atualizando o estado de textura do driver associado ao estágio de textura especificado para cada estrutura de estado de textura.
    • Se o comando for D3DDP2OP_VIEWPORTINFO, processe a estrutura de D3DHAL_DP2VIEWPORTINFO que segue no buffer de comando, atualizando as informações do visor armazenadas no contexto de renderização interna do driver.
    • Se o comando for D3DDP2OP_WINFO, processe a estrutura de D3DHAL_DP2WINFO que segue no buffer de comando, atualizando as informações de buffer w armazenadas no contexto de renderização interno do driver.
    • Caso contrário, processe as estruturas primitivas D3DHAL_DP2Xxx que seguem o comando D3DDP2OP_xxx renderização primitiva no buffer de comando.
    • Se o comando for desconhecido, chame o D3dParseUnknownCommand do runtime retorno de chamada. O runtime fornece esse retorno de chamada para o DdGetDriverInfo do driver retorno de chamada com o GUID GUID_D3DParseUnknownCommandCallback.
O driver não precisa investigar a legibilidade da memória em que os buffers de comando e vértice são armazenados. No entanto, o driver deve permanecer dentro dos limites especificados pelo dwCommandLength e dwVertexLength membros do D3DHAL_DRAWPRIMITIVES2DATA.

Se o driver precisar falhar D3dDrawPrimitives2, ele deverá preencher o dwErrorOffset membro do D3DHAL_DRAWPRIMITIVES2DATA com o deslocamento para o buffer de comando em que o primeiro D3DHAL_DP2COMMAND sem tratamento pode ser encontrado.

Observação Os comentários a seguir são válidos apenas para aplicativos escritos usando interfaces do Microsoft DirectX 7.0 e que se comunicam com drivers por meio de runtimes directX 8.0 e DirectX 8.1.

Os comentários a seguir não são válidos para aplicativos escritos usando o DirectX 8.0 e interfaces posteriores porque esses aplicativos não usam mais o conceito de um buffer de vértice atual (ou seja, os dados de vértice não são mais passados por meio do lpDDVertex membro do D3DHAL_DRAWPRIMITIVES2DATA). Portanto, com esses aplicativos, a função D3dDrawPrimitives2 do driver nunca deve fazer com que a renderização de um buffer de vértice seja paralisada mesmo se o buffer estiver implícito ou explícito e houver um bloqueio pendente nele.

 
Se o driver for usado com um Runtime DirectX 8.1 ou posterior, a função de D3dDrawPrimitives2 do do driver nunca deverá fazer com que a renderização do buffer de vértice atual (passada por meio de lpDDVertex) intercala se o buffer estiver implícito. Se o buffer for explícito e houver um bloqueio pendente nele, o driver deverá parar no final de sua função D3dDrawPrimitives2 se ele não renomear o buffer (não definir D3DHALDP2_SWAPVERTEXBUFFER). Se o driver renomear o buffer, o driver não parará. O DirectX 8.1 e os runtimes posteriores chamam a função D3dDrawPrimitives2 do driver para renderizar de um buffer de vértice explícito bloqueado somente quando necessário, de modo que o desempenho raramente é afetado. Um buffer de vértice implícito é criado pelo do driver CreateD3DBuffer retorno de chamada com apenas o sinalizador DDSCAPS_EXECUTEBUFFER definido. Um buffer de vértice explícito é criado pelo do driver CreateD3DBuffer retorno de chamada com os sinalizadores DDSCAPS_EXECUTEBUFFER e DDSCAPS2_VERTEXBUFFER definidos. O buffer de vértice explícito fica bloqueado pelo lockD3DBuffer do driver retorno de chamada.

Se o driver for usado com um runtime do DirectX 8.0, o driver às vezes deverá parar ao renderizar de um buffer de vértice atual implícito para evitar problemas de sincronização e corrupção resultante. Além disso, o runtime do DirectX 8.0 chama a função D3dDrawPrimitives2 do driver para renderizar de um buffer de vértice atual explícito bloqueado com mais frequência e, portanto, realmente necessário para que o desempenho seja degradado. Veja a seguir soluções alternativas para um driver que é usado com um runtime do DirectX 8.0:

  • O driver deve parar quando faz a transição entre renderizar primitivos de memória do usuário (identificados por D3DHALDP2_USERMEMVERTICES) e renderizar de um buffer de vértice atual implícito somente se ele não renomear o buffer (não definir D3DHALDP2_SWAPVERTEXBUFFER).

    O exemplo a seguir mostra quando D3dDrawPrimitives2 deve parar em um buffer de vértice atual implícito:

    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Implicit VB, 0); // Stall 
    

    O exemplo a seguir mostra quando D3dDrawPrimitives2 não deve parar em um buffer de vértice atual 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
    

    Se o runtime definir o sinalizador D3DHALDP2_REQCOMMANDBUFSIZE, o driver não será obrigado a parar. Por coincidência, o runtime do DirectX 8.0 também define D3DHALDP2_REQCOMMANDBUFSIZE quando é renderizado com mais frequência de um buffer de vértice atual explícito bloqueado. O driver pode, portanto, melhorar o desempenho não parando quando detecta D3DHALDP2_REQCOMMANDBUFSIZE durante a renderização de um buffer de vértice atual explícito bloqueado.

    O exemplo a seguir mostra quando D3dDrawPrimitives2 deve parar em um buffer de vértice atual explícito:

    DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
    

    O exemplo a seguir mostra quando D3dDrawPrimitives2 não deve parar em um buffer de vértice atual 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
    da Plataforma de Destino Área de trabalho
    cabeçalho d3dhal.h (inclua D3dhal.h)

    Consulte também

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF