按照标题,我要分配给一些不同的计算着色器(管道状态对象)(即,分配给shader0,shader0向UAV填充,分配给shader1,shader1向UAV填充更多等)。
我正在使用DX11和DX12进行测试。
在我的硬件gpu上运行着色器,对于DX11和DX12来说,一切都运行正常且花哨,但是当我通过DX12上的Microsoft Basic Render Driver运行它时,会分派UAV更改的初始状态-< / p>
更具体地说,将uav中的所有uint4值设置为第一位置中包含的任何值。例如,如果在调度shader_(n)之后,存储在uav中的前12个uint为:
0x00000001 0x00000002 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b 0x0000000c
然后在开始向shader_(n + 1)分发时,前12个将是:
0x00000001 0x00000002 0x00000003 0x00000004 0x00000001 0x00000002 0x00000003 0x00000004 0x00000001 0x00000002 0x00000003 0x00000004
在通过DX11代码运行时不会发生这种情况。
所以总结一下:
DX11硬件GPU按预期工作
DX12硬件GPU可以正常工作
DX11 Microsoft Basic Render驱动程序按预期工作
DX12 Microsoft Basic Render驱动程序在调度之间对uav进行了变异
其他人是否经历过类似的行为?关于我可以尝试的事情的任何想法都可以解决这个问题?
如有必要,我可以共享一些代码;我还没有发布它,因为它要经历的工作量很大,我宁愿先缩小范围,而不是在这里倾倒一吨。
编辑:我在这里添加我怀疑是相关代码:
...
IndividualDispatch(
this->prologueState.Get(),
indexLog2);
BetweenDispatches();
IndividualDispatch(
this->coreState.Get(),
indexLog2);
...
假设这不是所有事物初始化的问题(并且它不是WARP的错误),对我来说,最有可能在下定义的IndividualDispatch或BetweenDispatches中存在问题。
void IndividualDispatch(
_In_ ID3D12PipelineState* shader,
const uint8_t indexLog2)
{
CHR(this->directCommandList->Reset(
this->directCommandAllocator.Get(),
shader));
this->directCommandList->SetComputeRootSignature(
this->rootSignature.Get());
this->directCommandList->SetComputeRootConstantBufferView(
1,
this->precomputeBuffer->GetGPUVirtualAddress());
this->directCommandList->SetComputeRootConstantBufferView(
0,
this->bufferInfoBuffer->GetGPUVirtualAddress());
this->directCommandList->SetComputeRootUnorderedAccessView(
2,
this->uavBuffer->GetGPUVirtualAddress());
this->Dc12HasherImpl::Dispatch(
this->directCommandList.Get(),
indexLog2);
}
void BetweenDispatches()
{
CHR(this->directCommandList->Close());
DC12::ExecuteCommandList(
this->directCommandQueue.Get(),
this->directCommandList.Get());
}
static inline void ExecuteCommandList(
_In_ ID3D12CommandQueue* pCommandQueue,
_In_ ID3D12CommandList* pCommandList)
{
pCommandQueue->ExecuteCommandLists(
1,
&pCommandList);
}
BetweenDispatches是否存在某些问题/缺失?还是这里有些明显的错误?