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