Ondersteuning voor afbeeldingen Low-Level

[Deze functies zijn onderhevig aan wijzigingen bij elke revisie van het besturingssysteem. Gebruik in plaats daarvan de Microsoft DirectDraw en Microsoft Direct3DAPIs; deze API's isoleren toepassingen van dergelijke wijzigingen in het besturingssysteem en verbergen veel andere problemen die betrokken zijn bij het rechtstreeks communiceren met beeldschermstuurprogramma's. Zie Inleiding totweergeven voor meer informatie.]

DirectDraw en Direct3D gebruiken enkele kernelmodusroutines om te communiceren met het besturingssysteem en het beeldschermstuurprogramma.

De kernel van het besturingssysteem lijkt een DirectDraw/Direct3D-weergavestuurprogramma te zijn vanuit het oogpunt van onderdelen in de gebruikersmodus. Er bestaan echter wel enkele verschillen tussen kernel- en weergavestuurprogramma's. De onderdelen van de kernelmodus behouden een kopie van structuren die DirectDraw/Direct3D-objecten vertegenwoordigen, zoals apparaten en oppervlakken. Het gebruikersmodusonderdeel van DirectDraw/Direct3D vraagt het maken van deze structuren aan, waarnaar wordt verwezen met ingangen die worden geretourneerd door de kernelmodus. Daarom zijn de verschillen voornamelijk in de argumenten die worden doorgegeven aan de routines: kernel accepteert ingangen terwijl stuurprogramma's meestal pointers accepteren.

Evolutie van toegangspunten voor kernelmodus

DirectDraw maakt alle verbindingen met de kernelmodus via de Gdi32.dll met behulp van verschillende toegangspunten. Deze toegangspunten zijn doorgaans alleen maar marshalparameters. Als onderdeel van het maken van apparaten retourneert de Gdi32.dll aanwijzers naar routines binnen zichzelf die vervolgens worden gebruikt door DirectDraw en Direct3D 7.0.

Direct3D 8.x maakt een schone onderbreking van Gdi32.dllen roept rechtstreeks de toegangspunten in de kernelmodus aan.

De kernel aanroepen

Deze toegangspunten zijn vergelijkbaar en in veel gevallen identiek aan toegangspunten in het displaystuurprogramma zelf, dus een goed begrip van de DDK-materialen (Driver Development Kit) voor DirectDraw en Direct3D is een essentiële vereiste voor het gebruik van deze functies.

Het aanroepen van deze functies verschilt tussen besturingssystemen. In Windows 2000 is het W2KUMODE. LIB-bibliotheek bevat routines waarmee de aanroepende thread de overgang naar kernelmodus kan maken. Deze routines voeren geen parameter marshalling uit en zijn het ideale aanroepende mechanisme voor Windows 2000. Het mechanisme waarmee de overgang naar de kernelmodus wordt uitgevoerd, is afhankelijk van de volgorde van een tabel. Deze volgorde verandert in revisies van het besturingssysteem. Daarom is het niet raadzaam om een toepassing te bouwen die afhankelijk is van W2KUMODE. LIB voor Windows 2000 en verwacht dat het niet-gewijzigd wordt uitgevoerd in Windows XP. In de volgende sectie wordt een mechanisme beschreven voor het maken van draagbaarheid van besturingssystemen.

In Windows XP exporteert D3D8THK.DLL alle functies van de kernelmodus, maar met een enigszins versierde naam. In het volgende voorbeeld ziet u hoe toepassingen de clientfuncties op laag niveau kunnen aliasen met behulp van de preprocessor. Voordat u dit doet, koppelt u dynamisch aan D3D8THK.DLL.


#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h"      // Brings in the definition of "NtGdiDdUnlock", 
.                       //   which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);

Draagbare toepassingen schrijven

Er zijn verschillende technieken beschikbaar om een toepassing overdraagbaar te maken in besturingssystemen. De meest robuuste is het installeren van het Microsoft DirectX 8.x redistributable-pakket op Windows 2000 als onderdeel van het installatieproces van uw eigen toepassing. Dit garandeert dat D3D8THK.DLL beschikbaar is op Windows 2000-systemen en één codepad in de toepassing toestaat, omdat u dezelfde techniek kunt gebruiken als beschreven voor Windows XP hierboven.

Toepassingen kunnen ook hun eigen isolerende DLL bouwen en twee versies van die DLL implementeren, één voor Windows 2000 met behulp van de hierboven weergegeven techniek en één voor Windows XP die gebruikmaakt van D3D8THK.DLL.

Apparaat maken

DirectDraw en Direct3D moeten eerst een exemplaar maken van de abstractie van het stuurprogrammaobject van de kernel. In Gdi32.dll en Ddraw.dllwordt dit bereikt door het aanroepen van DdCreateDirectDrawObject, DdQueryDirectDrawObject en DdReenableDirectDrawObject. In Direct3D 8.xwordt dit bereikt door NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject en NtGdiDdReenableDirectDrawObjectaan te roepen. Houd er rekening mee dat de GdiEntry*-toegangspunten slechts marshallers zijn voor de kernelmodusinvoerpunten.

Na het aanroepen van deze functies wordt een ingang geretourneerd die de abstractie van het kernelobject van een DirectDraw-apparaat vertegenwoordigt. Dit kernelobject vertegenwoordigt een stuurprogramma-exemplaar dat eigendom is van het weergavestuurprogramma. Deze ingang kan worden gebruikt in volgende aanroepen, zoals DdCreateSurfaceObject (of NtGdiDdCreateSurfaceObject in Direct3D 8.x) om verdere objecten te maken.

Kernelobjecten

Er worden enkele toegangspunten gebruikt om de weergaven van de kernelmodus van bepaalde objecten te beheren. DdCreateSurfaceObject (of NtGdiDdCreateSurfaceObject in Direct3D 8.x) is een goed voorbeeld. Met dit toegangspunt wordt een kernelmodusobject gemaakt dat een deel van het systeemgeheugen vertegenwoordigt. Het toegangspunt retourneert een ingang en deze ingang kan worden gebruikt in volgende tekenoproepen. De kernel leidt een aanwijzer af naar een eigen structuur van deze ingangen en geeft die aanwijzer door aan het weergavestuurprogramma, dat vervolgens de bewerking uitvoert.

Functies

Deze tabel bevat functies die toegangspunten in de kernelmodus vertegenwoordigen en de helperroutines in de gebruikersmodus in Gdi32.dll die deze toegangspunten verpakken.

Onderwerp Inhoud
DdAttachSurface- De DdAttachSurface functie koppelt twee weergaven van de kernelmodus.
DdCreateDIBSection Hiermee maakt u een DIBSECTION structuur die de kleurtabel met het apparaat deelt.
GdiEntry9 wordt #defined als alias voor deze functie.
DdCreateDirectDrawObject Wrapper voor de NtGdiDdCreateDirectDrawObject functie en maakt een kernelweergave van het DirectDraw-object. Een ingang voor deze weergave wordt opgeslagen in pDirectDrawGlobal->hDD.
GdiEntry1- wordt gedefinieerd als een alias voor deze functie.
DdCreateSurfaceObject Wrapper voor de functie NtGdiDdCreateSurfaceObject en maakt een oppervlakobject in de kernelmodus.
GdiEntry4- wordt gedefinieerd als een alias voor deze functie.
DdDeleteDirectDrawObject Wrapper voor de functie NtGdiDdDeleteDirectDrawObject en verwijdert een DirectDraw-object in de kernelmodus dat eerder is gemaakt met DdCreateDirectDrawObject.
GdiEntry3- wordt gedefinieerd als een alias voor deze functie.
DdDeleteSurfaceObject Wrapper voor de functie NtGdiDdDeleteSurfaceObject en verwijdert een oppervlakobject in de kernelmodus dat eerder is gemaakt door NtGdiDdCreateSurfaceObject.
GdiEntry5- is gedefinieerd als een alias voor deze functie.
DdGetDC- Wrapper voor de NtGdiDdGetDC--functie en retourneert een GDI-apparaatcontext (Windows Graphics Device Interface) die het aangegeven DirectDraw-oppervlak vertegenwoordigt.
GdiEntry7- wordt gedefinieerd als een alias voor deze functie.
DdGetDxHandle- De DdGetDxHandle- retourneert de kernelmodus microsoft DirectX API-ingang die moet worden gebruikt in volgende aanroepen naar de toegangspunten in de kernelmodus waarmee het DirectX API-mechanisme wordt beheerd.
DdQueryDirectDrawObject Wrapper voor de NtGdiDdQueryDirectDrawObject functie en voert een query uit op een eerder gemaakte kernelmodusweergave voor mogelijkheden.
GdiEntry2- is gedefinieerd als een alias voor deze functie.
DdQueryDisplaySettingsUniqueness Retourneert de huidige waarde van een geheel getal dat wordt verhoogd wanneer een modusschakelaar plaatsvindt, zoals wanneer er een desktopswitch, een snelle gebruikersswitch of een microsoft-MS-DOS-vak op volledig scherm is. De toepassing kan deze functie herhaaldelijk aanroepen en de oude en nieuwe waarden van de retourwaarde vergelijken om te bepalen of de weergave-instellingen zijn gewijzigd.
GdiEntry13 is gedefinieerd als een alias voor deze functie.
DdReenableDirectDrawObject Wrapper voor de functie NtGdiDdReenableDirectDrawObject. Het schakelt een DirectDraw-stuurprogrammaexemplaren opnieuw in na een moduswijzigingsgebeurtenis, zoals een modusschakelaar, het uiterlijk van een MS-DOS-vak op volledig scherm of het wijzigen van het beeldschermstuurprogramma.
GdiEntry10- wordt gedefinieerd als een alias voor deze functie.
DdReleaseDC- Wrapper voor de functie NtGdiDdReleaseDC en brengt een dc uit die eerder is verkregen via DdGetDC- of GdiEntry7.
GdiEntry8- is gedefinieerd als een alias voor deze functie.
DdResetVisrgn- Wrapper voor de functie NtGdiDdResetVisrgn en schakelt tijdige gebruikersmodusgegevens in in de knipregio voor vensters op het bureaublad.
GdiEntry6- wordt gedefinieerd als een alias voor deze functie.
DdSetGammaRamp De DdSetGammaRamp-functie stelt de gamma-ramp voor het apparaat in.
DdSwapTextureHandles Ontwikkeld voor DDIs's (Device Driver Interfaces) vóór Microsoft DirectDraw 7.0 en doet niets op Microsoft Windows NT-systemen. Alle parameters worden genegeerd.
GdiEntry16- wordt gedefinieerd als een alias voor deze functie.
DdUnattachSurface De functie DdUnattachSurface verwijdert een bijlage, gemaakt met DdAttachSurface, tussen twee oppervlakobjecten in de kernelmodus.
NtGdiD3DContextCreate- Hiermee maakt u een context.
NtGdiD3DContextDestroy- Hiermee verwijdert u de opgegeven context.
NtGdiD3DContextDestroyAll Hiermee wordt de hoeveelheid vrij geheugen in de door het stuurprogramma beheerde geheugen-heap opgevraagd.
NtGdiD3DDrawPrimitives2 Geeft primitieven weer en retourneert de bijgewerkte weergavestatus.
NtGdiD3DGetDriverState Wordt gebruikt door de DirectDraw- en Direct3D-runtimes om informatie te verkrijgen van het stuurprogramma over de huidige status.
NtGdiD3DValidateTextureStageState Retourneert het aantal slagen waar de hardware de mengbewerkingen kan uitvoeren die zijn opgegeven in de huidige status.
NtGdiDdAddAlphaBlt- Niet geïmplementeerd.
NtGdiDdAddAttachedSurface Bevestigt een oppervlak aan een ander oppervlak.
NtGdiDdAttachSurface Koppelt twee surface-weergaven in de kernelmodus.
NtGdiDdBeginMoCompFrame Begint met het decoderen van een nieuw frame.
NtGdiDdBlt- Voert een bitblokoverdracht uit.
NtGdiDdCanCreateD3DBuffer Bepaalt of het stuurprogramma een opdracht op stuurprogrammaniveau of hoekpuntbuffer van de opgegeven beschrijving kan maken.
NtGdiDdCanCreateSurface Geeft aan of het stuurprogramma een oppervlak van de opgegeven surfacebeschrijving kan maken.
NtGdiDdColorControl- Hiermee bepaalt u de helderheids- en helderheidsregelaars van een overlayoppervlak.
NtGdiDdCreateD3DBuffer Wordt gebruikt om een opdracht op stuurprogrammaniveau of hoekpuntbuffer van de opgegeven beschrijving te maken.
NtGdiDdCreateDirectDrawObject Hiermee maakt u een weergave aan de kernelzijde van het DirectDraw-object.
NtGdiDdCreateMoComp- Hiermee wordt het stuurprogramma gemeld dat een softwaredecoder bewegingscompensatie gaat gebruiken met de opgegeven GUID.
NtGdiDdCreateSurface Bevestigt een oppervlak aan een ander oppervlak.
NtGdiDdCreateSurfaceEx Hiermee maakt u een Direct3D-oppervlak van een DirectDraw-oppervlak en koppelt u er een aangevraagde ingangswaarde aan.
NtGdiDdCreateSurfaceObject Hiermee maakt u een oppervlakobject in de kernelmodus dat het surface-object in de gebruikersmodus vertegenwoordigt waarnaar wordt verwezen door puSurfaceLocal-.
NtGdiDdDeleteDirectDrawObject Vernietigt een eerder gemaakt DirectDraw-apparaatobject in de kernelmodus.
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject verwijdert een eerder gemaakt oppervlakobject in de kernelmodus.
NtGdiDdDestroyD3DBuffer Hiermee wordt een eerder toegewezen DirectDraw-oppervlakobject in de kernelmodus vernietigd dat is gemaakt met de dwCaps- lid van de DDSCAPS- structuur ingesteld op DDSCAPS_EXECUTEBUFFER.
NtGdiDdDestroyMoComp- Hiermee wordt de bestuurder op de hoogte gebracht dat dit bewegingscompensatieobject niet meer wordt gebruikt. Het stuurprogramma moet nu alle benodigde opschoning uitvoeren.
NtGdiDdDestroySurface Vernietigt een eerder toegewezen DirectDraw-oppervlakobject in de kernelmodus.
NtGdiDDEndMoCompFrame Voltooit een gedecodeerd frame.
NtGdiDdFlip- Zorgt ervoor dat het surface-geheugen dat is gekoppeld aan het doel en de huidige oppervlakken, worden uitgewisseld.
NtGdiDdFlipToGDISurface Hiermee wordt het stuurprogramma op de hoogte gemaakt wanneer DirectDraw naar of van een GDI-oppervlak wordt geknipt.
NtGdiDdGetAvailDriverMemory- Hiermee wordt de hoeveelheid vrij geheugen in alle videogeheugen-heaps opgevraagd.
NtGdiDdGetBltStatus Hiermee wordt de status blit van het opgegeven oppervlak opgevraagd.
NtGdiDdGetDC- Hiermee maakt u een DC voor het opgegeven oppervlak.
NtGdiDdGetDriverInfo Hiermee wordt het stuurprogramma opgevraagd voor extra DirectDraw- en Direct3D-functionaliteit die door het stuurprogramma wordt ondersteund.
NtGdiDdGetDxHandle- Retourneert de DirectX API-ingang in de kernelmodus die moet worden gebruikt in volgende aanroepen naar de ingangspunten in de kernelmodus die het DirectX API-mechanisme beheren.
NtGdiDdGetFlipStatus Bepaalt of de meest recent aangevraagde flip op een oppervlak heeft plaatsgevonden.
NtGdiDdGetInternalMoCompInfo Hiermee kan het stuurprogramma rapporteren dat het intern weergavegeheugen toewijst om bewegingscompensatie uit te voeren.
NtGdiDdGetMoCompBuffInfo Hiermee kan het stuurprogramma opgeven hoeveel tussentijdse oppervlakken nodig zijn om de opgegeven GUID te ondersteunen, evenals de grootte, locatie en indeling van elk van deze oppervlakken.
NtGdiDdGetMoCompFormats Geeft de niet-gecomprimeerde indelingen aan waarmee de hardware de gegevens kan decoderen.
NtGdiDdGetMoCompGuids- Hiermee wordt het aantal GUID's opgehaald dat het stuurprogramma ondersteunt.
NtGdiDdGetScanLine- Retourneert het nummer van de huidige fysieke scanregel.
NtGdiDdLock- Vergrendelt een opgegeven gebied van surface memory en biedt een geldige aanwijzer naar een blok geheugen dat is gekoppeld aan een surface.
NtGdiDdLockD3D- Wordt gebruikt om een opgegeven buffergeheugengebied te vergrendelen en een geldige aanwijzer te bieden voor een blok geheugen dat aan de buffer is gekoppeld.
NtGdiDdQueryDirectDrawObject Query's uitvoeren op een eerder gemaakte kernelmodusweergave van een DirectDraw-object voor de mogelijkheden ervan.
NtGdiDdQueryMoCompStatus Query's uitvoeren op de status van de meest recente renderingbewerking naar het opgegeven oppervlak.
NtGdiDdReenableDirectDrawObject Hiermee schakelt u een Apparaatobject in de DirectDraw-kernelmodus opnieuw in na een modusschakelaar.
NtGdiDdReleaseDC- Hiermee wordt de eerder gemaakte DC uitgebracht voor het aangegeven DirectDraw-oppervlakobject in de kernelmodus.
NtGdiDdRenderMoComp- Geeft aan welk stuurprogramma macroblokkeringen moeten worden weergegeven door de oppervlakken op te geven die de macroblokkeringen bevatten, de verschuivingen in elk oppervlak waar de macroblokkeringen bestaan en de grootte van de macroblokgegevens die moeten worden weergegeven.
NtGdiDdResetVisrgn- Wordt gebruikt om de gebruikersmodus in staat te stellen om een geldig inzicht te krijgen in de knipregio voor vensters op het bureaublad. Deze knipbewerking kan asynchroon worden gewijzigd vanuit het oogpunt van threads in de gebruikersmodus.
NtGdiDdSetColorKey Hiermee stelt u de kleursleutelwaarde voor het opgegeven oppervlak in.
NtGdiDdSetExclusiveMode Hiermee wordt het stuurprogramma op de hoogte brengt wanneer een DirectDraw-toepassing overschakelt naar of van de exclusieve modus.
NtGdiDdSetGammaRamp Hiermee stelt u de gamma-ramp voor het apparaat in.
NtGdiDdSetOverlayPosition Hiermee stelt u de positie voor een overlay in.
NtGdiDdUnattachSurface Hiermee verwijdert u een bijlage, gemaakt met NtGdiDdAttachSurface, tussen twee oppervlakobjecten in de kernelmodus.
NtGdiDdUnlock Laat de vergrendeling los op het opgegeven oppervlak.
NtGdiDdUnlockD3D- Wordt gebruikt om een vergrendeling op een opgegeven buffergeheugen vrij te geven.
NtGdiDdUpdateOverlay- De visuele kenmerken van een overlayoppervlak verplaatsen of wijzigen.
NtGdiDdWaitForVerticalBlank- Retourneert de verticale lege status van het apparaat.

 

opdracht en toewijzing van hoekpuntbuffers

Inleiding tot weergeven