Prise en charge du client Graphics Low-Level

[Ces fonctions peuvent être modifiées à chaque révision du système d’exploitation. Utilisez plutôt Microsoft DirectDraw et Microsoft Direct3DAPIs ; ces API isolent les applications de tels 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, il existe des différences entre les pilotes de noyau et d’affichage. Les composants en mode noyau conservent une copie des 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, auxquelles font référence les handles retournés par le mode noyau. Par conséquent, les différences se trouvent principalement dans les arguments passés aux routines : le noyau accepte les handles tandis que les pilotes acceptent généralement les 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 se contentent généralement de marshaler 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 interrompt une propre de Gdi32.dll et 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. Par conséquent, 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 d’un système d’exploitation à l’autre. Sur Windows 2000, W2KUMODE. La bibliothèque LIB contient des routines qui permettent au thread appelant d’effectuer la transition vers le mode noyau. Ces routines ne font pas de marshaling de paramètres et constituent 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 sera modifié d’une révision du système d’exploitation à l’autre. 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 à ce qu’il s’exécute sans modification sur Windows XP. Un mécanisme de création de la 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, 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 entre 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 de 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, l’une pour Windows 2000 à l’aide de la technique ci-dessus et l’autre pour Windows XP qui utilise D3D8THK.DLL.

Création d’appareil

DirectDraw et Direct3D doivent d’abord créer une instance de l’abstraction de l’objet pilote du noyau. Dans Gdi32.dll et Ddraw.dll, vous appelez DdCreateDirectDrawObject, DdQueryDirectDrawObject et DdReenableDirectDrawObject. Dans Direct3D 8. x, pour ce faire, appelez NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject et NtGdiDdReenableDirectDrawObject. Notez que les points d’entrée GdiEntry* ne sont que des marshaleurs pour les points d’entrée en mode noyau.

Après l’appel de ces fonctions, un handle est retourné qui représente l’abstraction d’un appareil DirectDraw par l’objet noyau. Cet objet noyau représente un pilote instance 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 du 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) en 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, qui peut être utilisé dans les appels de dessin suivants. Le noyau dérive un pointeur vers sa propre structure à partir de ces handles et passe 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.

Rubrique Contenu
DdAttachSurface La fonction DdAttachSurface joint 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 en tant qu’alias pour cette fonction.
DdCreateSurfaceObject Wrapper pour la fonction NtGdiDdCreateSurfaceObject et crée un objet surface en mode noyau.
GdiEntry4 est défini en tant qu’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 en tant qu’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 en tant qu’alias pour cette fonction.
DdGetDC Wrapper pour la fonction NtGdiDdGetDC et retourne un contexte d’appareil (DC) GDI (Windows Graphics Device Interface) qui représente la surface DirectDraw indiquée.
GdiEntry7 est défini comme alias pour cette fonction.
DdGetDxHandle Le DdGetDxHandle retourne le handle de l’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 d’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 d’utilisateur rapide ou une zone Microsoft MS-DOS en plein écran. L’application peut appeler cette fonction à plusieurs reprises et comparer les anciennes et les nouvelles valeurs de la valeur de retour pour déterminer si les paramètres d’affichage ont changé.
GdiEntry13 est défini en tant qu’alias pour cette fonction.
DdReenableDirectDrawObject Wrapper pour la fonction NtGdiDdReenableDirectDrawObject . Il réactive un pilote DirectDraw instance après un événement de style de commutateur de mode tel qu’un commutateur de mode true, l’apparence d’une zone MS-DOS plein écran ou le changement de pilote d’affichage.
GdiEntry10 est défini comme alias pour cette fonction.
DdReleaseDC Wrapper pour la fonction NtGdiDdReleaseDC et 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 des informations en mode utilisateur en temps opportun sur la zone de découpage pour les fenêtres du bureau.
GdiEntry6 est défini en tant qu’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.
NtGdiD3DContextCreate Crée un contexte.
NtGdiD3DContextDestroy Supprime le contexte spécifié.
NtGdiD3DContextDestroyAll Interroge la quantité de mémoire libre dans le tas de mémoire géré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 Joint deux représentations de surface en mode noyau.
NtGdiDdBeginMoCompFrame Démarre le décodage d’une nouvelle image.
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 surface spécifiée.
NtGdiDdColorControl Contrôle les contrôles de luminance et de luminosité d’une surface de superposition.
NtGdiDdCreateD3DBuffer Utilisé pour 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 commencera à 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 lui associe une valeur de handle demandée.
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 de surface DirectDraw en mode noyau précédemment alloué qui a été créé avec le membre dwCaps de la structure DDSCAPS défini 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 de 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 depuis une surface GDI.
NtGdiDdGetAvailDriverMemory Interroge la quantité de mémoire libre dans tous les tas de mémoire vidéo.
NtGdiDdGetBltStatus Interroge le status de fente 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 dernier retournement 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 la 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 dans lesquels 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 numéro 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 Permet de verrouiller une zone de mémoire tampon spécifiée et de fournir un pointeur valide vers un bloc de mémoire associé à 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 le status de l’opération de rendu la plus récente sur la surface 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 de surface DirectDraw en mode noyau indiqué.
NtGdiDdRenderMoComp Indique au pilote les macroblocks à restituer en spécifiant les surfaces contenant les macroblocks, les décalages dans chaque surface où se trouvent les macroblocks et la taille des données macroblock à afficher.
NtGdiDdResetVisrgn Utilisé pour permettre au mode utilisateur d’obtenir une compréhension valide de la zone de découpage pour windows sur le bureau. Cette coupe peut changer de manière asynchrone du point de vue des threads en mode utilisateur.
NtGdiDdSetColorKey Définit la valeur de la clé de couleur pour la surface spécifiée.
NtGdiDdSetExclusiveMode Avertit le pilote lorsqu’une application DirectDraw bascule vers ou depuis le mode exclusif.
NtGdiDdSetGammaRamp Définit la rampe gamma pour 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 tenu 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 le status vide vertical de l’appareil.

 

Allocation de mémoire tampon de vertex et de commandes

Présentation de l’affichage