Распад состояния ресурса Direct3D12 - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть постоянный буфер, созданный с начальным состоянием D3D12_RESOURCE_STATE_COPY_DEST.Я обнаружил, что когда я использую постоянный буфер, мне никогда не нужно отслеживать состояние ресурса, и достаточно следующего кода:

list->Reset(...);

UpdateSubresources<1>(list, constantBuffer, uploadConstantBuffer, 0, 0, 1, &constantBufferData);
list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(constantBuffer, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER));

list->Close();
queue->ExecuteCommandLists(...);

Похоже, что состояние постоянного буфера уменьшается до D3D12_RESOURCE_STATE_COPY_DEST,, что противоречит тому, что MSDN говорит (что это происходит только в том случае, если ваше начальное состояние было D3D12_RESOURCE_STATE_COMMON):

Распад состояния на общее

Обратной стороной продвижения общего государства является упадок обратно к D3D12_RESOURCE_STATE_COMMON.Ресурсы, отвечающие определенным требованиям, считаются не имеющими состояния и эффективно возвращаются в общее состояние, когда графический процессор завершает выполнение операции ExecuteCommandLists.Распад не происходит между списками команд, выполняемыми вместе в одном и том же вызове ExecuteCommandLists.

Следующие ресурсы будут затухать при завершении операции ExecuteCommandLists на GPU:

  • Доступ к ресурсамв очереди копирования, или
  • Буферные ресурсы в любом типе очереди, или
  • Ресурсы текстуры в любом типе очереди с установленным флагом D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS, или
  • Любой ресурснеявно повышен до состояния только для чтения.

Почему я вижу это поведение? Образец, который я использовал, использует то же поведение для буфера вершин :

ThrowIfFailed(m_device->CreateCommittedResource(
        &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
        D3D12_HEAP_FLAG_NONE,
        &CD3DX12_RESOURCE_DESC::Buffer(vertexBufferSize),
        D3D12_RESOURCE_STATE_COPY_DEST,
        nullptr,
        IID_PPV_ARGS(&m_vertexBuffer)));

...

UpdateSubresources<1>(m_commandList.Get(), m_vertexBuffer.Get(), vertexBufferUpload.Get(), 0, 0, 1, &vertexData);
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_vertexBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER));
...