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