Предикация
Предикация — это функция, которая позволяет 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 и просто псевдонимом).
Набор операций, которые можно предикатировать:
- DrawInstanced
- DrawIndexedInstanced
- Диспетчеризации
- CopyTextureRegion
- CopyBufferRegion
- CopyResource
- CopyTiles
- ResolveSubresource
- ClearDepthStencilView
- ClearRenderTargetView
- ClearUnorderedAccessViewUint
- ClearUnorderedAccessViewFloat
- ExecuteIndirect
ExecuteBundle не предикатируется сам по себе. Вместо этого отдельные операции из списка выше, которые содержатся в стороне пакета, предикатируются.
Методы ID3D12GraphicsCommandList ResolveQueryData, BeginQuery и EndQuery не предикатированы.
См. также