Вопрос о синхронизации CPU/GPU DirectX12C++

Программы на C++. Форум разработчиков
Anonymous
Вопрос о синхронизации CPU/GPU DirectX12

Сообщение Anonymous »

Я пытаюсь понять синхронизацию CPU/GPU в DirectX 12, но кое-что меня смущает. Вот пример кода из примера HelloFrameBuffering от Microsoft:

Код: Выделить всё

// Prepare to render the next frame.
void D3D12HelloFrameBuffering::MoveToNextFrame()
{
// Schedule a Signal command in the queue.
const UINT64 currentFenceValue = m_fenceValues[m_frameIndex];
ThrowIfFailed(m_commandQueue->Signal(m_fence.Get(), currentFenceValue));

// Update the frame index.
m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();

// If the next frame is not ready to be rendered yet, wait until it is ready.
if (m_fence->GetCompletedValue() < m_fenceValues[m_frameIndex])
{
ThrowIfFailed(m_fence->SetEventOnCompletion(m_fenceValues[m_frameIndex], m_fenceEvent));
WaitForSingleObjectEx(m_fenceEvent, INFINITE, FALSE);
}

// Set the fence value for the next frame.
m_fenceValues[m_frameIndex] = currentFenceValue + 1;
}
Мой вопрос: почему мы обновляем m_frameIndex перед проверкой, достигла ли граница ожидаемого значения границы? Это означает, что мы используем значение ограничения другого фреймбуфера, которое отличается от того значения, которое мы использовали в вызове Signal(). Мне это кажется немного странным.
Я также проверил пример кода Nvidia, и вот их версия:

Код: Выделить всё

struct FrameContext
{
ComPtr m_allocator;
ComPtr m_computeAllocator;
ComPtr            m_fence;
uint64_t                       m_fenceValue = 0;
};

void DeviceResources::MoveToNextFrame()
{
FrameContext* ctx = &m_frameContext[m_frameIndex];
DX::ThrowIfFailed(m_commandQueue->Signal(ctx->m_fence.Get(), ctx->m_fenceValue));
m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();
if (ctx->m_fence->GetCompletedValue() < ctx->m_fenceValue)
{
DX::ThrowIfFailed(ctx->m_fence->SetEventOnCompletion(ctx->m_fenceValue, m_fenceEvent.Get()));
WaitForSingleObjectEx(m_fenceEvent.Get(), INFINITE, false);
}
ctx->m_fenceValue++;
}
Как мы видим, они используют одно и то же значение ограничения для вызова Signal() и для сравнения с GetCompletedValue(). Может ли кто-нибудь помочь мне понять плюсы и минусы этих двух подходов?
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/787 ... n-question

Вернуться в «C++»