Riepilogo delle funzionalità (Direct3D 9 per Windows Vista)
Questa documentazione si riferisce in particolare alle estensioni di Windows Vista per la grafica DirectX. Per sviluppare la potenza di DirectX per Windows Vista, è necessario installare Windows Vista SDK e DirectX SDK. Le applicazioni che usano DirectX per Windows Vista devono usare hardware che usa il driver WDDM (Modello di driver di dispositivo Windows) anziché XPDM (XP Driver Model); i driver che non implementano WDDM non possono creare un'istanza delle interfacce grafiche DirectX di Windows Vista.
Scopri le nuove funzionalità grafiche DirectX in Windows Vista in una delle sezioni seguenti:
- modifiche al comportamento del dispositivo
- Disabilitazione dell'elaborazione dei vertici software multithread
- superfici a un bit
- buffer di profondità/stencil di lettura
- Condivisione delle risorse
- conversione sRGB prima della fusione
- Miglioramenti di StretchRect
- creazione di trame in memoria di sistema
Modifiche del comportamento del dispositivo
I dispositivi vengono ora persi solo in due circostanze; quando l'hardware viene reimpostato perché è bloccato e quando il driver di dispositivo viene arrestato. Quando l'hardware si blocca, il dispositivo può essere reimpostato chiamando ResetEx. Se l'hardware si blocca, la memoria delle texture viene persa.
Dopo l'arresto di un driver, è necessario ricreare l'oggetto IDirect9Ex per riprendere il rendering.
Quando l'area di presentazione è nascosta da un'altra finestra in modalità finestra o quando un'applicazione a schermo intero è ridotta a icona, PresentEx restituirà S_D3DPRESENTATIONOCCLUDED. Le applicazioni a schermo intero possono riprendere il rendering quando ricevono un messaggio di callback WM_ACTIVATEAPP.
Nelle versioni precedenti di DirectX, quando un'applicazione ha subito un cambiamento di modalità, l'unico modo per ripristinare era reimpostare il dispositivo e ricreare tutte le risorse di memoria video e le catene di scambio. Ora con DirectX per Windows Vista, la chiamata a Reimposta dopo una modifica della modalità non causa la perdita delle superfici di memoria, delle texture e delle informazioni sullo stato, e queste risorse non devono essere ricreate.
Disabilitazione dell'elaborazione dei vertici software multithreading
È stato aggiunto un nuovo bit di capacità (D3DCREATE_DISABLE_PSGP_THREADING) che disabiliterà il multithreading per l'elaborazione software dei vertici (swvp). Usare questa macro per generare un flag di comportamento per IDirect3D9::CreateDevice.
#define D3DCREATE_DISABLE_PSGP_THREADING
Superfici a un bit
Esiste un nuovo tipo di formato di superficie a un bit che può essere particolarmente utile per l'elaborazione di glifi di testo. Il nuovo formato viene chiamato D3DFMT_A1. Una superficie a un bit è progettata per essere usata come texture per pixel o come target di render generato da ComposeRects o ColorFill. Non ci sono limiti separati per la larghezza e l'altezza della superficie; un'implementazione deve supportare una superficie di dimensione singola di 2K texel x 8K texel.
Una superficie a un bit ha un bit per texel; pertanto, uno significa che tutti i componenti (r,g,b,a) di un pixel sono 1 e zero significa che tutti i componenti sono uguali a 0. È possibile usare superfici a un bit con le API seguenti: ColorFill, UpdateSurface e UpdateTexture.
Quando viene letta una superficie a un bit, il runtime può eseguire il campionamento puntuale o il filtraggio per convoluzione. Il filtro di convoluzione è regolabile (vedere SetConvolutionMonoKernel).
Esistono alcune restrizioni per le superfici a 1-bit:
- Il mip-mapping non è supportato
- I dati sRGB non possono essere letti o scritti in una superficie a un bit.
- Una superficie a un bit non può essere usata come texture di vertice o per il multicampionamento.
Lettura dei buffer di profondità/stencil
Usa IDirect3DDevice9::UpdateSurface per leggere o scrivere dati depth/stencil dalle superfici ottenute da IDirect3DDevice9::CreateDepthStencilSurface o IDirect3DDevice9::GetDepthStencilSurface.
Prima di tutto, creare una superficie bloccabile, solo di profondità o solo stencil usando IDirect3DDevice9::CreateOffscreenPlainSurface. Usare uno dei formati seguenti:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
In secondo luogo, trasferire i dati tra il buffer depth/stencil e la superficie di profondità o stencil appena creata. Il trasferimento viene eseguito usando IDirect3DDevice9::UpdateSurface.
UpdateSurface avrà esito negativo quando entrambe le superfici sono in formato LOCKABLE o entrambe non sono bloccabili.
Il trasferimento di dati inesistenti genererà un errore(ad esempio, il trasferimento da una superficie di profondità non bloccabile a una superficie D3DFMT_S8_LOCKABLE).
Il resto delle restrizioni per IDirect3DDevice9::UpdateSurface è ancora applicabile.
Condivisione delle risorse
Le risorse Direct3D possono ora essere condivise tra dispositivi o processi. Questo vale per qualsiasi risorsa Direct3D, tra cui texture, buffer di vertici, buffer di indici o superfici (ad esempio destinazioni di rendering, buffer di stencil di profondità o superfici normali non visibili). Per essere condivisi, è necessario designare una risorsa per la condivisione al momento della creazione e individuare la risorsa nel pool predefinito (D3DPOOL_DEFAULT). Dopo aver creato una risorsa per la condivisione, può essere condivisa tra dispositivi all'interno di un processo o condivisa tra processi.
Per abilitare le risorse condivise, le API di creazione delle risorse hanno un parametro di handle aggiuntivo. Questo è un handle che punta alla risorsa condivisa. Nelle revisioni precedenti di DirectX questo argomento fa parte della firma API, ma è stato inutilizzato e deve essere impostato su NULL. A partire da Windows Vista, usare pSharedHandle nei modi seguenti:
- Impostare il puntatore (pSharedHandle) su NULL per non condividere una risorsa. Questo è proprio come il comportamento di DirectX prima di Windows Vista.
- Per creare una risorsa condivisa, chiamare una qualsiasi API di creazione di risorse (vedere di seguito) con un handle non inizializzato (il puntatore stesso non è NULL (pSharedHandle != NULL), ma il puntatore punta a un valore NULL (*pSharedHandle == NULL)). L'API genererà una risorsa condivisa e restituirà un handle valido.
- Per aprire e accedere a una risorsa condivisa creata in precedenza usando un handle di risorse condiviso nonNULL, impostare pSharedHandle sull'indirizzo di tale handle. Dopo aver aperto la risorsa condivisa creata in precedenza in questo modo, è possibile usare l'interfaccia restituita nell'API Direct3D 9 o Direct3D 9Ex come se l'interfaccia fosse una risorsa tipica di quel tipo.
Le API di creazione delle risorse includono - CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceEx, e CreateRenderTargetEx.
Esistono alcune restrizioni per l'uso di risorse condivise. Questi includono:
- L'API usata per aprire una risorsa condivisa deve corrispondere all'API usata per creare la risorsa condivisa. Ad esempio, se è stato usato CreateTexture per creare una risorsa condivisa, è necessario usare CreateTexture per aprire tale risorsa condivisa; se è stato usato CreateRenderTarget per creare una risorsa condivisa, è necessario usare CreateRenderTarget per aprire tale risorsa condivisa; E così via.
- Quando si apre una risorsa condivisa, è necessario specificare D3DPOOL_DEFAULT.
- Le risorse bloccabili (trame con D3DUSAGE_DYNAMIC, buffer dei vertici e buffer di indice, ad esempio, possono riscontrare prestazioni scarse quando vengono condivise. I rendertarget bloccabili non verranno condivisi in alcuni hardware.
- I riferimenti a una risorsa condivisa tra processi devono avere le stesse dimensioni della risorsa originale. Quando si passa un handle tra processi, includere le informazioni sulla dimensione in modo che il riferimento possa essere creato in modo identico.
- Le superfici tra processi condivisi non forniscono alcun meccanismo di sincronizzazione. Le modifiche di lettura/scrittura in una superficie condivisa potrebbero non riflettere la visualizzazione attesa del processo che fa riferimento alla superficie. Per fornire la sincronizzazione, usare query di eventi o bloccare la texture.
- Solo il processo che crea inizialmente una risorsa condivisa può bloccarlo (qualsiasi processo che apre un riferimento a tale risorsa condivisa non può bloccarlo).
- Se una risorsa condivisa è bloccata, non esiste alcuna convalida per altri processi per sapere se la risorsa è disponibile.
Conversione sRGB prima della fusione
È ora possibile verificare se il dispositivo può convertire i dati della pipeline in sRGB prima della fusione del buffer del frame. Questo implica che il dispositivo converte i valori del target di rendering da sRGB. Per verificare se la conversione è supportata dall'hardware, verificare la presenza di questo limite:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Questo limite identifica l'hardware che supporta la conversione in sRGB prima della fusione. Questa funzionalità è importante per il rendering di alta qualità dai buffer dei fotogrammi fp16 nel Gestore delle finestre desktop (DWM).
Miglioramenti di StretchRect
Nelle versioni precedenti di DirectX, StretchRect presenta molte restrizioni per supportare driver diversi (vedere IDirect3DDevice9::StretchRect). Windows Vista è basato sul modello di driver di dispositivo Windows (WDDM). Questo nuovo modello di driver è molto più affidabile e consente ai driver di gestire casi speciali nell'hardware.
In generale, l'unica restrizione rimanente è che il target di rendering deve essere stato creato con l'uso di render-target (D3DUSAGE_RENDERTARGET). Questa restrizione viene revocata se si esegue una copia semplice (in cui l'origine e il dest sono lo stesso formato, le stesse dimensioni e non sono presenti rettangoli secondari).
Creazione di trame nella memoria di sistema
Le applicazioni che richiedono maggiore flessibilità rispetto all'uso, all'allocazione e all'eliminazione della memoria di sistema possono ora creare trame da un puntatore alla memoria di sistema. Ad esempio, un'applicazione potrebbe creare una trama Direct3D da un puntatore bitmap della memoria di sistema GDI.
È necessario eseguire due operazioni per creare una trama di questo tipo:
- Allocare una quantità sufficiente di memoria di sistema per contenere la superficie della texture. Il numero minimo di byte è larghezza x altezza x byte per pixel.
- Passare l'indirizzo di un puntatore alla superficie di memoria di sistema per il parametro HANDLE* a IDirect3DDevice9::CreateTexture.
Ecco il prototipo di funzione per IDirect3DDevice9::CreateTexture:
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels,
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture,
HANDLE* pSharedHandle)
Una trama di memoria di sistema presenta le restrizioni seguenti:
- Il pitch della trama deve essere uguale alla larghezza della trama moltiplicata per il numero di byte per pixel.
- Quando si usano formati compressi (formati DXT), l'applicazione è responsabile dell'allocazione delle dimensioni corrette.
- Sono supportate solo le texture con un singolo livello mipmap.
- Il valore passato a CreateTexture per l'argomento Pool deve essere D3DPOOL_SYSTEMMEM.
- Questa API incapsula la memoria fornita in una texture. Non deallocare questa memoria finché non hai finito di usarla.