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.
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.
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.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