Тестирование распределенных шейдерных вычислений в Microsoft Basic Render Driver: почему БПЛА может изменяться между отправками? - PullRequest
0 голосов
/ 10 марта 2019

В соответствии с заголовком, у меня есть несколько различных вычислительных шейдеров (объектов состояния конвейера), которые я отправляю (т.е. отправка в shader0, shader0 делает вещи в uav, отправка в shader1, shader1 делает больше вещей в uav и т. д.).

Я тестирую это, используя DX11 и DX12.

При запуске шейдеров на моем аппаратном графическом процессоре все работает нормально и прекрасно, как и ожидалось для DX11 и DX12, но когда я запускаю его через драйвер Microsoft Basic Render Driver на DX12, при отправке отправляется начальное состояние изменений БПЛА -

более конкретно, все значения uint4 в uav установлены на то, что содержится в первой позиции. Например, если после отправки shader_ (n), первые 12 uints, сохраненные в uav, будут:

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 работает как положено

Аппаратный графический процессор DX12 работает как положено

Драйвер 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? Или здесь что-то явно не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...