Prise en charge du client Low-Level Graphics

[Ces fonctions sont sujettes à modification à chaque révision du système d’exploitation. Utilisez plutôt Microsoft DirectDraw et Microsoft Direct3DAPIs ; Ces API isolent les applications de ces modifications du 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 des 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 le noyau et les pilotes 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 mode utilisateur de DirectDraw/Direct3D demande la création de ces structures, qui sont désignées par 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, alors que les pilotes acceptent généralement des pointeurs.

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

DirectDraw effectue toutes ses connexions en 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 des 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 une interruption 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. ainsi, 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, 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 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 s’appuie sur l’ordre d’une table. Ce classement sera modifié entre les révisions du système d’exploitation. Par conséquent, il n’est pas recommandé de générer une application qui s’appuie sur W2KUMODE. LIB pour Windows 2000 et s’attendre à ce qu’elle s’exécute sans modification sur Windows XP. La section suivante décrit un mécanisme de création de portabilité du système d’exploitation.

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 utiliser un alias pour les fonctions clientes de bas niveau à l’aide du préprocesseur. Avant cela, liez de manière dynamique aux 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. la solution la plus fiable 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 Windows systèmes 2000 et autorise un seul chemin d’accès de code 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 d’isolation et implémenter deux versions de cette dll, une pour Windows 2000 à l’aide de la technique décrite ci-dessus et une pour Windows XP qui utilise D3D8THK.DLL.

Création de l’appareil

DirectDraw et Direct3D doivent tout d’abord créer une instance de l’abstraction du noyau de l’objet Driver. Dans Gdi32.dll et Ddraw.dll, cela est possible 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 marshaleurs pour les points d’entrée en mode noyau.

Après l’appel de ces fonctions, un descripteur qui représente l’abstraction de l’objet de noyau d’un appareil DirectDraw est retourné. Cet objet de 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 créer d’autres objets.

Objets de 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 une partie de la mémoire système. Le point d’entrée retourne un handle et ce descripteur 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 des 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 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 # défini 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 descripteur 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 qui a été 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 précédemment créé par NtGdiDdCreateSurfaceObject.
GdiEntry5 est défini en tant qu’alias pour cette fonction.
DdGetDC Wrapper pour la fonction NtGdiDdGetDC et retourne un contexte de périphérique (DC) Windows Graphics Device Interface (DC) qui représente la surface DirectDraw indiquée.
GdiEntry7 est défini en tant qu’alias pour cette fonction.
DdGetDxHandle DdGetDxHandle retourne le descripteur 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 de l’API DirectX.
DdQueryDirectDrawObject Wrapper pour la fonction NtGdiDdQueryDirectDrawObject et interroge une représentation du mode noyau précédemment créée pour les fonctionnalités.
GdiEntry2 est défini en tant qu’alias pour cette fonction.
DdQueryDisplaySettingsUniqueness Retourne la valeur actuelle d’un entier qui est incrémenté chaque fois qu’un changement de mode se produit, par exemple lorsqu’il y a un commutateur de bureau, un commutateur d’utilisateur rapide ou une boîte Microsoft MS-DOS en 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 été modifiés.
GdiEntry13 est défini en tant qu’alias pour cette fonction.
DdReenableDirectDrawObject Wrapper pour la fonction NtGdiDdReenableDirectDrawObject . Il réactive une instance de pilote DirectDraw après un événement de type changement de mode, tel qu’un commutateur en mode réel, l’apparence d’une zone MS-DOS en plein écran ou la modification du pilote d’affichage.
GdiEntry10 est défini en tant qu’alias pour cette fonction.
DdReleaseDC Wrapper pour la fonction NtGdiDdReleaseDC et libère un contrôleur de périphérique précédemment obtenu via DdGetDC ou GdiEntry7.
GdiEntry8 est défini en tant qu’alias pour cette fonction.
DdResetVisrgn Wrapper pour la fonction NtGdiDdResetVisrgn et active les informations en mode utilisateur en temps réel sur la zone de découpage pour Windows sur le 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 en tant qu’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 disponible dans le segment de mémoire géré par le pilote.
NtGdiD3DDrawPrimitives2 Génère le rendu des primitives et retourne l’état de rendu mis à jour.
NtGdiD3DGetDriverState Utilisé par les runtimes DirectDraw et Direct3D pour obtenir des informations à partir 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 mémoire tampon de commande ou de vertex au niveau du pilote 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 recouvrement.
NtGdiDdCreateD3DBuffer Utilisé pour créer une commande de niveau 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 va commencer à 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 appareil DirectDraw en mode noyau précédemment créé.
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject supprime un objet surface en mode noyau précédemment créé.
NtGdiDdDestroyD3DBuffer Détruit un objet surface DirectDraw précédemment alloué en mode noyau qui a été créé avec le membre dwCaps de la structure DDSCAPS défini sur DDSCAPS _ EXECUTEBUFFER.
NtGdiDdDestroyMoComp Informe 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 un frame décodé.
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 disponible dans tous les segments de mémoire vidéo.
NtGdiDdGetBltStatus Interroge l’État blit de la surface spécifiée.
NtGdiDdGetDC Crée un contrôleur de périphérique pour la surface spécifiée.
NtGdiDdGetDriverInfo Interroge le pilote pour obtenir d’autres fonctionnalités DirectDraw et Direct3D prises en charge par le pilote.
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 de l’API DirectX.
NtGdiDdGetFlipStatus Détermine si la dernière retournement demandée sur une surface s’est produite.
NtGdiDdGetInternalMoCompInfo Permet au pilote de signaler qu’il alloue en interne de la mémoire d’affichage pour effectuer la compensation de mouvement.
NtGdiDdGetMoCompBuffInfo Permet au pilote de spécifier le nombre de surfaces intermédiaires requises 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 numéro de la ligne d’analyse physique actuelle.
NtGdiDdLock Verrouille une zone spécifiée de la mémoire de surface 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 vers un bloc de mémoire associé à la mémoire tampon.
NtGdiDdQueryDirectDrawObject Interroge une représentation en mode noyau précédemment créée d’un objet DirectDraw pour ses fonctionnalités.
NtGdiDdQueryMoCompStatus Interroge l’état de l’opération de rendu la plus récente à la surface spécifiée.
NtGdiDdReenableDirectDrawObject Réactive un objet appareil en mode noyau DirectDraw après un changement de mode.
NtGdiDdReleaseDC Libère le contrôleur de périphérique créé précédemment pour l’objet de surface DirectDraw en mode noyau indiqué.
NtGdiDdRenderMoComp Indique au pilote le blocs macros à afficher en spécifiant les surfaces contenant les blocs macros, les décalages dans chaque surface où le blocs macros existe et la taille des données bloc macro à restituer.
NtGdiDdResetVisrgn Utilisé pour permettre au mode utilisateur de mieux comprendre la zone de découpage pour Windows sur le bureau. Ce découpage peut changer de façon asynchrone du point de vue des threads en mode utilisateur.
NtGdiDdSetColorKey Définit la valeur de clé de couleur pour la surface spécifiée.
NtGdiDdSetExclusiveMode Avertit le pilote lorsqu’une application DirectDraw bascule vers ou à partir du 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 maintenu sur la surface spécifiée.
NtGdiDdUnlockD3D Utilisé pour libérer un verrou maintenu sur une zone spécifiée de mémoire tampon.
NtGdiDdUpdateOverlay Repositionne ou modifie les attributs visuels d’une surface de recouvrement.
NtGdiDdWaitForVerticalBlank Retourne l’état vide vertical de l’appareil.

Allocation de mémoire tampon de commande et de vertex

Présentation de l’affichage