在Microsoft Basic Render Driver上测试链式计算着色器的调度:为什么无人机会在调度之间发生变化?

时间:2019-03-10 18:42:53

标签: c++ compute-shader directx-12

按照标题,我要分配给一些不同的计算着色器(管道状态对象)(即,分配给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是否存在某些问题/缺失?还是这里有些明显的错误?

0 个答案:

没有答案