В DX12 какие гарантии заказа предоставляют несколько вызовов ExecuteCommandLists? - PullRequest
0 голосов
/ 18 сентября 2018

Предполагается однопоточное приложение.Если вы звоните ExecuteCommandLists дважды ( A и B ).Гарантируется ли A выполнение всех его команд на графическом процессоре перед запуском любой из команд с B ?Самая близкая вещь, которую я могу найти в документации, это то, что, на самом деле, она не гарантирует, что A завершится до B запуска:

Приложения могутотправить списки команд в любую очередь команд из нескольких потоков.Среда выполнения будет выполнять сериализацию этих запросов в порядке их отправки.

Для сравнения я знаю, что это явно не гарантировано в Vulkan:

vkQueueSubmit - это команда отправки в очередь, причем каждый пакет определяется элементом pSubmits в качестве экземпляра структуры VkSubmitInfo.Пакеты начинают выполнение в том порядке, в каком они отображаются в pSubmits, , но могут завершаться не по порядку.

Однако я не уверен, что DX12 работает так же.

Книга Фрэнка Луны говорит:

Списки команд выполняются в порядке, начиная с первого элемента массива

Однако в этом контексте онговорить о вызове ExecuteCommandLists один раз с двумя списками команд ( C и D ).Они работают так же, как два отдельных вызова?Мой коллега утверждает, что это все еще только гарантирует, что они запускаются по порядку, а не что C заканчивается до D .

Есть ли где-нибудь более ясная документация, где яотсутствует

1 Ответ

0 голосов
/ 19 сентября 2018

Я задавал тот же вопрос на форумах Direct X, вот ответ инженера Microsoft Джесси Натали:

Двойной вызов ExecuteCommandLists гарантирует завершение первой рабочей нагрузки (A) до второй рабочей нагрузки (B)).Вызов ExecuteCommandLists с двумя списками команд позволяет драйверу объединить два списка команд так, что второй список команд (D) может начать выполнение работы до того, как завершится вся работа с первым (C).

В частности, приложениеразрешено вставлять сигнал ограждения или ждать между A и B, и водитель не может видеть это, поэтому водитель должен убедиться, что все в A завершено до операции ограждения.В одном вызове API такой возможности нет, поэтому драйвер может оптимизировать этот сценарий.

Источник: http://forums.directxtech.com/index.php?topic=5975.0

...