Compartilhar via


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

A função D3dDrawPrimitives2 renderiza primitivos 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.

Retornar valor

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

Comentários

D3dDrawPrimitives2 deve ser implementado em drivers do Microsoft Direct3D.

O driver deve fazer o seguinte:

  • Verifique se o identificador de contexto especificado pelo membro dwhContext 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 membro ddrval de D3DHAL_DRAWPRIMITIVES2DATA como DDERR_WASSTILLDRAWING e retornar DDHAL_DRIVER_HANDLED.
  • Determine o local da primeira estrutura D3DHAL_DP2COMMAND adicionando o número de bytes no membro dwCommandOffset de D3DHAL_DRAWPRIMITIVES2DATA ao buffer de comando ao qual o membro lpDDCommands de D3DHAL_DRAWPRIMITIVES2DATA aponta.
  • 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 deverá aplicar dwVertexOffset à memória associada à estrutura DD_SURFACE_LOCAL à qual o lpDDVertex aponta. dwVertexOffset, lpVertices e lpDDVertex são membros de D3DHAL_DRAWPRIMITIVES2DATA.
  • Verifique o membro dwVertexType do D3DHAL_DRAWPRIMITIVES2DATA para garantir que o driver dê suporte ao FVF solicitado. O driver deverá falhar na chamada se alguma das seguintes condições existir:
    • As 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 D3DFVF_RESERVED bits x reservados são definidos.
  • 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 de D3DHAL_DP2RENDERSTATEwStateCount que seguem no buffer de comando, atualizando o estado do driver para cada estrutura de estado de renderização. Quando o sinalizador D3DHALDP2_EXECUTEBUFFER é definido, o driver também deve refletir a alteração de estado na matriz para a qual lpdwRStates aponta. wStateCount e lpdwRStates são membros de D3DHAL_DRAWPRIMITIVES2DATA.
    • Se o comando for D3DDP2OP_TEXTURESTAGESTATE, processe as estruturas de D3DHAL_DP2TEXTURESTAGESTATEwStateCount 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 D3DHAL_DP2WINFO que segue no buffer de comando, atualizando as informações de buffer w armazenadas no contexto de renderização interna do driver.
    • Caso contrário, processe as estruturas primitivas D3DHAL_DP2Xxx que seguem o comando de renderização primitiva D3DDP2OP_Xxx no buffer de comando.
    • Se o comando for desconhecido, chame o retorno de chamada D3dParseUnknownCommand do runtime. O runtime fornece esse retorno de chamada para o retorno de chamada DdGetDriverInfo do driver 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 pelos membros dwCommandLength e dwVertexLength de D3DHAL_DRAWPRIMITIVES2DATA.

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

Nota 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 membro lpDDVertex de 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 interrompida mesmo que o buffer seja implícito ou explícito e haja um bloqueio pendente nele.

 
Se o driver for usado com um runtime do DirectX 8.1 ou posterior, a função D3dDrawPrimitives2 do driver nunca deverá fazer com que a renderização do buffer de vértice atual (passado por meio de lpDDVertex) parasse 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 para que o desempenho raramente seja afetado. Um buffer de vértice implícito é criado pelo retorno de chamada CreateD3DBuffer do driver com apenas o sinalizador DDSCAPS_EXECUTEBUFFER definido. Um buffer de vértice explícito é criado pelo retorno de chamada CreateD3DBuffer do driver com os sinalizadores de DDSCAPS_EXECUTEBUFFER e DDSCAPS2_VERTEXBUFFER definidos. O buffer de vértice explícito fica bloqueado pelo retorno de chamada lockD3DBuffer do driver.

Se o driver for usado com um runtime do DirectX 8.0, às vezes, o driver 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 do que realmente necessário para que o desempenho seja degradado. Veja a seguir soluções alternativas de paralisação 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 precisará 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. Portanto, o driver pode melhorar o desempenho ao não parar 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
    Plataforma de Destino Área de Trabalho
    Cabeçalho d3dhal.h (inclua D3dhal.h)

    Confira 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