Предикация

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

Общие сведения

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

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

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

SetPredication

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

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

Если входной параметр Buffer имеет значение NULL, предикация отключена.

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

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

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

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

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

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

Методы ID3D12GraphicsCommandList ResolveQueryData, BeginQuery и EndQuery не являются предикатами.

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

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

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