Riepilogo delle funzionalità (Direct3D 9 per Windows Vista)

Questa documentazione si riferisce in modo specifico 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 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

I dispositivi vengono ora persi solo in due circostanze; quando l'hardware viene reimpostato perché è appeso 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 della trama viene persa.

Dopo l'arresto di un driver, è necessario ricreare l'oggetto IDirect9Ex per riprendere il rendering.

Quando l'area di presentazione viene 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 una modifica della modalità, l'unico modo per eseguire il ripristino consiste nel 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 di superfici di memoria delle trame, trame e informazioni sullo stato e queste risorse non devono essere ricreate.

Disabilitazione dell'elaborazione dei vertici software multithreading

È stato aggiunto un nuovo bit di estremità (D3DCREATE_DISABLE_PSGP_THREADING) che disabiliterà il multithreading per l'elaborazione dei vertici software (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 superficie di 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 trama per pixel o l'output della destinazione di rendering generato da ComposeRects o ColorFill. Non ci sono estremità separate per la larghezza e l'altezza della superficie; un'implementazione deve supportare una superficie di dimensioni singola che è 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 un esempio di punto o un filtro di convoluzione. Il filtro di convoluzione è regolabile (vedere SetConvolutionMonoKernel).

Esistono alcune restrizioni per le superfici a un bit:

  • Il mapping mip 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 trama di vertice o per il multicampionamento.

Lettura di 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 bloccata, solo profondità o stencil usando IDirect3DDevice9::CreateOffscreenPlainSurface. Utilizzare uno dei seguenti formati:

  • 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 stencil bloccata 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 di 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, incluse trame, vertex buffer, buffer di indice o superfici(ad esempio destinazioni di rendering, buffer di stencil di profondità o superfici normali fuori schermo). Per essere condiviso, è 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. Si tratta di un handle che punta alla risorsa condivisa. Nelle revisioni precedenti di DirectX, questo argomento fa parte della firma dell'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 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 risorsa condivisa 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 di risorse includono : CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceEx e CreateRenderTargetEx.

Esistono alcune restrizioni per l'uso di risorse condivise. Queste includono:

  • L'API usata per aprire una risorsa condivisa deve corrispondere all'API usata per creare la risorsa condivisa. Ad esempio, se si usa 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 la risorsa condivisa e così via.
  • Quando si apre una risorsa condivisa, è necessario specificare D3DPOOL_DEFAULT.
  • Le risorse bloccabili (trame con D3DUSAGE_DYNAMIC, vertex buffer e buffer di indice, ad esempio, possono riscontrare prestazioni scarse se 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 in un processo, 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 di un processo di riferimento della superficie quando previsto. Per fornire la sincronizzazione, usare query di eventi o bloccare la trama.
  • 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 frame. Ciò implica che il dispositivo converte i valori di destinazione di rendering da sRGB. Per verificare se la conversione è supportata dall'hardware, controllare 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 in Gestione 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 la destinazione di rendering deve essere stata creata con l'utilizzo della destinazione di rendering (D3DUSAGE_RENDERTARGET). Questa restrizione viene revocata se si esegue una copia semplice (dove l'origine e ilest sono dello stesso formato, le stesse dimensioni e non sono presenti sotto rettangoli).

Creazione di trame nella memoria di sistema

Le applicazioni che necessitano di 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 può creare una trama Direct3D da un puntatore bitmap di memoria di sistema GDI.

È necessario eseguire due operazioni per creare una trama di questo tipo:

  • Allocare memoria di sistema sufficiente per contenere la superficie della trama. Il numero minimo di byte è larghezza x altezza x byte per pixel.
  • Passare l'indirizzo di un puntatore all'area di memoria del 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 passo della trama deve essere uguale alla larghezza della trama al numero di byte per pixel.
  • Quando si usano formati compressi (formati DXT), l'applicazione è responsabile dell'allocazione delle dimensioni corrette.
  • Sono supportate solo trame con un singolo livello mipmap.
  • Il valore passato a CreateTexture per l'argomento Pool deve essere D3DPOOL_SYSTEMMEM.
  • Questa API esegue il wrapping della memoria fornita in una trama. Non deallocare questa memoria fino a quando non viene eseguita.