共用方式為


D3D12DDI_BARRIER_SYNC列舉 (d3d12umddi.h)

D3D12DDI_BARRIER_SYNC 值是下列欄位的位 OR,可指定 GPU 工作相對於屏障的同步處理範圍。

語法

typedef enum D3D12DDI_BARRIER_SYNC {
  D3D12DDI_BARRIER_SYNC_NONE = 0x0,
  D3D12DDI_BARRIER_SYNC_ALL = 0x1,
  D3D12DDI_BARRIER_SYNC_DRAW = 0x2,
  D3D12DDI_BARRIER_SYNC_INPUT_ASSEMBLER = 0x4,
  D3D12DDI_BARRIER_SYNC_INDEX_INPUT = 0x4,
  D3D12DDI_BARRIER_SYNC_VERTEX_SHADING = 0x8,
  D3D12DDI_BARRIER_SYNC_PIXEL_SHADING = 0x10,
  D3D12DDI_BARRIER_SYNC_DEPTH_STENCIL = 0x20,
  D3D12DDI_BARRIER_SYNC_RENDER_TARGET = 0x40,
  D3D12DDI_BARRIER_SYNC_COMPUTE_SHADING = 0x80,
  D3D12DDI_BARRIER_SYNC_RAYTRACING = 0x100,
  D3D12DDI_BARRIER_SYNC_COPY = 0x200,
  D3D12DDI_BARRIER_SYNC_RESOLVE = 0x400,
  D3D12DDI_BARRIER_SYNC_EXECUTE_INDIRECT = 0x800,
  D3D12DDI_BARRIER_SYNC_PREDICATION = 0x800,
  D3D12DDI_BARRIER_SYNC_ALL_SHADING = 0x1000,
  D3D12DDI_BARRIER_SYNC_NON_PIXEL_SHADING = 0x2000,
  D3D12DDI_BARRIER_SYNC_EMIT_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO = 0x4000,
  D3D12DDI_BARRIER_SYNC_CLEAR_UNORDERED_ACCESS_VIEW = 0x8000,
  D3D12DDI_BARRIER_SYNC_VIDEO_DECODE = 0x100000,
  D3D12DDI_BARRIER_SYNC_VIDEO_PROCESS = 0x200000,
  D3D12DDI_BARRIER_SYNC_VIDEO_ENCODE = 0x400000,
  D3D12DDI_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE = 0x800000,
  D3D12DDI_BARRIER_SYNC_COPY_RAYTRACING_ACCELERATION_STRUCTURE = 0x1000000,
  D3D12DDI_BARRIER_SYNC_SPLIT = 0x80000000
} ;

常數

 
D3D12DDI_BARRIER_SYNC_NONE
值:0x0
屏障之前或之後不需要同步處理。 使用時,D3D12DDI_BARRIER_SYNC_NONE 必須是唯一的位集。

SyncBeforeD3D12DDI_BARRIER_SYNC_NONE 表示在相同 ExecuteCommandLists 範圍內沒有對資源進行上述障礙或存取。

SyncAfterD3D12DDI_BARRIER_SYNC_NONE 表示在相同 ExecuteCommandLists 範圍中的屏障之後,不會存取對應的子資源。

在這兩種情況下,AccessAfter 必須 D3D12DDI_BARRIER_ACCESS_NO_ACCESS
D3D12DDI_BARRIER_SYNC_ALL
值:0x1
SyncBeforeD3D12DDI_BARRIER_SYNC_ALL 表示必須先完成上述所有工作,才能執行屏障。

SyncAfterD3D12DDI_BARRIER_SYNC_ALL 表示所有後續工作都必須等候屏障完成。
D3D12DDI_BARRIER_SYNC_DRAW
值:0x2
此值是所有 Draw 管線階段的傘式範圍。 針對下列 GPU 工作負載進行同步處理:

* DrawInstanced
* DrawIndexedInstanced
* SetGraphicsRootDescriptorTable
* SetGraphicsRootShaderResource
* SetGraphicsRootUnorderedAccessView
* SetGraphicsRootConstantBufferView

需要 SetGraphicsRootXxx 同步處理,才能支援 D3D12DDI_DESCRIPTOR_RANGE_FLAG_0013_DATA_STATIC_WHILE_SET_AT_EXECUTE 描述元。

SyncBeforeD3D12DDI_BARRIER_SYNC_DRAW 表示所有先前的 Draw 工作都必須完成,才能執行屏障。

SyncAfterD3D12DDI_BARRIER_SYNC_DRAW 表示所有後續的 Draw 工作都必須等候屏障完成。
D3D12DDI_BARRIER_SYNC_INPUT_ASSEMBLER
值:0x4
針對輸入組合器階段執行進行同步處理。
D3D12DDI_BARRIER_SYNC_INDEX_INPUT
值:0x4
對應至D3D12DDI_BARRIER_SYNC_INPUT_ASSEMBLER。
D3D12DDI_BARRIER_SYNC_VERTEX_SHADING
值:0x8
針對所有頂點底紋階段進行同步處理,包括頂點、網域、船體、鑲嵌、幾何、放大和網格底紋。
D3D12DDI_BARRIER_SYNC_PIXEL_SHADING
值:0x10
針對圖元著色器執行進行同步處理。
D3D12DDI_BARRIER_SYNC_DEPTH_STENCIL
值:0x20
針對深度/樣板讀取/寫入作業進行同步處理。 這包括 Draw* 和 ClearRenderTargetView 期間的深度樣板檢視 (DSV) 存取。
D3D12DDI_BARRIER_SYNC_RENDER_TARGET
值:0x40
針對轉譯目標讀取/寫入作業進行同步處理。 這包括 Draw* 和 ClearRenderTargetView 期間的轉譯目標檢視 (RTV) 寫入。
D3D12DDI_BARRIER_SYNC_COMPUTE_SHADING
值:0x80
針對下列 GPU 工作負載進行同步處理:

* 分派
* SetComputeRootDescriptorTable
* SetComputeRootShaderResource
* SetComputeRootUnorderedAccessView
* SetComputeRootConstantBufferView

需要 SetComputeRootXxx 同步處理,才能支援 D3D12DDI_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTION 描述元。
D3D12DDI_BARRIER_SYNC_RAYTRACING
值:0x100
針對光追蹤執行進行同步處理。
D3D12DDI_BARRIER_SYNC_COPY
值:0x200
針對複製命令進行同步處理。
D3D12DDI_BARRIER_SYNC_RESOLVE
值:0x400
針對 Resolve 命令進行同步處理。
D3D12DDI_BARRIER_SYNC_EXECUTE_INDIRECT
值:0x800
針對 ExecuteIndirect 執行進行同步處理。
D3D12DDI_BARRIER_SYNC_PREDICATION
值:0x800
針對 Predication 命令進行同步處理。 使用 D3D12DDI_BARRIER_SYNC_EXECUTE_INDIRECT*的別名。
D3D12DDI_BARRIER_SYNC_ALL_SHADING
值:0x1000
針對所有著色器執行進行同步處理。
D3D12DDI_BARRIER_SYNC_NON_PIXEL_SHADING
值:0x2000
針對著色器執行進行同步處理,但圖元底紋除外。 存在以與舊版 ResourceBarrier API 相容。
D3D12DDI_BARRIER_SYNC_EMIT_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO
值:0x4000
針對 PFND3D12DDI_EMIT_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_0054 工作進行同步處理。
D3D12DDI_BARRIER_SYNC_CLEAR_UNORDERED_ACCESS_VIEW
值:0x8000
針對執行同步處理至UAV。
D3D12DDI_BARRIER_SYNC_VIDEO_DECODE
值:0x100000
針對視訊譯碼執行進行同步處理。
D3D12DDI_BARRIER_SYNC_VIDEO_PROCESS
值:0x200000
針對視訊進程執行進行同步處理。
D3D12DDI_BARRIER_SYNC_VIDEO_ENCODE
值:0x400000
針對視訊編碼執行進行同步處理。
D3D12DDI_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE
值:0x800000
針對 PFND3D12DDI_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_0054 工作進行同步處理。

AccessBefore 或 AccessAfter 欄位的對應 屏障必須設定 D3D12DDI_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE 位。
D3D12DDI_BARRIER_SYNC_COPY_RAYTRACING_ACCELERATION_STRUCTURE
值:0x1000000
針對 PFND3D12DDI_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_0054 工作進行同步處理。

AccessBefore 或 AccessAfter 欄位的對應 屏障必須設定 D3D12DDI_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE 位。
D3D12DDI_BARRIER_SYNC_SPLIT
值:0x80000000
特殊同步位,表示分割屏障。 用來做為 SyncAfter 值,表示分割屏障的開頭。 應用程式必須提供相符的屏障,且 SyncBefore 設定為 D3D12DDI_BARRIER_SYNC_SPLIT。 請參閱。

言論

分割屏障是驅動程式的提示,指出狀態轉換必須在命令數據流中的兩個點之間發生,甚至跨越ExecuteCommandLists界限。 驅動程式可以完成所需的配置轉換,並在分割屏障的開始和結尾之間隨時快取排清。

增強的屏障 API 允許 SPLIT 同步處理。 分割屏障是由一組障礙來表示,其中初始屏障使用 D3D12DDI_BARRIER_SYNC_SPLITSyncAfter 值,而最終屏障則使用 D3D12DDI_BARRIER_SYNC_SPLITSyncBefore 值。

分割屏障組必須使用相同的 LayoutBeforeLayoutAfterAccessBefore,以及 AccessAfter 初始和最終障礙的值。 分割屏障組必須是循序的,且相同資源上沒有其他介入障礙。 下列代碼段是應用層級範例。

// BEGIN split from compute shader UAV to pixel shader SRV
splitBarrierBegin.SyncBefore = D3D12_BARRIER_SYNC_COMPUTE
splitBarrierBegin.SyncAfter = D3D12_BARRIER_SYNC_SPLIT
splitBarrierBegin.AccessBefore = D3D12_BARRIER_ACCESS_UNORDERED_ACCESS
splitBarrierBegin.AccessAfter = D3D12_BARRIER_ACCESS_DIRECT_QUEUE_SHADER_RESOURCE
splitBarrierBegin.LayoutBefore = D3D12_BARRIER_LAYOUT_UNORDERED_ACCESS
splitBarrierBegin.LayoutAfter = D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_SHADER_RESOURCE

// END split from compute shader UAV to pixel shader SRV
splitBarrierEnd.SyncBefore = D3D12_BARRIER_SYNC_SPLIT
splitBarrierEnd.SyncAfter = D3D12_BARRIER_SYNC_PIXEL_SHADING
splitBarrierEnd.AccessBefore = D3D12_BARRIER_ACCESS_UNORDERED_ACCESS
splitBarrierEnd.AccessAfter = D3D12_BARRIER_ACCESS_DIRECT_QUEUE_SHADER_RESOURCE
splitBarrierEnd.LayoutBefore = D3D12_BARRIER_LAYOUT_UNORDERED_ACCESS
splitBarrierEnd.LayoutAfter = D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_SHADER_RESOURCE

允許跨 ExecuteCommandLists 界限分割屏障。 在此情況下,會有效忽略所有 AccessBeforeAccessAfter 值,因為 ExecuteCommandLists 界限會處理任何快取排清。 基本上,跨 ExecuteCommandLists 分割屏障是僅限版面配置屏障。 因此,跨 ExecuteCommandLists 界限分割緩衝區屏障或同時存取紋理屏障無目的。 指定 ExecuteCommandLists 範圍中緩衝區或同時存取紋理的不相符 BEGIN 或 END 分割屏障實際上未使用,而且偵錯層會產生警告。

要求

要求 價值
最低支援的用戶端 Windows 11 (WDDM 3.0)
標頭 d3d12umddi.h

另請參閱

D3D12DDI_BARRIER_ACCESS

D3D12DDI_BUFFER_BARRIER_0088

D3D12DDI_GLOBAL_BARRIER_0088

D3D12DDI_RANGED_BARRIER_0088

D3D12DDI_TEXTURE_BARRIER_0088