Allocazione del buffer dei comandi e del vertice

Esistono tre tipi di buffer usati in Direct3D:

  • Buffer dei vertici impliciti, creati solo per l'uso interno; vale a dire, le applicazioni non sono a conoscenza di loro. Un buffer del vertice implicito viene sempre creato dopo la creazione del contesto e Direct3D archivia i dati dei vertici in essi.

  • Buffer dei vertici espliciti, creati solo in risposta a una richiesta dell'applicazione. Direct3D archivia quindi i dati dei vertici in buffer vertex espliciti.

  • Buffer dei comandi, creati solo per l'uso interno; ovvero, le applicazioni non sono a conoscenza dei buffer dei comandi. Direct3D archivia i dati dei comandi nei buffer dei comandi.

I buffer dei vertici impliciti sono buffer di vertice speciali usati internamente da Direct3D per il batch. Vengono creati durante l'inizializzazione del dispositivo e possono essere multibufferati. Sono sempre in lettura/scrittura in modo che non devono essere inseriti in memoria video (per Microsoft DirectX 6.0 e le versioni successive). Questo tipo di buffer è contrassegnato dall'assenza sia dei flag di DDSCAPS2_VERTEXBUFFER che di DDSCAPS2_COMMANDBUFFER.

I buffer dei vertici espliciti vengono creati e controllati dall'applicazione. Questi non possono essere multibuffered e non possono essere inseriti nella memoria video locale o non locale, a meno che non sia impostato il flag di DDSCAPS_WRITEONLY. I buffer dei vertici espliciti sono contrassegnati con DDSCAPS_VERTEXBUFFER.

I buffer dei comandi vengono usati da Direct3D per i comandi batch. Possono essere multibuffered e vengono usati per tutte le API, ad eccezione di TLVERTEX o di chiamate API con buffer di esecuzione senza clip. Questo tipo di buffer è contrassegnato dal flag DDSCAPS2_COMMANDBUFFER. Sono sempre in scrittura, anche se non è impostato alcun flag esplicito e non contengono istruzioni non valide.

Per impostazione predefinita, il runtime Direct3D alloca tutti questi buffer. I buffer dei vertici impliciti e i buffer dei comandi vengono accessibili attraverso le superfici con cui sono associate. Tutti i buffer vengono passati al callback D3dDrawPrimitives2 del driver.

Buffer dei vertici e dei comandi allocati dal driver

Un driver Direct3D esegue facoltativamente l'allocazione dei buffer dei vertici e dei comandi fornendo funzioni di callback. Per fornire queste funzioni di callback, il driver Direct3D compila una struttura DD_D3DBUFCALLBACKS e punta il membro lpD3DBufCallbacksdella struttura DD_HALINFO. DD_HALINFO viene restituito da DrvGetDirectDrawInfo in risposta all'inizializzazione del componente DirectDraw del driver. I callback segnalati nella struttura DD_D3DBUFCALLBACKS sono:

Queste funzioni vengono chiamate allo stesso modo dei callback DdXxxSurface (ad esempio DdCanCreateSurface) e solo quando viene impostato il flag di DDSCAPS_EXECUTEBUFFER. I flag di creazione del buffer sono DDSCAPS_WRITEONLY, DDSCAPS2_VERTEXBUFFER e DDSCAPS2_COMMANDBUFFER.

I driver determinano il tipo di buffer richiesto controllando il membro ddsCaps della struttura DD_SURFACE_LOCAL passato al callback CanCreateExecuteBuffer e CreateExecuteBuffer per i flag seguenti:

  • DDSCAPS_VERTEXBUFFER indica che il driver deve allocare un buffer di vertice esplicito.

  • DDSCAPS_COMMANDBUFFER indica che il driver deve allocare un buffer di comandi.

  • Se nessun flag è impostato, il driver deve allocare un buffer di vertice implicito.

Il driver alloca internamente i buffer e i buffer dei comandi e i cicli attraverso questi buffer. Direct3D riempie una determinata coppia mentre l'hardware esegue il rendering asincrono dagli altri buffer in coda. Questo è molto utile con l'accesso diretto alla memoria (DMA).

I buffer in un set di multibuffering possono essere in tipi di memoria diversi, ovvero nel sistema o nella memoria video. Quando il driver viene chiamato per creare il primo buffer, crea immediatamente il set e restituisce il primo buffer nel set su Direct3D. Il driver usa i flag per specificare il tipo di memoria usato per allocare ogni buffer nel set. Il driver deve restituire un nuovo buffer nella memoria di sistema per ogni chiamata a D3dDrawPrimitives2 se il flag D3DHALDP2_SWAPVERTEXBUFFER o D3DHALDP2_SWAPCOMMANDBUFFER è impostato. Se il buffer restituito è in memoria video, è necessario impostare il flag di D3DHALDP2_VIDMEMVERTEXBUF o di D3DHALDP2_VIDMEMCOMMANDBUF corrispondente.

Occasionalmente, Direct3D richiede le dimensioni minime per il buffer successivo. Se la dimensione è troppo grande, il driver deve allocare il buffer in memoria di sistema (una superficie di backup). Se la dimensione è troppo piccola, il driver è autorizzato a fornire un buffer più grande. Il driver deve tenere traccia del numero di buffer e dei tipi di memoria che sono e pulire tutto sull'uscita.