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