Поделиться через


Предикация

Предикация — это функция, которая позволяет GPU, а не ЦП определять, не рисовать, копировать или отправлять объект.

Обзор

Типичное использование предикаций с окклюзией; Если ограничивающий прямоугольник рисуется и является окклудированным, очевидно, нет смысла в рисовании самого объекта. В этой ситуации рисунок объекта может быть "предикатирован", что позволяет удалить его из фактической отрисовки GPU.

Сначала это может показаться избыточным над и выше стандартного теста глубины плюс ранний проход глубины. Но предикация может удалить издержки самого состояния команды рисования, а также растеризацию. Хотя ранний проход глубины удаляет ненужные пиксели, он по-прежнему может выполнять вершины, корпус, домен и геометрические шейдеры, а также вызывать сборщик входных данных фиксированной функции, тесселатор и растризатор. Нарисовав простое ограничивающее поле или аналогичный ограничивающий том, который проще обработать и растеризировать, чем реальная модель, избежать ненужных растеризации и обработки.

В отличие от Direct3D 11, предикация отделяется от запросов и расширяется в Direct3D 12, чтобы позволить приложению предикатировать объекты на основе каких-либо причин, которые разработчик приложения может решить (а не только occlusion).

SetPredication

Предикаты можно задать на основе значения 64-разрядных битов в буфере (см. D3D12_PREDICATION_OP).

Когда GPU выполняет команду SetPredication , она привязывает значение в буфере. Будущие изменения данных в буфере не влияют на состояние предикаций.

Если входной буфер параметров имеет значение NULL, то предикаты отключены.

Указания предикаций отсутствуют в API Direct3D 12; и предикаты разрешены для прямых, вычислительных и копирования списков команд. Исходный буфер может находиться в любом типе кучы (по умолчанию, отправке, обратном чтении, пользовательском).

Базовая среда выполнения проверяет следующее:

  • AlignedBufferOffset — это несколько из 8 байт
  • Ресурс является буфером
  • Операция является допустимым элементом перечисления
  • Не удается вызвать SetPredication из пакета
  • Тип списка команд поддерживает предикаты
  • Смещение не превышает размер буфера

Слой отладки выдает ошибку, если исходный буфер не находится в D3D12_RESOURCE_STATE_PREDICATION (что совпадает с состоянием D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT и просто псевдонимом).

Набор операций, которые можно предикатировать:

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

Методы ID3D12GraphicsCommandList ResolveQueryData, BeginQuery и EndQuery не предикатированы.

Счетчики и запросы

Измерение производительности

Пошаговое руководство по запросам предикаций