转换资源屏障
相关的概念:
- D3D12中的资源权限问题
- 图形/计算类:直接命令队列, 计算命令队列
- 复制类:复制命令队列
- 资源可以看成是一种子资源的序列,以及每份子资源关联的两份权限,(图形计算类和复制类)
- 这两种资源权限的体现:
- CPU线程执行直接命令队列/计算命令队列中的命令时访问子资源
- CPU线程执行复制命令队列中的命令时访问子资源
- 特殊情况:CPU线程访问子资源时的权限要求
D3D12中添加资源屏障命令:
- 使用 ID3D12GraphicsCommandList 接口的 ResourceBarrier方法在命令队列中添 ResourceBarrier 命令转换子资源对改命令所在的命令列表、命令队列、所属的类的权限
- 方法原型:
void STDMETHODCALLTYPE
ResourceBarrier(
UINT NumBarriers, //in
const D3D12_RESOURCE_BARRIER *pBarriers //in
);
- 以上方法的第二个参数用于描述 ResourceBarrier:
struct D3D12_RESOURCE_BARRIER
{
D3D12_RESOURCE_BARRIER_TYPE Type; //资源屏障类型
D3D12_RESOURCE_BARRIER_FLAGS Flags; //分离资源屏障
union //根据Type在下面选择对应屏障
{
D3D12_RESOURCE_TRANSITION_BARRIER Transition;
D3D12_RESOURCE_ALIASING_BARRIER Aliasing;
D3D12_RESOURCE_UAV_BARRIER UAV;
};
};
//其中 Transition 结构体如下:
struct D3D12_RESOURCE_TRANSITION_BARRIER
{
ID3D12Resource *pResource; //要转换权限的子资源所在的资源,用IDXGISwapchain::GetBuffer获取交换链头部指针
UINT Subresource; //子资源索引
D3D12_RESOURCE_STATES StateBefore; //权限的当前值,若与实际不符GPU会崩溃,因此要跟踪该值
D3D12_RESOURCE_STATES StateAfter; //转换后的值
}