Gráficos Suporte ao Cliente de Baixo Nível

[Essas funções estão sujeitas a alterações a cada revisão do sistema operacional. Em vez disso, use o Microsoft DirectDraw e Microsoft Direct3DAPIs; essas APIs isolam os aplicativos de tais alterações no sistema operacional e ocultam muitas outras dificuldades envolvidas na interação direta com os drivers de vídeo. Para obter mais informações, consulte Introdução à exibição.]

DirectDraw e Direct3D usam algumas rotinas de modo kernel para se comunicar com o sistema operacional e o driver de vídeo.

O kernel do sistema operacional parece ser um driver de exibição DirectDraw/Direct3D do ponto de vista dos componentes do modo de usuário. No entanto, existem algumas diferenças entre o kernel e os drivers de vídeo. Os componentes do modo kernel mantêm uma cópia das estruturas que representam objetos DirectDraw/Direct3D, como dispositivos e superfícies. O componente de modo de usuário do DirectDraw/Direct3D solicita a criação dessas estruturas, que são referidas com identificadores retornados pelo modo kernel. Consequentemente, as diferenças estão principalmente nos argumentos passados para as rotinas: o kernel aceita identificadores enquanto os drivers normalmente aceitam ponteiros.

Evolução dos Pontos de Entrada do Modo Kernel

O DirectDraw faz todas as suas conexões com o modo kernel através do Gdi32.dll usando vários pontos de entrada. Esses pontos de entrada normalmente são apenas parâmetros de marechal. Como parte da criação do dispositivo, o Gdi32.dll retorna ponteiros para rotinas dentro de si que são usadas pelo DirectDraw e Direct3D 7.0.

Direct3D 8.x faz uma pausa limpa do Gdi32.dll e chama os pontos de entrada do modo kernel diretamente.

Chamando o Kernel

Esses pontos de entrada são semelhantes e, em muitos casos, idênticos aos pontos de entrada no próprio driver de vídeo, portanto, uma compreensão dos materiais do Kit de Desenvolvimento de Driver (DDK) para DirectDraw e Direct3D é um pré-requisito essencial para usar essas funções.

Chamar essas funções difere entre os sistemas operacionais. No Windows 2000, o W2KUMODE. A biblioteca LIB contém rotinas que permitem que o thread de chamada faça a transição para o modo kernel. Essas rotinas não fazem marcação de parâmetros e são o mecanismo de chamada ideal no Windows 2000. O mecanismo que faz a transição para o modo kernel depende da ordenação de uma tabela. Essa ordem será alterada nas revisões do sistema operacional. Portanto, não é aconselhável construir um aplicativo que dependa de W2KUMODE. LIB para Windows 2000 e espere que ele seja executado sem modificações no Windows XP. Um mecanismo para criar a portabilidade do sistema operacional é descrito na seção a seguir.

No Windows XP, D3D8THK.DLL exporta todas as funções do modo kernel, mas com um nome ligeiramente decorado. O exemplo a seguir mostra como os aplicativos podem alias as funções de cliente de baixo nível usando o pré-processador. Antes de fazer isso, vincule-se dinamicamente a D3D8THK.DLL.


#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h"      // Brings in the definition of "NtGdiDdUnlock", 
.                       //   which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);

Escrevendo aplicativos portáteis

Várias técnicas estão disponíveis para tornar um aplicativo portátil entre sistemas operacionais. O mais robusto é instalar o pacote redistribuível do Microsoft DirectX 8.x no Windows 2000 como parte do processo de instalação do seu próprio aplicativo. Isso garante que D3D8THK.DLL estará disponível em sistemas Windows 2000 e permite um único caminho de código no aplicativo, porque você pode usar a mesma técnica descrita para o Windows XP acima.

Os aplicativos também podem criar sua própria DLL isolante e implementar duas versões dessa DLL, uma para o Windows 2000 usando a técnica mostrada acima e outra para o Windows XP que usa D3D8THK.DLL.

Criação de dispositivos

DirectDraw e Direct3D primeiro devem criar uma instância da abstração do kernel do objeto de driver. Em Gdi32.dll e Ddraw.dll, isso é obtido chamando DdCreateDirectDrawObject, DdQueryDirectDrawObject e DdReenableDirectDrawObject. No Direct3D 8.x, isso é obtido chamando NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject e NtGdiDdReenableDirectDrawObject. Note que os pontos de entrada GdiEntry* são meramente marshallers para os pontos de entrada do modo kernel.

Depois de chamar essas funções, um identificador é retornado que representa a abstração do objeto kernel de um dispositivo DirectDraw. Esse objeto do kernel representa uma instância de driver de propriedade do driver de vídeo. Esse identificador pode ser usado em chamadas subsequentes, como DdCreateSurfaceObject (ou NtGdiDdCreateSurfaceObject no Direct3D 8.x) construir outros objetos.

Objetos do kernel

Alguns pontos de entrada são usados para gerenciar as representações do modo kernel de certos objetos. DdCreateSurfaceObject (ou NtGdiDdCreateSurfaceObject no Direct3D 8.x) é um bom exemplo. Esse ponto de entrada cria um objeto de modo kernel que representa um pedaço da memória do sistema. O ponto de entrada retorna um identificador e esse identificador pode ser usado em chamadas de desenho subsequentes. O kernel deriva um ponteiro para sua própria estrutura a partir dessas alças e passa esse ponteiro para o driver de exibição, que então executa a operação.

Funções

Esta tabela lista funções que representam pontos de entrada no modo kernel e as rotinas auxiliares do modo de usuário em Gdi32.dll que encapsulam esses pontos de entrada.

Tópico Contents
DdAttachSurface A função DdAttachSurface anexa duas representações de superfície no modo kernel.
DdCreateDIBSection Cria uma estrutura DIBSECTION que compartilha sua tabela de cores com o dispositivo.
GdiEntry9 é #defined como um alias para esta função.
DdCreateDirectDrawObject Wrapper para a função NtGdiDdCreateDirectDrawObject e cria uma representação do lado do kernel do objeto DirectDraw. Um identificador para essa representação será armazenado em pDirectDrawGlobal-hDD>.
GdiEntry1 é definido como um alias para esta função.
DdCreateSurfaceObject Wrapper para a função NtGdiDdCreateSurfaceObject e cria um objeto de superfície no modo kernel.
GdiEntry4 é definido como um alias para esta função.
DdDeleteDirectDrawObject Wrapper para a função NtGdiDdDeleteDirectDrawObject e exclui um objeto DirectDraw de modo kernel que foi criado anteriormente usando DdCreateDirectDrawObject.
GdiEntry3 é definido como um alias para esta função.
DdDeleteSurfaceObject Wrapper para a função NtGdiDdDeleteSurfaceObject e exclui um objeto de superfície de modo kernel criado anteriormente por NtGdiDdCreateSurfaceObject.
GdiEntry5 é definido como um alias para esta função.
DdGetDC Wrapper para a função NtGdiDdGetDC e retorna um contexto de dispositivo (DC) GDI (Windows Graphics Device Interface) que representa a superfície DirectDraw indicada.
GdiEntry7 é definido como um alias para esta função.
DdGetDxHandle O DdGetDxHandle retorna o identificador de API do Microsoft DirectX no modo kernel para usar em chamadas subsequentes para os pontos de entrada do modo kernel que controlam o mecanismo da API do DirectX.
DdQueryDirectDrawObject Wrapper para a função NtGdiDdQueryDirectDrawObject e consulta uma representação de modo kernel criada anteriormente para recursos.
GdiEntry2 é definido como um alias para esta função.
DdQueryDisplaySettingsExclusividade Retorna o valor atual de um inteiro que é incrementado sempre que ocorre uma opção de modo, como quando há uma opção de área de trabalho, uma opção de usuário rápido ou uma caixa de tela inteira do Microsoft MS-DOS. O aplicativo pode chamar essa função repetidamente e comparar os valores antigos e novos do valor de retorno para determinar se as configurações de exibição foram alteradas.
GdiEntry13 é definido como um alias para esta função.
DdReenableDirectDrawObject Wrapper para a função NtGdiDdReenableDirectDrawObject. Ele reativa uma instância de driver DirectDraw após um evento de estilo de opção de modo, como uma opção de modo verdadeiro, aparência de uma caixa de tela inteira do MS-DOS ou alteração do driver de vídeo.
GdiEntry10 é definido como um alias para esta função.
DdReleaseDC Wrapper para a função NtGdiDdReleaseDC e libera um DC obtido anteriormente através de DdGetDC ou GdiEntry7.
GdiEntry8 é definido como um alias para esta função.
DdResetVisrgn Wrapper para a função NtGdiDdResetVisrgn e permite informações oportunas no modo de usuário na região de recorte para janelas na área de trabalho.
GdiEntry6 é definido como um alias para esta função.
DdSetGammaRamp A função DdSetGammaRamp define a rampa gama para o dispositivo.
DdSwapTextureHandles Desenvolvido para interfaces de driver de dispositivo (DDIs) antes do Microsoft DirectDraw 7.0 e não faz nada em sistemas Microsoft Windows NT. Todos os parâmetros são ignorados.
GdiEntry16 é definido como um alias para esta função.
DdUnattachSurface A função DdUnattachSurface remove um anexo, criado com DdAttachSurface, entre dois objetos de superfície no modo kernel.
NtGdiD3DContextCreate Cria um contexto.
NtGdiD3DContextDestroy Exclui o contexto especificado.
NtGdiD3DContextDestroyAll Consulta a quantidade de memória livre no heap de memória gerenciado pelo driver.
NtGdiD3DDrawPrimitives2 Renderiza primitivas e retorna o estado de renderização atualizado.
NtGdiD3DGetDriverState Usado pelos tempos de execução DirectDraw e Direct3D para obter informações do driver sobre seu estado atual.
NtGdiD3DValidateTextureStageState Retorna o número de passagens em que o hardware pode executar as operações de mesclagem especificadas no estado atual.
NtGdiDdAddAlphaBlt Não implementado.
NtGdiDdAddAttachedSurface Prende uma superfície a outra superfície.
NtGdiDdAttachSurface Anexa duas representações de superfície no modo kernel.
NtGdiDdBeginMoCompFrame Inicia a decodificação de um novo quadro.
NtGdiDdBlt Executa uma transferência de bloco de bits.
NtGdiDdCanCreateD3DBuffer Determina se o driver pode criar um comando no nível do driver ou um buffer de vértice da descrição especificada.
NtGdiDdCanCreateSurface Indica se o driver pode criar uma superfície da descrição de superfície especificada.
NtGdiDdColorControl Controla os controles de luminância e brilho de uma superfície de sobreposição.
NtGdiDdCreateD3DBuffer Usado para criar um comando no nível do driver ou buffer de vértice da descrição especificada.
NtGdiDdCreateDirectDrawObject Cria uma representação do lado do kernel do objeto DirectDraw.
NtGdiDdCreateMoComp Notifica o driver de que um decodificador de software começará a usar a compensação de movimento com o GUID especificado.
NtGdiDdCreateSurface Prende uma superfície a outra superfície.
NtGdiDdCreateSurfaceEx Cria uma superfície Direct3D a partir de uma superfície DirectDraw e associa um valor de identificador solicitado a ela.
NtGdiDdCreateSurfaceObject Cria um objeto de superfície de modo kernel que representa o objeto de superfície de modo de usuário referenciado por puSurfaceLocal.
NtGdiDdDeleteDirectDrawObject Destrói um objeto de dispositivo DirectDraw no modo kernel criado anteriormente.
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject exclui um objeto de superfície de modo kernel criado anteriormente.
NtGdiDdDestroyD3DBuffer Destrói um objeto de superfície DirectDraw de modo kernel alocado anteriormente que foi criado com o membro dwCaps da estrutura DDSCAPS definido como DDSCAPS_EXECUTEBUFFER.
NtGdiDdDestroyMoComp Notifica o driver de que esse objeto de compensação de movimento não será mais usado. O motorista agora precisa realizar qualquer limpeza necessária.
NtGdiDdDestroySurface Destrói um objeto de superfície DirectDraw no modo kernel alocado anteriormente.
NtGdiDdEndMoCompFrame Conclui um quadro decodificado.
NtGdiDdFlip Faz com que a memória de superfície associada às superfícies de destino e atual seja trocada.
NtGdiDdFlipToGDISurface Notifica o driver quando o DirectDraw está virando para ou de uma superfície GDI.
NtGdiDdGetAvailDriverMemory Consulta a quantidade de memória livre em todos os heaps de memória de vídeo.
NtGdiDdGetBltStatus Consulta o status blit da superfície especificada.
NtGdiDdGetDC Cria um DC para a superfície especificada.
NtGdiDdGetDriverInfo Consulta o driver para obter funcionalidades adicionais do DirectDraw e Direct3D que o driver suporta.
NtGdiDdGetDxHandle Retorna o identificador da API DirectX no modo kernel a ser usado em chamadas subsequentes para os pontos de entrada do modo kernel que controlam o mecanismo da API DirectX.
NtGdiDdGetFlipStatus Determina se ocorreu a inversão solicitada mais recentemente em uma superfície.
NtGdiDdGetInternalMoCompInfo Permite que o driver informe que aloca internamente a memória de exibição para executar a compensação de movimento.
NtGdiDdGetMoCompBuffInfo Permite que o driver especifique quantas superfícies provisórias são necessárias para oferecer suporte ao GUID especificado e o tamanho, a localização e o formato de cada uma dessas superfícies.
NtGdiDdGetMoCompFormats Indica os formatos não compactados para os quais o hardware pode decodificar os dados.
NtGdiDdGetMoCompGuids Recupera o número de GUIDs suportados pelo driver.
NtGdiDdGetScanLine Retorna o número da linha de varredura física atual.
NtGdiDdLock Bloqueia uma área especificada de memória de superfície e fornece um ponteiro válido para um bloco de memória associado a uma superfície.
NtGdiDdLockD3D Usado para bloquear uma área especificada de memória buffer e para fornecer um ponteiro válido para um bloco de memória associado ao buffer.
NtGdiDdQueryDirectDrawObject Consulta uma representação de modo kernel criada anteriormente de um objeto DirectDraw para seus recursos.
NtGdiDdQueryMoCompStatus Consulta o status da operação de renderização mais recente na superfície especificada.
NtGdiDdReenableDirectDrawObject Reativa um objeto de dispositivo de modo kernel do DirectDraw após uma opção de modo.
NtGdiDdReleaseDC Libera o DC criado anteriormente para o objeto de superfície DirectDraw no modo kernel indicado.
NtGdiDdRenderMoComp Informa ao driver quais macroblocos devem ser renderizados, especificando as superfícies que contêm os macroblocos, os deslocamentos em cada superfície onde os macroblocos existem e o tamanho dos dados de macroblocos a serem renderizados.
NtGdiDdResetVisrgn Usado para habilitar o modo de usuário para obter uma compreensão válida da região de recorte para janelas na área de trabalho. Esse recorte pode ser alterado de forma assíncrona do ponto de vista dos threads de modo de usuário.
NtGdiDdSetColorKey Define o valor da chave de cor para a superfície especificada.
NtGdiDdSetExclusiveMode Notifica o driver quando um aplicativo DirectDraw está alternando para ou do modo exclusivo.
NtGdiDdSetGammaRamp Define a rampa gama para o dispositivo.
NtGdiDdSetOverlayPosition Define a posição de uma sobreposição.
NtGdiDdUnattachSurface Remove um anexo, criado com NtGdiDdAttachSurface, entre dois objetos de superfície de modo kernel.
NtGdiDdUnlock Libera a trava mantida na superfície especificada.
NtGdiDdUnlockD3D Usado para liberar um bloqueio mantido em uma área especificada de memória buffer.
NtGdiDdUpdateOverlay Reposiciona ou modifica os atributos visuais de uma superfície de sobreposição.
NtGdiDdWaitForVerticalBlank Retorna o status em branco vertical do dispositivo.

 

Alocação de buffer de vértice e comando

Introdução à exibição