Управление состоянием графического конвейера в Direct3D 12

В этом разделе описывается настройка состояния графического конвейера в Direct3D 12.

Общие сведения о состоянии конвейера

При отправке геометрии в графический процессор (GPU) для рисования существует широкий спектр параметров оборудования, определяющих способ интерпретации и отрисовки входных данных. В совокупности эти параметры называются состоянием графического конвейера и включают общие параметры, такие как состояние растеризатора, состояние смешения и состояние трафарета глубины, а также тип топологии-примитив отправленной геометрии и шейдеры, которые будут использоваться для отрисовки. В Microsoft Direct3D 12 большинство состояний графического конвейера задается с помощью объектов состояния конвейера (PSO). Приложение может создавать неограниченное количество этих объектов, представленных интерфейсом ID3D12PipelineState , обычно во время инициализации. Затем во время отрисовки списки команд могут быстро переключать несколько параметров состояния конвейера, вызывая ID3D12GraphicsCommandList::SetPipelineState в прямом списке команд или пакете, чтобы задать активный PSO.

В Direct3D 11 состояние графического конвейера было объединялось в крупные объекты состояния, такие как ID3D11BlendState , которые можно было создать и задать во время отрисовки в непосредственном контексте с помощью таких методов, как ID3D11DeviceContext::OMSetBlendState. Идея заключается в том, что GPU может повысить эффективность, установив связанные параметры, такие как параметры состояния смешения, все сразу. Однако с современным графическим оборудованием существуют зависимости между различными аппаратными единицами. Например, состояние аппаратного наложения может иметь зависимости от состояния растра, а также состояния смешения. PsOs в Direct3D 12 были разработаны таким образом, чтобы GPU предварительно обрабатывал все зависимые параметры в каждом состоянии конвейера, как правило, во время инициализации, чтобы сделать переключение между состояниями во время отрисовки максимально эффективным.

Обратите внимание, что хотя большинство параметров состояния конвейера задаются с помощью объектов PSOs, некоторые параметры состояния задаются отдельно с помощью ИНТЕРФЕЙСов API, предоставляемых ID3D12GraphicsCommandList. Эти параметры и связанные API подробно рассматриваются ниже. Кроме того, существуют различия в том, как состояние графического конвейера наследуется и сохраняется из списков и пакетов прямых команд. В этом разделе приведены подробные сведения об этих двух из приведенных ниже.

Состояния графического конвейера, заданные с объектами состояния конвейера

Самый простой способ просмотреть все различные состояния конвейера, которые можно задать с помощью объекта состояния конвейера, — просмотреть справочный раздел для D3D12_GRAPHICS_PIPELINE_STATE_DESC , который передается в ID3D12Device::CreateGraphicsPipelineState при инициализации объекта. Краткая сводка состояний, которые можно задать, включает в себя:

  • Байт-код для всех шейдеров, включая вершины, пиксели, домен, корпус и геометрические шейдеры.
  • Формат входной вершины.
  • Тип топологии-примитив. Обратите внимание, что тип топологии-примитив input-ассемблер (точка, линия, треугольник, исправление) задается в PSO с помощью перечисления D3D12_PRIMITIVE_TOPOLOGY_TYPE . Примитивная смежность и упорядочение (список строк, полоса строк, полоса строк с данными смежности и т. д.) задается из списка команд с помощью метода ID3D12GraphicsCommandList::IASetPrimitiveTopology .
  • Состояние смешения, состояние растеризатора, состояние трафарета глубины.
  • Форматы трафарета глубины и целевого объекта отрисовки, а также число целевых объектов отрисовки.
  • Параметры множественной выборки.
  • Буфер вывода потоковой передачи.
  • Корневая подпись. Дополнительные сведения см. в разделе Корневые подписи.

Состояния графического конвейера, заданные вне объекта состояния конвейера

Большинство состояний графического конвейера задаются с помощью объектов psos. Однако существует набор параметров состояния конвейера, которые задаются путем вызова методов интерфейса ID3D12GraphicsCommandList из списка команд. В следующей таблице показаны состояния, заданные таким образом, и соответствующие методы.

Состояние Метод
Привязки ресурсов IASetIndexBuffer
IASetVertexBuffers
SOSetTargets
OMSetRenderTargets
SetDescriptorHeaps
Все методы SetGraphicsRoot...
Все методы SetComputeRoot...
Видовые экраны RSSetViewports
Ножницы RSSetScissorRects
Коэффициент смешения OMSetBlendFactor
Эталонное значение трафарета глубины OMSetStencilRef
Порядок и тип примитивной топологии входного ассемблерного ассемблер IASetPrimitiveTopology

Наследование состояния конвейера графики

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

Для состояний графического конвейера, которые задаются с помощью psos, ни одно из этих состояний не наследуется прямыми списками команд или пакетами. Начальное состояние графического конвейера для списков и пакетов прямых команд устанавливается во время создания с параметром ID3D12PipelineStateзначением ID3D12Device::CreateCommandList. Если в вызове не указан pso, используется начальное состояние по умолчанию. Вы можете изменить текущий pso в списке команд, вызвав ID3D12GraphicsCommandList::SetPipelineState.

Списки прямых команд также не наследуют состояние, заданное с помощью методов списка команд , таких как RSSetViewports. Дополнительные сведения о начальных значениях по умолчанию для состояний, отличных от PSO, см. в разделе ID3D12GraphicsCommandList::ClearState.

Пакеты наследуют все состояния графического конвейера, которые не заданы с psos, за исключением примитивного типа топологии. Примитивная топология всегда имеет значение D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED , когда начинается выполнение пакета. Любое состояние, заданное в пакете (само pso, состояние, не основанное на PSO, и привязки ресурсов), влияет на состояние родительского списка прямых команд. Например, если rsSetViewports вызывается из пакета, указанные окна просмотра будут по-прежнему задаваться в родительском списке прямых команд для вызовов после вызова ExecuteBundle , задающего окна просмотра.

Привязки ресурсов, заданные в списке команд или пакете, сохраняются. Поэтому привязки ресурсов, измененные в списке прямых команд, будут по-прежнему задаваться в рамках последующего выполнения дочернего пакета. Привязки ресурсов, измененные из пакета, по-прежнему будут задаваться для последующих вызовов в родительском списке прямых команд.

Дополнительные сведения о привязках см. в разделе Семантика пакетастатьи Использование корневой сигнатуры.