Partager via


Prise en charge du client Graphics Low-Level

[Ces fonctions sont susceptibles de changer avec chaque révision du système d’exploitation. Utilisez plutôt les api Microsoft DirectDraw et Microsoft Direct3DAPIs ; ces API isolent les applications de ces changements de système d’exploitation et masquent de nombreuses autres difficultés liées à l’interaction directe avec les pilotes d’affichage. Pour plus d’informations, consultez Présentation de l’affichage.]

DirectDraw et Direct3D utilisent certaines routines en mode noyau pour communiquer avec le système d’exploitation et le pilote d’affichage.

Le noyau du système d’exploitation semble être un pilote d’affichage DirectDraw/Direct3D du point de vue des composants en mode utilisateur. Toutefois, certaines différences entre le noyau et les pilotes d’affichage existent. Les composants en mode noyau conservent une copie de structures représentant des objets DirectDraw/Direct3D, tels que des appareils et des surfaces. Le composant en mode utilisateur de DirectDraw/Direct3D demande la création de ces structures, qui sont référencées avec des handles retournés par le mode noyau. Par conséquent, les différences sont principalement dans les arguments passés aux routines : le noyau accepte les handles tandis que les pilotes acceptent généralement des pointeurs.

Évolution des points d’entrée en mode noyau

DirectDraw établit toutes ses connexions au mode noyau via le Gdi32.dll à l’aide de plusieurs points d’entrée. Ces points d’entrée ne marshalent généralement que les paramètres. Dans le cadre de la création de l’appareil, le Gdi32.dll retourne des pointeurs vers des routines qui sont ensuite utilisées par DirectDraw et Direct3D 7.0.

Direct3D 8.x effectue un saut propre de Gdi32.dllet appelle directement les points d’entrée en mode noyau.

Appel du noyau

Ces points d’entrée sont similaires et, dans de nombreux cas, identiques aux points d’entrée dans le pilote d’affichage lui-même, donc une compréhension des matériaux du Kit de développement de pilotes (DDK) pour DirectDraw et Direct3D est un prérequis essentiel à l’utilisation de ces fonctions.

L’appel de ces fonctions diffère entre les systèmes d’exploitation. Sur Windows 2000, le W2KUMODE. La bibliothèque LIB contient des routines qui permettent au thread appelant d’effectuer la transition vers le mode noyau. Ces routines n’effectuent aucun marshaling de paramètres et sont le mécanisme d’appel idéal sur Windows 2000. Le mécanisme qui effectue la transition vers le mode noyau repose sur l’ordre d’une table. Ce classement changera entre les révisions du système d’exploitation. Par conséquent, il n’est pas recommandé de créer une application qui s’appuie sur W2KUMODE. LIB pour Windows 2000 et attendez-vous qu’il s’exécute sans modification sur Windows XP. Un mécanisme de création de portabilité du système d’exploitation est décrit dans la section suivante.

Sur Windows XP, D3D8THK.DLL exporte toutes les fonctions en mode noyau, mais avec un nom légèrement décoré. L’exemple suivant montre comment les applications peuvent alias les fonctions clientes de bas niveau à l’aide du préprocesseur. Avant de procéder ainsi, liez dynamiquement à D3D8THK.DLL.


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

Écriture d’applications portables

Plusieurs techniques sont disponibles pour rendre une application portable sur les systèmes d’exploitation. Le plus robuste consiste à installer le package redistribuable Microsoft DirectX 8.x sur Windows 2000 dans le cadre du processus d’installation de votre propre application. Cela garantit que D3D8THK.DLL sera disponible sur les systèmes Windows 2000 et autorise un chemin d’accès à code unique dans l’application, car vous pouvez utiliser la même technique que celle décrite pour Windows XP ci-dessus.

Les applications peuvent également créer leur propre DLL isolante et implémenter deux versions de cette DLL, une pour Windows 2000 à l’aide de la technique indiquée ci-dessus et une pour Windows XP qui utilise D3D8THK.DLL.

Création d’appareils

DirectDraw et Direct3D doivent d’abord créer une instance de l’abstraction du noyau de l’objet pilote. Dans Gdi32.dll et Ddraw.dll, cela est obtenu en appelant DdCreateDirectDrawObject, DdQueryDirectDrawObject et DdReenableDirectDrawObject. Dans Direct3D 8.x, cela est obtenu en appelant NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject et NtGdiDdReenableDirectDrawObject. Notez que les points d’entrée GdiEntry* sont simplement des marshallers pour les points d’entrée en mode noyau.

Après avoir appelé ces fonctions, un handle est retourné qui représente l’abstraction de l’objet noyau d’un appareil DirectDraw. Cet objet noyau représente une instance de pilote appartenant au pilote d’affichage. Ce handle peut être utilisé dans les appels suivants, tels que DdCreateSurfaceObject (ou NtGdiDdCreateSurfaceObject dans Direct3D 8.x) pour générer d’autres objets.

Objets noyau

Quelques points d’entrée sont utilisés pour gérer les représentations en mode noyau de certains objets. DdCreateSurfaceObject (ou NtGdiDDCreateSurfaceObject dans Direct3D 8.x) est un bon exemple. Ce point d’entrée crée un objet en mode noyau représentant un morceau de mémoire système. Le point d’entrée retourne un handle et ce handle peut être utilisé dans les appels de dessin suivants. Le noyau dérive un pointeur vers sa propre structure à partir de ces handles et transmet ce pointeur au pilote d’affichage, qui effectue ensuite l’opération.

Fonctions

Ce tableau répertorie les fonctions qui représentent les points d’entrée en mode noyau et les routines d’assistance en mode utilisateur dans Gdi32.dll qui encapsulent ces points d’entrée.

Sujet Contenu
DdAttachSurface La fonction DdAttachSurface attache deux représentations de surface en mode noyau.
DdCreateDIBSection Crée une structure DIBSECTION qui partage sa table de couleurs avec l’appareil.
GdiEntry9 est #defined en tant qu’alias pour cette fonction.
DdCreateDirectDrawObject Wrapper pour la fonction NtGdiDdCreateDirectDrawObject et crée une représentation côté noyau de l’objet DirectDraw. Un handle de cette représentation sera stocké dans pDirectDrawGlobal ->hDD.
GdiEntry1 est défini comme alias pour cette fonction.
DdCreateSurfaceObject Wrapper pour la fonction NtGdiDdCreateSurfaceObject et crée un objet surface en mode noyau.
GdiEntry4 est défini comme alias pour cette fonction.
DdDeleteDirectDrawObject Wrapper pour la fonction NtGdiDdDeleteDirectDrawObject et supprime un objet DirectDraw en mode noyau créé précédemment à l’aide de DdCreateDirectDrawObject.
GdiEntry3 est défini comme un alias pour cette fonction.
DdDeleteSurfaceObject Wrapper pour la fonction NtGdiDdDeleteSurfaceObject et supprime un objet surface en mode noyau créé précédemment par NtGdiDdCreateSurfaceObject.
GdiEntry5 est défini comme alias pour cette fonction.
DdGetDC Wrapper pour la fonction NtGdiDdGetDC et retourne un contexte d’appareil GDI (Windows Graphics Device Interface) qui représente la surface DirectDraw indiquée.
GdiEntry7 est défini comme un alias pour cette fonction.
DdGetDxHandle Le DdGetDxHandle retourne le handle d’API Microsoft DirectX en mode noyau à utiliser dans les appels suivants aux points d’entrée en mode noyau qui contrôlent le mécanisme de l’API DirectX.
DdQueryDirectDrawObject Wrapper pour la fonction NtGdiDdQueryDirectDrawObject et interroge une représentation en mode noyau créée précédemment pour les fonctionnalités.
GdiEntry2 est défini comme alias pour cette fonction.
DdQueryDisplaySettingsUniqueness Retourne la valeur actuelle d’un entier incrémenté chaque fois qu’un commutateur de mode se produit, par exemple lorsqu’il existe un commutateur de bureau, un commutateur utilisateur rapide ou une zone Microsoft MS-DOS plein écran. L’application peut appeler cette fonction à plusieurs reprises et comparer les anciennes et nouvelles valeurs de la valeur de retour pour déterminer si les paramètres d’affichage ont changé.
GdiEntry13 est défini comme un alias pour cette fonction.
DdReenableDirectDrawObject Wrapper pour la fonction NtGdiDdReenableDirectDrawObject. Il active à nouveau une instance de pilote DirectDraw après un événement de style commutateur de mode, tel qu’un commutateur de mode true, l’apparence d’une zone de MS-DOS plein écran ou le changement de pilote d’affichage.
GdiEntry10 est défini comme un alias pour cette fonction.
DdReleaseDC Wrapper pour la fonctionNtGdiDdReleaseDCet libère un contrôleur de domaine précédemment obtenu via DdGetDC ou GdiEntry7 .
GdiEntry8 est défini comme alias pour cette fonction.
DdResetVisrgn Wrapper pour la fonction NtGdiDdResetVisrgn et active les informations en mode utilisateur en temps opportun sur la région de découpage pour les fenêtres du bureau.
GdiEntry6 est défini comme alias pour cette fonction.
DdSetGammaRamp La fonction DdSetGammaRamp définit la rampe gamma de l’appareil.
DdSwapTextureHandles Développé pour les interfaces de pilote de périphérique (DDIS) antérieures à Microsoft DirectDraw 7.0 et ne fait rien sur les systèmes Microsoft Windows NT. Tous les paramètres sont ignorés.
GdiEntry16 est défini comme alias pour cette fonction.
DdUnattachSurface La fonction DdUnattachSurface supprime une pièce jointe, créée avec DdAttachSurface, entre deux objets surface en mode noyau.
NtGdiD3D3DContextCreate Crée un contexte.
NtGdiD3DContextDestroy Supprime le contexte spécifié.
NtGdiD3DContextDestroyAll Interroge la quantité de mémoire libre dans le tas de mémoire managée par le pilote.
NtGdiD3DDrawPrimitives2 Affiche les primitives et retourne l’état de rendu mis à jour.
NtGdiD3DGetDriverState Utilisé par les runtimes DirectDraw et Direct3D pour obtenir des informations du pilote sur son état actuel.
NtGdiD3DValidateTextureStageState Retourne le nombre de passes où le matériel peut effectuer les opérations de fusion spécifiées dans l’état actuel.
NtGdiDdAddAlphaBlt Non implémenté.
NtGdiDdAddAttachedSurface Attache une surface à une autre surface.
NtGdiDdAttachSurface Attache deux représentations de surface en mode noyau.
NtGdiDdBeginMoCompFrame Démarre le décodage d’une nouvelle trame.
NtGdiDdBlt Effectue un transfert de bloc de bits.
NtGdiDdCanCreateD3DBuffer Détermine si le pilote peut créer une commande au niveau du pilote ou une mémoire tampon de vertex de la description spécifiée.
NtGdiDdCanCreateSurface Indique si le pilote peut créer une surface de la description de l’aire spécifiée.
NtGdiDdColorControl Contrôle la luminosité et les contrôles de luminosité d’une surface de superposition.
NtGdiDdCreateD3DBuffer Permet de créer une commande au niveau du pilote ou une mémoire tampon de vertex de la description spécifiée.
NtGdiDdCreateDirectDrawObject Crée une représentation côté noyau de l’objet DirectDraw.
NtGdiDdCreateMoComp Avertit le pilote qu’un décodeur logiciel commence à utiliser la compensation de mouvement avec le GUID spécifié.
NtGdiDdCreateSurface Attache une surface à une autre surface.
NtGdiDdCreateSurfaceEx Crée une surface Direct3D à partir d’une surface DirectDraw et associe une valeur de handle demandée à celle-ci.
NtGdiDdCreateSurfaceObject Crée un objet surface en mode noyau qui représente l’objet surface en mode utilisateur référencé par puSurfaceLocal.
NtGdiDdDeleteDirectDrawObject Détruit un objet d’appareil DirectDraw en mode noyau créé précédemment.
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject supprime un objet surface en mode noyau créé précédemment.
NtGdiDdDestroyD3DBuffer Détruit un objet surface DirectDraw en mode noyau précédemment alloué qui a été créé avec le membre dwCaps de la structure DDSCAPS définie sur DDSCAPS_EXECUTEBUFFER.
NtGdiDdDestroyMoComp Avertit le pilote que cet objet de compensation de mouvement ne sera plus utilisé. Le pilote doit maintenant effectuer tout nettoyage nécessaire.
NtGdiDdDestroySurface Détruit un objet surface DirectDraw en mode noyau précédemment alloué.
NtGdiDdEndMoCompFrame Termine une trame décodée.
NtGdiDdFlip Provoque l’échange de la mémoire de surface associée aux surfaces cibles et actuelles.
NtGdiDdFlipToGDISurface Avertit le pilote lorsque DirectDraw bascule vers ou à partir d’une surface GDI.
NtGdiDdGetAvailDriverMemory Interroge la quantité de mémoire libre dans tous les tas de mémoire vidéo.
NtGdiDdGetBltStatus Interroge l’état blit de la surface spécifiée.
NtGdiDdGetDC Crée un contrôleur de domaine pour la surface spécifiée.
NtGdiDdGetDriverInfo Interroge le pilote pour obtenir des fonctionnalités DirectDraw et Direct3D supplémentaires que le pilote prend en charge.
NtGdiDdGetDxHandle Retourne le handle d’API DirectX en mode noyau à utiliser dans les appels suivants aux points d’entrée en mode noyau qui contrôlent le mécanisme d’API DirectX.
NtGdiDdGetFlipStatus Détermine si le retournement le plus récent demandé sur une surface s’est produit.
NtGdiDdGetInternalMoCompInfo Permet au pilote de signaler qu’il alloue en interne la mémoire d’affichage pour effectuer une compensation de mouvement.
NtGdiDdGetMoCompBuffInfo Permet au pilote de spécifier le nombre de surfaces intermédiaires nécessaires pour prendre en charge le GUID spécifié, ainsi que la taille, l’emplacement et le format de chacune de ces surfaces.
NtGdiDdGetMoCompFormats Indique les formats non compressés auxquels le matériel peut décoder les données.
NtGdiDdGetMoCompGuids Récupère le nombre de GUID pris en charge par le pilote.
NtGdiDdGetScanLine Retourne le nombre de la ligne d’analyse physique actuelle.
NtGdiDdLock Verrouille une zone de mémoire de surface spécifiée et fournit un pointeur valide vers un bloc de mémoire associé à une surface.
NtGdiDdLockD3D Utilisé pour verrouiller une zone de mémoire tampon spécifiée et fournir un pointeur valide à un bloc de mémoire associée à la mémoire tampon.
NtGdiDdQueryDirectDrawObject Interroge une représentation en mode noyau créée précédemment d’un objet DirectDraw pour ses fonctionnalités.
NtGdiDdQueryMoCompStatus Interroge l’état de l’opération de rendu la plus récente sur l’aire spécifiée.
NtGdiDdReenableDirectDrawObject Réactive un objet d’appareil en mode noyau DirectDraw après un commutateur de mode.
NtGdiDdReleaseDC Libère le contrôleur de domaine créé précédemment pour l’objet surface DirectDraw en mode noyau indiqué.
NtGdiDdRenderMoComp Indique au pilote quels macroblocks effectuer le rendu en spécifiant les surfaces contenant les macroblocks, les décalages dans chaque surface où les macroblocks existent et la taille des données macroblock à afficher.
NtGdiDdResetVisrgn Permet d’activer le mode utilisateur pour obtenir une compréhension valide de la région de découpage pour les fenêtres sur le bureau. Cette capture peut changer de manière asynchrone du point de vue des threads en mode utilisateur.
NtGdiDdSetColorKey Définit la valeur de clé de couleur de l’aire spécifiée.
NtGdiDdSetExclusiveMode Avertit le pilote lorsqu’une application DirectDraw passe en mode exclusif ou en mode exclusif.
NtGdiDdSetGammaRamp Définit la rampe gamma de l’appareil.
NtGdiDdSetOverlayPosition Définit la position d’une superposition.
NtGdiDdUnattachSurface Supprime une pièce jointe, créée avec NtGdiDdAttachSurface, entre deux objets surface en mode noyau.
NtGdiDdUnlock Libère le verrou conservé sur la surface spécifiée.
NtGdiDdUnlockD3D Utilisé pour libérer un verrou conservé sur une zone de mémoire tampon spécifiée.
NtGdiDdUpdateOverlay Repositionne ou modifie les attributs visuels d’une surface de superposition.
NtGdiDdWaitForVerticalBlank Retourne l’état vide vertical de l’appareil.

 

commande et d’allocation de mémoire tampon de vertex

Présentation de l’affichage des