命令和頂點緩衝區配置
Direct3D 中使用的緩衝區類型有三種:
隱含頂點緩衝區,僅供內部使用;也就是說,應用程式並不知道它們。 在建立內容之後,一律會建立一個隱含頂點緩衝區,而且 Direct3D 會將頂點資料儲存在其中。
明確的頂點緩衝區,只會在回應應用程式要求時建立。 然後 Direct3D 會將頂點資料儲存在明確的頂點緩衝區中。
僅供內部使用的命令緩衝區:也就是說,應用程式不會察覺到命令緩衝區。 Direct3D 將命令資料儲存在命令緩衝區中。
隱含頂點緩衝區是 Direct3D 為了批次處理而在內部使用的特殊頂點緩衝區。 它們是在裝置初始化期間建立的,而且可以 multibuffered。 它們一律為讀取/寫入,因此不應該放在 Microsoft DirectX 6.0 和更新版本) 的視訊記憶體 (中。 這種類型的緩衝區是因為缺少 DDSCAPS2_VERTEXBUFFER 和 DDSCAPS2_COMMANDBUFFER 旗標所標示。
明確的頂點緩衝區是由應用程式建立及控制。 除非已設定 DDSCAPS_WRITEONLY 旗標,否則無法 multibuffered,也無法放入本機或非本機的視頻記憶體。 明確的頂點緩衝區會以 DDSCAPS_VERTEXBUFFER 標示。
Direct3D 會使用命令緩衝區來批次處理命令。 您可以 multibuffered 這些應用程式,並將其用於所有 Api,但 TLVERTEX 或裁剪的執行緩衝區 API 呼叫除外。 這種類型的緩衝區是由旗標 DDSCAPS2_COMMANDBUFFER 標記。 雖然不會設定明確旗標,而且永遠不會包含不正確指令,但它們一律為僅限寫入。
根據預設,Direct3D runtime 會配置這些緩衝區。 隱含頂點緩衝區和命令緩衝區可透過與其相關聯的介面進行存取。 所有緩衝區都會傳遞至驅動程式的 D3dDrawPrimitives2 回呼。
驅動程式配置的頂點和命令緩衝區
Direct3D 驅動程式會選擇性地藉由提供回呼函數來執行頂點和命令緩衝區的配置。 為了提供這些回呼函式,Direct3D 驅動程式會填滿DD_D3DBUFCALLBACKS結構,並將DD_HALINFO結構的lpD3DBufCallbacks成員指向該結構。 DrvGetDirectDrawInfo會傳回 DD_HALINFO,以回應驅動程式之 DirectDraw 元件的初始化。 DD_D3DBUFCALLBACKS 結構中報告的回呼如下:
這些函式的呼叫方式與 DdXxxSurface 回呼相同 (例如 DdCanCreateSurface) ,而且只有在設定 DDSCAPS_EXECUTEBUFFER 旗標時。 緩衝區建立旗標為 DDSCAPS_WRITEONLY、DDSCAPS2_VERTEXBUFFER 和 DDSCAPS2_COMMANDBUFFER。
驅動程式會針對下列旗標檢查傳遞給CanCreateExecuteBuffer和CreateExecuteBuffer回呼的DD_SURFACE_LOCAL結構的ddsCaps成員,以決定所要求的緩衝區類型:
DDSCAPS_VERTEXBUFFER 指出驅動程式應配置明確的頂點緩衝區。
DDSCAPS_COMMANDBUFFER 指出驅動程式應該配置命令緩衝區。
如果未設定任何旗標,驅動程式應配置隱含的頂點緩衝區。
驅動程式會在內部配置頂點和命令緩衝區,並迴圈執行這些緩衝區。 當硬體以非同步方式從其他已佇列的緩衝區轉譯時,Direct3D 會填滿指定的配對。 這非常適合 (DMA) 的直接記憶體存取。
Multibuffering 集內的緩衝區可以位於不同的記憶體類型,也就是在系統或視訊記憶體中。 當呼叫驅動程式以建立第一個緩衝區時,它會立即建立集合,並將集合中的第一個緩衝區傳回至 Direct3D。 驅動程式會使用旗標來指定用來在集合中配置每個緩衝區的記憶體類型。 如果設定了 D3DHALDP2_SWAPVERTEXBUFFER 或 D3DHALDP2_SWAPCOMMANDBUFFER 旗標,驅動程式應該會針對每次呼叫 D3dDrawPrimitives2 時,傳回系統記憶體中的新緩衝區。 如果傳回的緩衝區在視訊記憶體中,則應該設定對應的 D3DHALDP2_VIDMEMVERTEXBUF 或 D3DHALDP2_VIDMEMCOMMANDBUF 旗標。
有時候,Direct3D 會要求下一個緩衝區的最小值。 如果大小過大,驅動程式應該在系統記憶體 () 的支援介面中配置緩衝區。 如果大小太小,則允許驅動程式提供較大的緩衝區。 驅動程式應該追蹤有多少緩衝區和記憶體類型,並在結束時清除所有專案。