Supporto clienti Low-Level grafica
[Queste funzioni sono soggette a modifiche con ogni revisione del sistema operativo. Usare invece Microsoft DirectDraw e Microsoft Direct3DAPIs; queste API isolano le applicazioni da tali modifiche al sistema operativo e nascondono molte altre difficoltà coinvolte nell'interagire direttamente con i driver di visualizzazione. Per altre informazioni, vedere Introduzione a Display.
DirectDraw e Direct3D usano alcune routine in modalità kernel per comunicare con il sistema operativo e il driver di visualizzazione.
Il kernel del sistema operativo sembra essere un driver di visualizzazione DirectDraw/Direct3D dal punto di vista dei componenti in modalità utente. Alcune differenze tra kernel e driver di visualizzazione esistono tuttavia. I componenti della modalità kernel mantengono una copia di strutture che rappresentano oggetti DirectDraw/Direct3D, ad esempio dispositivi e superfici. Il componente modalità utente di DirectDraw/Direct3D richiede la creazione di tali strutture, a cui si fa riferimento con handle restituiti dalla modalità kernel. Di conseguenza, le differenze sono principalmente negli argomenti passati alle routine: il kernel accetta handle mentre i driver in genere accettano puntatori.
- Evoluzione dei punti di ingresso in modalità kernel
- Chiamata al kernel
- Scrittura di applicazioni portatili
- Creazione del dispositivo
- Oggetti kernel
- Funzioni
- Argomenti correlati
Evoluzione dei punti di ingresso in modalità kernel
DirectDraw rende tutte le connessioni alla modalità kernel tramite l'Gdi32.dll usando diversi punti di ingresso. Questi punti di ingresso in genere sono solo parametri di marshalling. Come parte della creazione del dispositivo, il Gdi32.dll restituisce puntatori alle routine all'interno di se stesso che vengono quindi usate da DirectDraw e Direct3D 7.0.
Direct3D 8. x fa un'interruzione pulita dalla Gdi32.dll e chiama direttamente nei punti di ingresso in modalità kernel.
Chiamata al kernel
Questi punti di ingresso sono simili e, in molti casi, identici ai punti di ingresso nel driver di visualizzazione stesso, quindi una comprensione dei materiali di Driver Development Kit (DDK) per DirectDraw e Direct3D è un prerequisito essenziale per l'uso di queste funzioni.
La chiamata di queste funzioni differisce tra i sistemi operativi. In Windows 2000, W2KUMODE. La libreria LIB contiene routine che consentono al thread chiamante di eseguire la transizione alla modalità kernel. Queste routine non eseguono il marshalling dei parametri e sono il meccanismo di chiamata ideale su Windows 2000. Il meccanismo che rende la transizione alla modalità kernel si basa sull'ordinamento di una tabella. Questo ordinamento cambierà tra le revisioni del sistema operativo. Pertanto, non è consigliabile compilare un'applicazione che si basa su W2KUMODE. LIB per Windows 2000 e aspettarsi che venga eseguito non modificato in Windows XP. Un meccanismo per la creazione della portabilità del sistema operativo è descritto nella sezione seguente.
In Windows XP, D3D8THK.DLL esporta tutte le funzioni della modalità kernel, ma con un nome leggermente decorato. Nell'esempio seguente viene illustrato come le applicazioni possono aliasre le funzioni client di basso livello usando il preprocessore. Prima di eseguire questa operazione, collegare dinamicamente a D3D8THK.DLL.
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
Scrittura di applicazioni portatili
Diverse tecniche sono disponibili per rendere un'applicazione portabile in tutti i sistemi operativi. Il più affidabile consiste nell'installare il pacchetto ridistribuibile Microsoft DirectX 8.x in Windows 2000 come parte del processo di installazione dell'applicazione. Ciò garantisce che D3D8THK.DLL sarà disponibile nei sistemi Windows 2000 e consente un singolo percorso di codice nell'applicazione, perché è possibile usare la stessa tecnica descritta per Windows XP precedente.
Le applicazioni possono anche creare una DLL isolata e implementare due versioni di tale DLL, una per Windows 2000 usando la tecnica illustrata in precedenza e una per Windows XP che usa D3D8THK.DLL.
Creazione del dispositivo
DirectDraw e Direct3D devono prima creare un'istanza dell'astrazione del kernel dell'oggetto driver. In Gdi32.dll e Ddraw.dll questo risultato viene ottenuto chiamando DdCreateDirectDrawObject, DdQueryDirectDrawObject e DdReenableDirectDrawObject. In Direct3D 8. x, questa operazione viene ottenuta chiamando NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject e NtGdiDdReenableDirectDrawObject. Si noti che i punti di ingresso GdiEntry* sono semplicemente marshaller per i punti di ingresso in modalità kernel.
Dopo aver chiamato queste funzioni, viene restituito un handle che rappresenta l'astrazione dell'oggetto kernel di un dispositivo DirectDraw. Questo oggetto kernel rappresenta un'istanza del driver di proprietà del driver di visualizzazione. Questo handle può essere usato nelle chiamate successive, ad esempio DdCreateSurfaceObject (o NtGdiDdCreateSurfaceObject in Direct3D 8). x) per compilare altri oggetti.
Oggetti kernel
Alcuni punti di ingresso vengono usati per gestire le rappresentazioni in modalità kernel di determinati oggetti. DdCreateSurfaceObject (o NtGdiDdCreateSurfaceObject in Direct3D 8). x) è un buon esempio. Questo punto di ingresso crea un oggetto in modalità kernel che rappresenta una parte della memoria di sistema. Il punto di ingresso restituisce un handle e questo handle può essere usato nelle chiamate di disegno successive. Il kernel deriva un puntatore alla propria struttura da questi handle e passa quel puntatore al driver di visualizzazione, che esegue quindi l'operazione.
Funzioni
Questa tabella elenca le funzioni che rappresentano punti di ingresso in modalità kernel e le routine helper in modalità utente in Gdi32.dll che esegue il wrapping di questi punti di ingresso.
Argomento | Contenuto |
---|---|
DdAttachSurface | La funzione DdAttachSurface collega due rappresentazioni di superficie in modalità kernel. |
DdCreateDIBSection | Crea una struttura DIBSECTION che condivide la tabella dei colori con il dispositivo. GdiEntry9 è #defined come alias per questa funzione. |
DdCreateDirectDrawObject | Wrapper per la funzione NtGdiDdCreateDirectDrawObject e crea una rappresentazione lato kernel dell'oggetto DirectDraw. Un handle per questa rappresentazione verrà archiviato in pDirectDrawGlobal-hDD>. GdiEntry1 è definito come alias per questa funzione. |
DdCreateSurfaceObject | Wrapper per la funzione NtGdiDdCreateSurfaceObject e crea un oggetto surface in modalità kernel. GdiEntry4 è definito come alias per questa funzione. |
DdDeleteDirectDrawObject | Wrapper per la funzione NtGdiDdDeleteDirectDrawObject ed elimina un oggetto DirectDraw in modalità kernel creato in precedenza usando DdCreateDirectDrawObject. GdiEntry3 viene definito come alias per questa funzione. |
DdDeleteSurfaceObject | Wrapper per la funzione NtGdiDdDeleteSurfaceObject ed elimina un oggetto surface in modalità kernel creato in precedenza da NtGdiDdCreateSurfaceObject. GdiEntry5 è definito come alias per questa funzione. |
DdGetDC | Wrapper per la funzione NtGdiDdGetDC e restituisce un contesto del dispositivo (GDI) Windows Graphics Device Interface (GDI) che rappresenta la superficie DirectDraw indicata. GdiEntry7 è definito come alias per questa funzione. |
DdGetDxHandle | DdGetDxHandle restituisce l'handle api Microsoft DirectX in modalità kernel da usare nelle chiamate successive ai punti di ingresso in modalità kernel che controllano il meccanismo api DirectX. |
DdQueryDirectDrawObject | Wrapper per la funzione NtGdiDdQueryDirectDrawObject e esegue query su una rappresentazione in modalità kernel creata in precedenza per le funzionalità. GdiEntry2 è definito come alias per questa funzione. |
DdQueryDisplaySettingsUniqueness | Restituisce il valore corrente di un intero incrementato ogni volta che si verifica un commutatore di modalità, ad esempio quando è presente un commutatore desktop, un commutatore utente rapido o una casella MICROSOFT MS-DOS a schermo intero. L'applicazione può chiamare ripetutamente questa funzione e confrontare i valori precedenti e nuovi del valore restituito per determinare se le impostazioni di visualizzazione sono state modificate. GdiEntry13 è definito come alias per questa funzione. |
DdReenableDirectDrawObject | Wrapper per la funzione NtGdiDdReenableDirectDrawObject . Abilita nuovamente un'istanza del driver DirectDraw dopo un evento di tipo switch-style in modalità, ad esempio un commutatore in modalità true, un aspetto di una casella MS-DOS a schermo intero o una modifica del driver di visualizzazione. GdiEntry10 è definito come alias per questa funzione. |
DdReleaseDC | Wrapper per la funzione NtGdiDdReleaseDC e rilascia un controller di dominio ottenuto in precedenza tramite DdGetDC o GdiEntry7. GdiEntry8 è definito come alias per questa funzione. |
DdResetVisrgn | Wrapper per la funzione NtGdiDdResetVisrgn e consente informazioni in modalità utente tempestive sull'area di ritaglio per le finestre sul desktop. GdiEntry6 è definito come alias per questa funzione. |
DdSetGammaRamp | La funzione DdSetGammaRamp imposta la rampa gamma per il dispositivo. |
DdSwapTextureHandles | Sviluppato per le interfacce dei driver di dispositivo (DDI) prima di Microsoft DirectDraw 7.0 e non esegue alcuna operazione nei sistemi Microsoft Windows NT. Tutti i parametri vengono ignorati. GdiEntry16 è definito come alias per questa funzione. |
DdUnattachSurface | La funzione DdUnattachSurface rimuove un allegato, creato con DdAttachSurface, tra due oggetti superficie in modalità kernel. |
NtGdiD3DContextCreate | Crea un contesto. |
NtGdiD3DContextDestroy | Elimina il contesto specificato. |
NtGdiD3DContextDestroyAll | Esegue una query sulla quantità di memoria libera nell'heap di memoria gestita dal driver. |
NtGdiD3DDrawPrimitives2 | Esegue il rendering delle primitive e restituisce lo stato di rendering aggiornato. |
NtGdiD3DGetDriverState | Usato dai runtime DirectDraw e Direct3D per ottenere informazioni dal driver sullo stato corrente. |
NtGdiD3DValidateTextureStageState | Restituisce il numero di passaggi in cui l'hardware può eseguire le operazioni di fusione specificate nello stato corrente. |
NtGdiDdAddAlphaBlt | Non implementato. |
NtGdiDdAddAttachedSurface | Collega una superficie a un'altra superficie. |
NtGdiDdAttachSurface | Collega due rappresentazioni di superficie in modalità kernel. |
NtGdiDdBeginMoCompFrame | Avvia la decodifica di un nuovo frame. |
NtGdiDdBlt | Esegue un trasferimento a blocchi di bit. |
NtGdiDdCanCreateD3DBuffer | Determina se il driver può creare un comando a livello di driver o un vertex buffer della descrizione specificata. |
NtGdiDdCanCreateSurface | Indica se il driver può creare una superficie della descrizione della superficie specificata. |
NtGdiDdColorControl | Controlla la luminanza e i controlli luminosità di una superficie di sovrapposizione. |
NtGdiDdCreateD3DBuffer | Usato per creare un comando a livello di driver o un vertex buffer della descrizione specificata. |
NtGdiDdCreateDirectDrawObject | Crea una rappresentazione lato kernel dell'oggetto DirectDraw. |
NtGdiDdCreateMoComp | Notifica al driver che un decodificatore software inizierà a usare la compensazione del movimento con il GUID specificato. |
NtGdiDdCreateSurface | Collega una superficie a un'altra superficie. |
NtGdiDdCreateSurfaceEx | Crea una superficie Direct3D da una superficie DirectDraw e associa un valore di handle richiesto. |
NtGdiDdCreateSurfaceObject | Crea un oggetto superficie in modalità kernel che rappresenta l'oggetto superficie in modalità utente a cui fa riferimento puSurfaceLocal. |
NtGdiDdDeleteDirectDrawObject | Elimina definitivamente un oggetto dispositivo DirectDraw in modalità kernel creato in precedenza. |
NtGdiDdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject elimina un oggetto surface in modalità kernel creato in precedenza. |
NtGdiDddestroyD3DBuffer | Elimina definitivamente un oggetto superficie DirectDraw in modalità kernel allocato in precedenza creato con il membro dwCaps della struttura DDSCAPS impostato su DDSCAPS_EXECUTEBUFFER. |
NtGdiDdDestroyMoComp | Notifica al driver che questo oggetto compensazione movimento non verrà più utilizzato. Il driver deve ora eseguire tutte le operazioni di pulizia necessarie. |
NtGdiDdDestroySurface | Elimina definitivamente un oggetto superficie DirectDraw in modalità kernel allocato in precedenza. |
NtGdiDdEndMoCompFrame | Completa una cornice decodificata. |
NtGdiDdFlip | Determina l'interscambio della memoria della superficie associata alla destinazione e alle superfici correnti. |
NtGdiDdFlipToGDISurface | Notifica al driver quando DirectDraw viene capovolto da o verso una superficie GDI. |
NtGdiDdGetAvailDriverMemory | Esegue una query sulla quantità di memoria libera in tutti gli heap di memoria video. |
NtGdiDdGetBltStatus | Esegue una query sullo stato blit della superficie specificata. |
NtGdiDdGetDC | Crea un controller di dominio per la superficie specificata. |
NtGdiDdGetDriverInfo | Esegue una query sul driver per altre funzionalità directDraw e Direct3D supportate dal driver. |
NtGdiDdGetDxHandle | Restituisce l'handle api DirectX in modalità kernel da usare nelle chiamate successive ai punti di ingresso in modalità kernel che controllano il meccanismo dell'API DirectX. |
NtGdiDdGetFlipStatus | Determina se l'inversione richiesta più di recente su una superficie si è verificata. |
NtGdiDdGetInternalMoCompInfo | Consente al driver di segnalare che alloca internamente la memoria di visualizzazione per eseguire la compensazione del movimento. |
NtGdiDdGetMoCompBuffInfo | Consente al driver di specificare il numero di superfici provvisorie necessarie per supportare il GUID specificato e le dimensioni, la posizione e il formato di ognuna di queste superfici. |
NtGdiDdGetMoCompFormats | Indica i formati non compressi in cui l'hardware può decodificare i dati. |
NtGdiDdGetMoCompGuids | Recupera il numero di GUID supportati dal driver. |
NtGdiDdGetScanLine | Restituisce il numero della linea di analisi fisica corrente. |
NtGdiDdLock | Blocca un'area specificata di memoria di superficie e fornisce un puntatore valido a un blocco di memoria associato a una superficie. |
NtGdiDdLockD3D | Usato per bloccare un'area specificata della memoria buffer e per fornire un puntatore valido a un blocco di memoria associato al buffer. |
NtGdiDdQueryDirectDrawObject | Esegue una query su una rappresentazione in modalità kernel creata in precedenza di un oggetto DirectDraw per le relative funzionalità. |
NtGdiDdQueryMoCompStatus | Esegue una query sullo stato dell'operazione di rendering più recente sulla superficie specificata. |
NtGdiDdReenableDirectDrawObject | Riabilita un oggetto dispositivo in modalità kernel DirectDraw dopo un cambio di modalità. |
NtGdiDdReleaseDC | Rilascia il controller di dominio creato in precedenza per l'oggetto superficie DirectDraw in modalità kernel indicato. |
NtGdiDdRenderMoComp | Indica al driver quali macroblock eseguire il rendering specificando le superfici contenenti i blocchi macro, gli offset in ogni superficie in cui sono presenti i macroblock e le dimensioni dei dati del blocco macro da eseguire per il rendering. |
NtGdiDdResetVisrgn | Usato per abilitare la modalità utente per ottenere una conoscenza valida dell'area di ritaglio per le finestre sul desktop. Questo ritaglio può cambiare in modo asincrono dal punto di vista dei thread in modalità utente. |
NtGdiDdSetColorKey | Imposta il valore della chiave di colore per la superficie specificata. |
NtGdiDdSetExclusiveMode | Notifica al driver quando un'applicazione DirectDraw passa o passa dalla modalità esclusiva. |
NtGdiDdSetGammaRamp | Imposta la rampa gamma per il dispositivo. |
NtGdiDdSetOverlayPosition | Imposta la posizione per una sovrimpressione. |
NtGdiDdUnattachSurface | Rimuove un allegato, creato con NtGdiDdAttachSurface, tra due oggetti superficie in modalità kernel. |
NtGdiDdUnlock | Rilascia il blocco mantenuto sulla superficie specificata. |
NtGdiDdUnlockD3D | Usato per rilasciare un blocco mantenuto su un'area specificata di memoria buffer. |
NtGdiDdUpdateOverlay | Riposiziona o modifica gli attributi visivi di una superficie di sovrapposizione. |
NtGdiDdWaitForVerticalBlank | Restituisce lo stato verticale vuoto del dispositivo. |
Argomenti correlati