Funktionssammanfattning (Direct3D 9 för Windows Vista)
Den här dokumentationen refererar specifikt till Windows Vista-tilläggen för DirectX-grafik. För att utveckla kraften i DirectX för Windows Vista måste du installera Windows Vista SDK och DirectX SDK. Program som använder DirectX för Windows Vista måste använda maskinvara som använder WDDM-drivrutinen (Windows-drivrutinsmodellen) i stället för XPDM (XP Driver Model). drivrutiner som inte implementerar WDDM kan inte instansiera Windows Vista DirectX-grafikgränssnitt.
Upptäck de nya DirectX-grafikfunktionerna i Windows Vista i något av följande avsnitt:
- enhetsbeteende ändringar
- Inaktivering av flertrådad programvaru-vertex-bearbetning
- One Bit Surfaces
- Djupavläsning/Stencilbuffertar
- delningsresurser
- sRGB-konvertering innan blandning med
- StretchRect-förbättringar
- skapande av textur i systemminnet
Ändringar i enhetsbeteende
Enheter går nu bara förlorade under två omständigheter; när maskinvaran återställs på grund av att den hänger, och när drivrutinen stoppas. När maskinvaran låser sig kan enheten återställas genom att anropa ResetEx. Om maskinvaran låser sig går texturminnet förlorat.
När en drivrutin har stoppats måste IDirect9Ex-objektet återskapas för att återgivningen ska återupptas.
När presentationsområdet döljs av ett annat fönster i fönsterläge, eller när ett fullskärmsprogram minimeras, returnerar PresentEx S_D3DPRESENTATIONOCCLUDED. Helskärmsprogram kan återuppta återgivningen när de får ett WM_ACTIVATEAPP återanropsmeddelande.
I tidigare versioner av DirectX, när ett program upplevde en lägesändring, var det enda sättet att återställa att återställa enheten och återskapa alla videominnesresurser och växlingskedjor. Nu med DirectX för Windows Vista leder inte ett anrop till återställning efter en lägesändring till att texturminnesytor, texturer och tillståndsinformation går förlorade, och dessa resurser behöver inte återskapas.
Inaktivera flertrådad programvaru-vertexbearbetning
En ny caps-bit (D3DCREATE_DISABLE_PSGP_THREADING) har lagts till som inaktiverar flertrådning för bearbetning av programvaruvertikaler (swvp). Använd det här makrot för att generera en beteendeflagga för IDirect3D9::CreateDevice.
#define D3DCREATE_DISABLE_PSGP_THREADING
One Bit Surfaces
Det finns en ny formattyp för en bits yta som kan vara särskilt användbar för bearbetning av textgenlyfer. Det nya formatet kallas D3DFMT_A1. En enbitsyta är utformad för att antingen användas som en textur per pixel, eller som målutdata för rendering genererad av ComposeRects eller ColorFill. Det finns inga separata lock för ytans bredd och höjd; en implementering måste stödja en enskild storleksyta som är 2K texels x 8K texels.
En enbitsyta har en bit per texel; Därför innebär en en att alla komponenter (r,g,b,a) av en pixel är 1, och noll skulle innebära att alla komponenter är lika med 0. Du kan använda enbitsytor med följande API:er: ColorFill, UpdateSurface och UpdateTexture.
När en enbitsyta läses kan programmet utföra antingen punktsampling eller konvolutionsfiltrering. Filtret för convolution är justerbart (se SetConvolutionMonoKernel).
Det finns vissa begränsningar för enbitsytor:
- Mip-mappning stöds inte
- sRGB-data kan inte läsas eller skrivas till en enbitsyta.
- En enbitsyta kan inte användas som hörnstruktur eller för multisampling.
Läsdjup/stencilbuffertar
Använd IDirect3DDevice9::UpdateSurface för att läsa eller skriva djup/stencildata från ytor som hämtats från IDirect3DDevice9::CreateDepthStencilSurface eller IDirect3DDevice9::GetDepthStencilSurface.
Skapa först en låsbar yta, antingen endast för djup eller endast för stencil, med IDirect3DDevice9::CreateOffscreenPlainSurface. Använd något av följande format:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
För det andra överför du data mellan djup-/stencilbufferten och det nyligen skapade låsbara djupet eller stencilytan. Överföringen utförs med IDirect3DDevice9::UpdateSurface.
UpdateSurface misslyckas när båda ytorna är i låsbart format eller båda är icke-låsbara.
Överföring av icke-existerande data resulterar i ett fel (till exempel överföring från en icke-låsbar yta för endast djup till en D3DFMT_S8_LOCKABLE-yta).
Resten av begränsningarna för IDirect3DDevice9::UpdateSurface gäller fortfarande.
Dela resurser
Direct3D-resurser kan nu delas mellan enheter eller processer. Detta gäller för alla Direct3D-resurser, inklusive texturer, vertexbuffertar, indexbuffertar och ytor (till exempel återgivningsmål, djupstencilbuffertar eller rena ytor utanför skärmen). För att delas måste du ange en resurs för delning vid tidpunkten för skapandet och leta upp resursen i standardpoolen (D3DPOOL_DEFAULT). När en resurs har skapats för delning kan den delas mellan enheter i en process eller delas mellan processer.
För att aktivera delade resurser har API:erna för resursskapande ytterligare en referensparameter. Det här är ett HANDLE som pekar på den delade resursen. I tidigare revisioner av DirectX har det här argumentet varit en del av API-signaturen, men har inte använts och måste anges till NULL-. Börja med Windows Vista och använd pSharedHandle på följande sätt:
- Ange pekaren (pSharedHandle) till NULL för att inte dela en resurs. Detta är precis som beteendet för DirectX före Windows Vista.
- Om du vill skapa en delad resurs anropar du alla API:er för resursskapande (se nedan) med ett oinitierat handtag (pekaren i sig är inte NULL- (pSharedHandle != NULL), men pekaren pekar på ett NULL- värde (*pSharedHandle == NULL)). API:et genererar en delad resurs och returnerar ett giltigt handtag.
- Om du vill öppna och få åtkomst till en tidigare skapad delad resurs med hjälp av en ickeNULL-delad resursreferens anger du pSharedHandle till adressen för handtaget. När du har öppnat den tidigare skapade delade resursen på det här sättet kan du använda det returnerade gränssnittet i Direct3D 9- eller Direct3D 9Ex-API:et som om gränssnittet var en typisk resurs av den typen.
API:er för att skapa resurser omfattar – CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceEx, och CreateRenderTargetEx.
Det finns vissa begränsningar för att använda delade resurser. Dessa inkluderar:
- Det API som du använder för att öppna en delad resurs måste matcha det API som du använde för att skapa den delade resursen. Om du till exempel använde CreateTexture för att skapa en delad resurs måste du använda CreateTexture- för att öppna den delade resursen. Om du använde CreateRenderTarget för att skapa en delad resurs måste du använda CreateRenderTarget för att öppna den delade resursen. och så vidare.
- När du öppnar en delad resurs måste du ange D3DPOOL_DEFAULT.
- Låsbara resurser (texturer med D3DUSAGE_DYNAMIC, hörnbuffertar och indexbuffertar, till exempel) kan uppleva dåliga prestanda när de delas. Låsbara rendertargets kan inte delas på viss maskinvara.
- Referenser till en delad resurs mellan processer måste ha samma dimensioner som den ursprungliga resursen. När du skickar ett handtag mellan processer ska du inkludera dimensionsinformationen så att referensen kan skapas på samma sätt.
- Gemensamma korsprocessytor ger ingen synkroniseringsmekanism. Läs-/skrivändringar på en delad yta kanske inte återspeglar en referensprocesss vy av ytan när den förväntas. Om du vill tillhandahålla synkronisering använder du händelsefrågor eller låser strukturen.
- Endast den process som ursprungligen skapar en delad resurs kan låsa den (alla processer som öppnar en referens till den delade resursen kan inte låsa den).
- Om en delad resurs är låst finns det ingen validering för andra processer för att veta om resursen är tillgänglig.
sRGB-konvertering före blandning
Nu kan du kontrollera om enheten kan konvertera pipelinedata till sRGB före blandning av rambuffert. Detta innebär att enheten konverterar återgivningsmålvärdena från sRGB. För att se om konvertering stöds av maskinvaran kontrollerar du efter denna kapabilitet:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Denna funktion identifierar maskinvara som stöder konvertering till sRGB innan sammanslagning. Den här funktionen är viktig för högkvalitativ rendering från fp16-bildrutebuffertar i skrivbordsfönstrets hanterare (DWM).
StretchRect-förbättringar
I tidigare versioner av DirectX har StretchRect många begränsningar för olika drivrutiner (se IDirect3DDevice9::StretchRect). Windows Vista bygger på Windows-drivrutinsmodellen (WDDM). Den här nya drivrutinsmodellen är mycket mer robust och gör det möjligt för drivrutiner att hantera specialfall i maskinvaran.
I allmänhet är den enda återstående begränsningen att återgivningsmålet måste ha skapats med användning av återgivningsmål (D3DUSAGE_RENDERTARGET). Den här begränsningen lyfts om du gör en enkel kopia (där källan och dest har samma format, samma storlek och det inte finns några underrektanglar).
Skapande av struktur i systemminne
Program som behöver mer flexibilitet när det gäller användning, allokering och borttagning av systemminnet kan nu skapa texturer från en systemminnespekare. Ett program kan till exempel skapa en Direct3D-struktur från en GDI-bitmappspekare för systemminne.
Du måste göra två saker för att skapa en sådan struktur:
- Allokera tillräckligt med systemminne för att lagra texturytan. Det minsta antalet byte är bredd x höjd x byte per pixel.
- Skicka adressen till en pekare till systemminnesytan för parametern HANDLE* till IDirect3DDevice9::CreateTexture.
Här är funktionsprototypen för IDirect3DDevice9::CreateTexture:
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels,
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture,
HANDLE* pSharedHandle)
En systemminnesstruktur har följande begränsningar:
- Texturhöjden måste vara lika med texturbredden gånger antalet byte per pixel.
- När du använder komprimerade format (DXT-format) ansvarar programmet för att allokera rätt storlek.
- Endast texturer med en enda mipmap-nivå stöds.
- Värdet som skickas till CreateTexture för argumentet Pool måste vara D3DPOOL_SYSTEMMEM.
- Det här API:et omsluter det angivna minnet i en struktur. Frigör inte det här minnet förrän du är klar med det.