DirectX12 - CPU&GPU Sync(Fence机制)

这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互动,知无不言:

DirectX12 Spec 总目录

1. 基本概念

  • 一个常见问题:步骤(1)CPU向GPU提交一块Resource,步骤(2)CPU命令GPU利用Resouce进行渲染。从步骤(1)到(2)之间,CPU需要确认Resource完全提交到GPU内存中,如何确保?
  • 一个可行方案:在步骤(1)(2)之间CPU插入一个同步指令,确认Resouce提交完成之后,再下发渲染指令。
  • 当CPU/GPU两种处理器并行工作时,自然而然地就会产生各种同步问题,在DirectX12中用到的是Fence机制,如果CPU想确认前面的所有Command执行完毕,就在Command后插入一个Fence,待GPU返回这个Fence,就能确认之前的所有Command执行完毕。
  • 实际上Fence在GPU Driver中就是一块存有数值的Memory,初始值为0,执行一次Fence同步就向上+1递增。CPU提交Fence之前知道Fence Value是n,GPU收到Fence后确认当前Command执行完毕,并改写Fence Value为n+1,CPU循环检测并确认Fence Value为n+1即完成Fence同步

2. Fence机制

  • 更详细的解释可以参考下图:
    DirectX12 - CPU&GPU Sync(Fence机制)_第1张图片
    1. CPU下发Comamnd1
    1. CPU插入Fence + GPU执行Command1
    1. CPU等待Fence… + GPU执行Command1
    1. GPU递增Fence(注意GPU Hardware在递增Fence前,会确认此前所有Command执行完毕)
    1. CPU确认Fence返回,继续其他Command

你可能感兴趣的:(DirextX12,图形渲染,windows,驱动开发,c++)