Вопрос о синхронизации 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Android Camera2: доступ CPU/GPU к данным изображения и MediaRecorder/MediaCodec в одном конвейере
    Гость » » в форуме Android
    0 Ответы
    40 Просмотры
    Последнее сообщение Гость
  • GPU в GPU прямой передачу данных с помощью ConnectX и RDMA
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как использовать тесселяцию в Directx12?
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как сделать проходы рендеринга, чтобы графика работала параллельно с использованием DirectX12 и C++?
    Anonymous » » в форуме C++
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • DirectX12 вычислить пример шейдера
    Anonymous » » в форуме C++
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

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