Выполнение и синхронизация списков команд
В Microsoft Direct3D 12 режим немедленной передачи предыдущих версий больше не существует. Вместо этого приложения создают списки команд и пакеты, а затем записывают наборы команд GPU. Очереди команд используются для отправки списков команд для выполнения. Эта модель позволяет разработчикам иметь больший контроль над эффективным использованием графического процессора (GPU) и ЦП.
- Общие сведения об очереди команд
- Инициализация очереди команд
- Выполнение команды Lists
- Доступ к ресурсам из нескольких очередей команд
- Синхронизация выполнения списка команд с помощью ограждений очереди команд
- Синхронизация ресурсов, к которым обращаются очереди команд
- Поддержка очереди команд для ресурсов с плитками
- Связанные темы
Общие сведения об очереди команд
Очереди команд Direct3D 12 заменяют синхронизацию среды выполнения и драйвера для отправки работы в немедленном режиме, ранее не доступную для разработчика, API для явного управления параллелизмом, параллелизмом и синхронизацией. Очереди команд обеспечивают следующие улучшения для разработчиков:
- Позволяет разработчикам избежать случайной неэффективности, вызванной непредвиденной синхронизацией.
- Позволяет разработчикам внедрять синхронизацию на более высоком уровне, где необходимую синхронизацию можно определить более эффективно и точно. Это означает, что среда выполнения и графический драйвер будут тратить меньше времени на проектирование параллелизма.
- Делает ресурсоемкие операции более явными.
Эти улучшения позволяют или улучшают следующие сценарии:
- Повышенный параллелизм. Приложения могут использовать более глубокие очереди для фоновых рабочих нагрузок, таких как декодирование видео, при наличии отдельных очередей для работы на переднем плане.
- Асинхронная и низкоприоритетная работа GPU. Модель очереди команд позволяет параллельно выполнять низкоприоритетные операции GPU и атомарные операции, которые позволяют одному потоку GPU использовать результаты другого несинхронизированного потока без блокировки.
- Высокоприоритетная вычислительная работа. Эта конструкция позволяет сценариям, требующим прерывания трехмерной отрисовки, выполнять небольшой объем высокоприоритетных вычислительных работ, чтобы результаты можно было получить заранее для дополнительной обработки на ЦП.
Инициализация очереди команд
Очереди команд можно создать, вызвав ID3D12Device::CreateCommandQueue. Этот метод принимает D3D12_COMMAND_LIST_TYPE , указывающий, какой тип очереди следует создать, и, следовательно, какие типы команд можно отправить в эту очередь. Помните, что пакеты можно вызывать только из списков прямых команд и не могут отправляться непосредственно в очередь. Поддерживаемые типы очередей:
Как правило, очереди и списки команд DIRECT принимают любые команды, очереди вычислений и списки команд принимают команды, связанные с вычислениями и копированием, а очереди и списки команд COPY принимают только команды копирования.
Выполнение команды Lists
После записи списка команд и получения очереди команд по умолчанию или создания новой выполните списки команд, вызвав ID3D12CommandQueue::ExecuteCommandLists.
Приложения могут отправлять списки команд в любую очередь команд из нескольких потоков. Среда выполнения будет выполнять работу по сериализации этих запросов в порядке отправки.
Среда выполнения проверит список отправленных команд и откатит вызов ExecuteCommandLists при нарушении каких-либо ограничений. Звонки будут отброшены по следующим причинам:
- Предоставленный список команд является пакетом, а не списком прямых команд.
- ID3D12GraphicsCommandList::Close не был вызван в предоставленном списке команд для завершения записи.
- ID3D12CommandAllocator::Reset был вызван для распределителя команд, связанного со списком команд, так как он был записан. Дополнительные сведения о распределителях команд см. в разделе Создание и запись списков и пакетов команд.
- Граница очереди команд указывает, что предыдущее выполнение списка команд еще не завершено. Границы командной очереди подробно рассматриваются ниже.
- Состояния до и после запросов, заданные с вызовами ID3D12GraphicsCommandList::BeginQuery и ID3D12GraphicsCommandList::EndQuery, не совпадают должным образом.
- Состояния до и после барьеров перехода ресурсов не соответствуют должным образом. Дополнительные сведения см. в разделе Использование барьеров ресурсов для синхронизации состояний ресурсов.
Доступ к ресурсам из нескольких очередей команд
Существует несколько правил, налагаемых средой выполнения, которые ограничивают доступ к ресурсам из нескольких очередей команд. Ниже приведены эти правила.
Ресурс не может быть записан из нескольких очередей команд одновременно. Когда ресурс переключился в доступное для записи состояние в очереди, он считается исключительно принадлежащим этой очереди и должен перейти в состояние чтения или ОБЩЕЕ (см . D3D12_RESOURCE_STATES), прежде чем к нему сможет получить доступ из другой очереди.
В состоянии чтения ресурс может считываться из нескольких очередей команд одновременно, в том числе из разных процессов, в зависимости от его состояния чтения.
Дополнительные сведения об ограничениях доступа к ресурсам и использовании барьеров ресурсов для синхронизации доступа к ресурсам см. в разделе Использование барьеров ресурсов для синхронизации состояний ресурсов.
Синхронизация выполнения списка команд с помощью ограждений очереди команд
Поддержка нескольких параллельных очередей команд в Direct3D 12 обеспечивает большую гибкость и контроль над определением приоритетов асинхронной работы в GPU. Такая конструкция также означает, что приложения должны явно управлять синхронизацией работы, особенно если списки команд в одной очереди зависят от ресурсов, с которыми управляет другая очередь команд. Некоторые примеры этого включают ожидание завершения операции в очереди вычислений, чтобы можно было использовать результат для операции отрисовки в очереди трехмерных данных, и ожидание завершения трехмерной операции, чтобы операция в очереди вычислений пользовалась доступом к ресурсу для записи. Чтобы обеспечить синхронизацию работы между очередями, Direct3D 12 использует концепцию ограждений, которые представлены в API интерфейсом ID3D12Fence .
Ограждение — это целое число, представляющее текущую единицу обрабатываемой работы. Когда приложение перемещает ограждение, вызывая ID3D12CommandQueue::Signal, целое число обновляется. Приложения могут проверка значение ограждения и определить, завершена ли единица работы, чтобы решить, можно ли запустить последующую операцию.
Синхронизация ресурсов, к которым обращаются очереди команд
В Direct3D 12 синхронизация состояния некоторых ресурсов реализуется с помощью барьеров ресурсов. На каждом ресурсном барьере приложение объявляет состояния до и после ресурса. Распространенным примером является переход ресурса из представления ресурсов шейдера в целевое представление отрисовки. По большей части эти барьеры ресурсов управляются в списках команд. Если уровни отладки включены, система обеспечивает соответствие состояний до и после всех ресурсов, гарантируя, что ресурс находится в правильном состоянии для конкретной операции при переходе барьера.
Дополнительные сведения о синхронизации состояния ресурсов см. в разделе Использование барьеров ресурсов для синхронизации состояний ресурсов.
Поддержка очереди команд для ресурсов с плитками
Методы управления мозаичными ресурсами, которые были предоставлены через интерфейс ID3D11DeviceContext2 в Direct3D 11, предоставляются интерфейсом ID3D12CommandQueue в Direct3D 12. Эти способы включают перечисленные ниже.
Метод | Описание |
---|---|
CopyTileMappings | Копирует сопоставления из исходного мозаичного ресурса в целевой ресурс с плиткой. |
UpdateTileMappings | Обновления сопоставления расположений плиток в мозаичного ресурсах с расположениями памяти в куче ресурсов. |
Дополнительные сведения об использовании мозаичного ресурса в приложениях Direct3D 12 см. в разделе Ресурсы с плитками Direct3D11.