Windows 图形显示驱动开发-WDDM 3.0功能- D3D12 增强型屏障(三)

发布于:2025-03-18 ⋅ 阅读:(20) ⋅ 点赞:(0)

计算队列和直接队列布局

  • 以下增强型屏障布局保证对直接队列和计算队列都是相同的:D3D12DDI_BARRIER_LAYOUT_GENERIC_READ
  • D3D12DDI_BARRIER_LAYOUT_UNORDERED_ACCESS
  • D3D12DDI_BARRIER_LAYOUT_SHADER_RESOURCE
  • D3D12DDI_BARRIER_LAYOUT_COPY_SOURCE
  • D3D12DDI_BARRIER_LAYOUT_COPY_DEST

其中一个布局中的子资源可以在不进行布局转换的情况下用于直接队列或计算队列。

在某些硬件上,如果前一个或后一个访问也在直接队列上,则直接队列上的布局转换障碍可能会快得多。 强烈建议使用以下布局访问直接队列上的资源:

  • D3D12DDI_BARRIER_LAYOUT_DIRECT_QUEUE_GENERIC_READ
  • D3D12DDI_BARRIER_LAYOUT_DIRECT_QUEUE_UNORDERED_ACCESS
  • D3D12DDI_BARRIER_LAYOUT_DIRECT_QUEUE_SHADER_RESOURCE
  • D3D12DDI_BARRIER_LAYOUT_DIRECT_QUEUE_COPY_SOURCE
  • D3D12DDI_BARRIER_LAYOUT_DIRECT_QUEUE_COPY_DEST

DIRECT_QUEUE 布局变体与计算队列不兼容,不能在计算命令列表屏障中使用。 然而,它们与直接队列中的计算操作兼容。

无屏障访问

由于 ExecuteCommandLists 边界之间不得有挂起的命令或缓存刷新操作,因此缓冲区最初可以在没有屏障的情况下在 ExecuteCommandLists 范围内访问。 同样,在以下条件下,纹理子资源最初也可以在没有屏障的情况下访问:

  • 子资源布局与访问类型兼容。
  • 初始化任何必要的压缩元数据。

布局 D3D12DDI_BARRIER_LAYOUT_COMMON 中的纹理子资源(或特定于队列的常见布局,如 D3D12DDI_BARRIER_LAYOUT_DIRECT_QUEUE_COMMON)没有可能未完成的读取或写入操作,可以在 ExecuteCommandLists 命令流中访问,而不需要使用以下任何访问类型的屏障:

  • D3D12DDI_BARRIER_ACCESS_SHADER_RESOURCE
  • D3D12DDI_BARRIER_ACCESS_COPY_SOURCE
  • D3D12DDI_BARRIER_ACCESS_COPY_DEST

此外,使用特定于队列的通用布局的缓冲区或纹理可以在没有屏障的情况下使用 D3D12DDI_BARRIER_ACCESS_UNORDERED_ACCESS。

缓冲区和同时访问纹理,使用 D3D12DDI_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS 标志创建的纹理,最初可以在 ExecuteCommandLists 命令流中使用以下任何访问类型进行访问,而不会设置屏障:

  • D3D12DDI_BARRIER_ACCESS_VERTEX_BUFFER
  • D3D12DDI_BARRIER_ACCESS_CONSTANT_BUFFER
  • D3D12DDI_BARRIER_ACCESS_INDEX_BUFFER
  • D3D12DDI_BARRIER_ACCESS_RENDER_TARGET
  • D3D12DDI_BARRIER_ACCESS_UNORDERED_ACCESS
  • D3D12DDI_BARRIER_ACCESS_SHADER_RESOURCE
  • D3D12DDI_BARRIER_ACCESS_STREAM_OUTPUT
  • D3D12DDI_BARRIER_ACCESS_INDIRECT_ARGUMENT
  • D3D12DDI_BARRIER_ACCESS_COPY_DEST
  • D3D12DDI_BARRIER_ACCESS_COPY_SOURCE
  • D3D12DDI_BARRIER_ACCESS_RESOLVE_DEST
  • D3D12DDI_BARRIER_ACCESS_RESOLVE_SOURCE
  • D3D12DDI_BARRIER_ACCESS_PREDICATION

后续访问也可以在没有屏障的情况下进行,写入访问类型不超过一种。 但是,除了 D3D12DDI_BARRIER_ACCESS_RENDER_TARGET 之外,必须使用屏障来刷新对同一资源的顺序写入。

自资源复制

虽然不完全与增强型屏障有关,但允许从子资源的一个区域复制到另一个非交互区域的能力是一个非常需要的功能。 通过增强型屏障,具有通用布局的子资源可以在同一个 CopyBufferRegion 或 CopyTextureRegion 调用中用作源和目标。 在交叉的源和目标内存区域之间进行复制会产生未定义的结果。 调试层必须根据这些结果进行验证。 (旧资源屏障设计不允许子资源同时处于 D3D12DDI_RESOURCE_STATE_COPY_SOURCE 和 D3D12DDI_RESOURCE_STATE_COPY_DEST 状态,因此无法复制到自身。)

放置资源元数据初始化

旧资源屏障设计需要“清除”、“复制”或“丢弃”,来初始化新放置和激活的别名纹理资源,然后才能用作呈现目标或深度模具资源。 此要求是因为呈现目标和深度模具资源通常使用必须初始化的压缩元数据才能使数据有效。 对于具有新更新的磁贴映射的保留纹理也是如此。

增强型屏障支持将“丢弃”选项作为屏障的一部分。 当 D3D12DDI_TEXTURE_BARRIER::Flags 成员中存在 D3D12DDI_TEXTURE_BARRIER_FLAG_DISCARD 时,屏障布局从 D3D12DDI_BARRIER_LAYOUT_UNDEFINED 转换到任何潜在的压缩布局(例如,D3D12DDI_BARRIER_LAYOUT_RENDER_TARGET、D3D12DDI_BARRIER_LAYOUT_DEPTH_STENCIL、D3D12DDI_BARRIER_LAYOUT_UNORDERED_ACCESS)必须初始化压缩元数据。

除了呈现目标和深度/模具资源之外,还有旧屏障模型不支持的类似 UAV 纹理压缩优化。

屏障排序

屏障按正向顺序排列(API 调用顺序、屏障组索引、屏障阵列索引)。 同一子资源上的多个屏障必须按排队顺序完成。

具有匹配的 SyncAfter 范围的排队屏障(可能写入同一内存)必须按排队顺序完成所有写入。 此要求避免了支持资源别名的屏障上的数据争用。 例如,停用资源的屏障必须在激活同一内存中其他资源的另一个屏障之前刷新任何缓存,从而可能清除元数据


网站公告

今日签到

点亮在社区的每一天
去签到