D3D12DDI_BARRIER_SYNC枚举 (d3d12umddi.h)

D3D12DDI_BARRIER_SYNC 值是以下字段的按位 OR,用于指定 GPU 与屏障相关的 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 范围内没有对资源进行上述障碍或访问。

D3D12DDI_BARRIER_SYNC_NONESyncAfter 值表示,在相同 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
此值是所有绘图管道阶段的伞式范围。 针对以下 GPU 工作负荷同步:

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

需要 SetGraphicsRootXxx 同步才能支持 D3D12DDI_DESCRIPTOR_RANGE_FLAG_0013_DATA_STATIC_WHILE_SET_AT_EXECUTE 描述符。

SyncBeforeD3D12DDI_BARRIER_SYNC_DRAW 指示在执行屏障之前,上述所有绘图工作都必须完成。

SyncAfterD3D12DDI_BARRIER_SYNC_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 工作负荷同步:

* Dispatch
* 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
与谓词命令同步。 别名为 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 允许拆分同步。 拆分屏障由一对屏障表示,其中初始屏障使用 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