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

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.

 

Allocazione del buffer dei comandi e dei vertici

Introduzione alla visualizzazione