У меня есть постоянный буфер, созданный с начальным состоянием 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));