Direct3D 12——学习——初始化D3D——创建围栏CreateFence

ThrowIfFailed(md3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE,
		IID_PPV_ARGS(&mFence)));
参数 D3D12_FENCE_FLAGS	
	 D3D12_FENCE_FLAG_NONE = 0, 未指定任何选项
     D3D12_FENCE_FLAG_SHARED = 0x1,围栏是共享的
	 D3D12_FENCE_FLAG_SHARED_CROSS_ADAPTER = 0x2,围栏与其他 GPU 适配器共享
	 D3D12_FENCE_FLAG_NON_MONITORED = 0x4 围栏是非监视类型。 仅当适配器不支持受监视的围栏或与不支持受监视围栏的适配器共享围栏时,才应使用非受监视围栏

围栏是为了CPU和GPU间的同步做准备的
Fence对应的接口就是ID3D12Fence了,可以利用ID3D12Device::CreateFence创建这个接口, 具体代码就不累述了, 很简单.
这个Fence是以帧为单位的, 可以等待所有针对这一帧的命令.利用ID3D12Fence::SetEventOnCompletion和ID3D12CommandQueue::Signal进行信号操作, 完了之后等待即可, 以帧为单位。
不过还有个ID3D12Fence::Signal, 看来有可能ID3D12CommandQueue::Signal会调用这个方法, 否则这个Fence没有能与命令绑定的方法.

/*流程
Fence->SetEventOnCompletion
执行命令
提交呈现
Queue->Signal 设置信号
wait 等待GPU渲染
*/

书本例子:
假设有一资源R,里面存有待绘制集合体的位置信息,现在,令CPU对R中的数据进行更新,先把R中的几何体位置信息改为P1,再向命令队列里添加绘制资源R的命令C,以此将几何体绘制到位置P1。由于向命令队列添加命令并不会阻塞CPU,所以CPU会继续执行后序指令。在CPU执行绘制命令C之前,如果CPU复写了数据R,提前把其中的位置信息修改为P2,那么这个行为就会造成严重的错误。
解决此问题的一种办法是:强制CPU等待,直达GPU完成所有命令的处理,达到某个指定的围栏点为止。我们将这种方法称为刷新命令队列,可以通过围栏来实现这一点。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值