Supporto client di basso livello grafico

[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à nell'interazione diretta 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. Esistono tuttavia alcune differenze tra kernel e driver di visualizzazione. I componenti in modalità kernel mantengono una copia di strutture che rappresentano oggetti DirectDraw/Direct3D, ad esempio dispositivi e superfici. Il componente della modalità utente di DirectDraw/Direct3D richiede la creazione di tali strutture, a cui fanno riferimento 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

DirectDraw esegue tutte le connessioni alla modalità kernel tramite il Gdi32.dll usando diversi punti di ingresso. Questi punti di ingresso in genere sono solo parametri di marshalling. Nell'ambito della creazione del dispositivo, il Gdi32.dll restituisce puntatori alle routine all'interno di sé che vengono quindi usate da DirectDraw e Direct3D 7.0.

Direct3D 8.x crea un'interruzione pulita da Gdi32.dll e chiama direttamente i punti di ingresso in modalità kernel.

Chiamata del kernel

Questi punti di ingresso sono simili e, in molti casi, identici ai punti di ingresso nel driver di visualizzazione stesso, quindi una conoscenza dei materiali Driver Development Kit (DDK) per DirectDraw e Direct3D è un prerequisito essenziale per l'uso di queste funzioni.

La chiamata di queste funzioni è diversa tra i sistemi operativi. In Windows 2000 il 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 in Windows 2000. Il meccanismo che effettua 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 si prevede che venga eseguito senza modifiche 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 in modalità kernel, ma con un nome leggermente decorato. L'esempio seguente illustra come le applicazioni possono eseguire l'alias delle 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 portabili

Sono disponibili diverse tecniche per rendere un'applicazione portabile tra sistemi operativi. Il più affidabile consiste nell'installare il pacchetto ridistribuibile Di 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 in precedenza per Windows XP.

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, questo risultato viene ottenuto 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 creare 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 utilizzato nelle chiamate di disegno successive. Il kernel deriva un puntatore alla propria struttura da questi handle e passa tale puntatore al driver di visualizzazione, che quindi esegue l'operazione.

Funzioni

Questa tabella elenca le funzioni che rappresentano i punti di ingresso in modalità kernel e le routine helper in modalità utente in Gdi32.dll che esere 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 DIB edizione Standard CTION che condivide la tabella 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 superficie 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 è definito come alias per questa funzione.
DdDeleteSurfaceObject Wrapper per la funzione NtGdiDdDeleteSurfaceObject ed elimina un oggetto superficie 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 di dispositivo GDI (Graphics Device Interface) di Windows che rappresenta la superficie DirectDraw indicata.
GdiEntry7 è definito come alias per questa funzione.
DdGetDxHandle DdGetDxHandle restituisce l'handle dell'API DirectX microsoft 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 ed esegue una query su una rappresentazione in modalità kernel creata in precedenza per le funzionalità.
GdiEntry2 è definito come alias per questa funzione.
DdQueryDisplay Impostazioni Uniqueness Restituisce il valore corrente di un numero intero incrementato ogni volta che si verifica un cambio di modalità, ad esempio quando è presente un commutatore desktop, un commutatore utente veloce 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, l'aspetto di una casella MS-DOS a schermo intero o la 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 abilita informazioni tempestive sulla modalità utente nell'area di ritaglio per le finestre sul desktop.
GdiEntry6 è definito come alias per questa funzione.
DdSetGammaRamp La funzione DdSetGammaRamp imposta la gamma rampa 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 sia dai runtime DirectDraw che da 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 implementata.
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 superficie in modalità kernel creato in precedenza.
NtGdiDdDestroyD3DBuffer Elimina definitivamente un oggetto surface DirectDraw in modalità kernel allocato in precedenza creato con il membro dwCaps della struttura DDSC piattaforma di strumenti analitici impostata su DDSC piattaforma di strumenti analitici_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 surface DirectDraw in modalità kernel precedentemente allocato.
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 della 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 ottenere funzionalità aggiuntive di DirectDraw e Direct3D supportate dal driver.
NtGdiDdGetDxHandle Restituisce l'handle dell'API DirectX in modalità kernel da usare nelle chiamate successive ai punti di ingresso in modalità kernel che controllano il meccanismo api DirectX.
NtGdiDdGetFlipStatus Determina se si è verificato l'capovolgimento richiesto più di recente su una superficie.
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 riga di analisi fisica corrente.
NtGdiDdLock Blocca un'area specificata di memoria della superficie e fornisce un puntatore valido a un blocco di memoria associato a una superficie.
NtGdiDdLockD3D Consente di bloccare un'area specificata di memoria del buffer e di 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 nella superficie specificata.
NtGdiDdReenableDirectDrawObject Riattiva un oggetto dispositivo in modalità kernel DirectDraw dopo un'opzione 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 macroblock, gli offset in ogni superficie in cui sono presenti i macroblock e le dimensioni dei dati del blocco macro di cui eseguire 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 alla modalità esclusiva o viceversa.
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 del buffer.
NtGdiDdUpdateOverlay Riposiziona o modifica gli attributi visivi di una superficie di sovrapposizione.
NtGdiDdWaitForVerticalBlank Restituisce lo stato vuoto verticale del dispositivo.

 

Allocazione del buffer dei comandi e dei vertici

Introduzione alla visualizzazione