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
- Appel du noyau
- Écriture d’applications portables
- Création d’appareil
- Objets du noyau
- Fonctions
- Rubriques connexes
É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. |
Rubriques connexes