структура D3D12_PIPELINE_STATE_STREAM_DESC (d3d12.h)
Описывает поток состояния конвейера.
Синтаксис
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
SIZE_T SizeInBytes;
void *pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;
Члены
SizeInBytes
SAL: In
Задает размер непрозрачной структуры данных, на которую указывает элемент pPipelineStateSubobjectStream, в байтах.
pPipelineStateSubobjectStream
SAL: In_reads(Inexpressible("Dependentonsizeofsubobjects"))
Указывает адрес структуры данных, которая описывает как байтовый подобъект произвольного состояния конвейера.
Комментарии
Используйте эту структуру с методом ID3D12Device2::CreatePipelineState для создания объектов состояния конвейера.
Формат предоставленного потока должен состоять из чередующегося набора D3D12_PIPELINE_STATE_SUBOBJECT_TYPE и соответствующих для них типов подобъектов (например, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER пар с D3D12_RASTERIZER_DESC. С точки зрения выравнивания среда выполнения D3D12 ожидает, что подобъекты будут отдельными парами структур перечисления и структуры, а не непрерывным набором полей. Он также ожидает, что они будут выровнены с естественным выравниванием слов в системе. Это можно сделать либо с помощью alignas(void*)
, либо создания union
перечисления + подобъекта void*
и .
Важно!
Недостаточно просто объединить D3D12_PIPELINE_STATE_SUBOBJECT_TYPE с void*, так как это приведет к неправильному смещению некоторых подобъектов.
Например, за D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY следует перечисление D3D12_PRIMITIVE_TOPOLOGY_TYPE . Если тип подобъекта объединен с void*, между этими двумя элементами будет выполняться дополнительное заполнение, что приведет к повреждению потока.
По этой причине следует объединить всю структуру подобъекта с void*, если alignas
она недоступна
Ниже приведен пример подходящего подобъекта для использования с D3D12_RASTERIZER_DESC :
struct alignas(void*) StreamingRasterizerDesc
{
private:
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type = D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;
public:
D3D12_RASTERIZER_DESC Desc;
}
Среда выполнения определяет тип потока конвейера (допустимые типы — COMPUTE, GRAPHICS и MESH), по которому будет найден тип подобъекта из VS (вершинный шейдер), CS (шейдер вычислений) и MS (шейдер сетки). Если среда выполнения не найдет ни одного из этих шейдеров, создание конвейера завершится ошибкой. Если будет найдено несколько этих шейдеров, которые не имеют значения NULL, он также завершится ошибкой. Это означает, что допустимо иметь как CS , так и VS в объекте потока при условии, что только один из них имеет ненулевой указатель для байт-кода шейдера для любого заданного вызова ID3D12Device2::CreatePipelineState. Типы подобъектов, не относящиеся к конвейеру (например, подобъект вычислительного шейдера в графическом потоке), будут игнорироваться. Если подобъект не указан (за исключением указанных выше обязательных подобъектов), среда выполнения предоставит для него значение по умолчанию.
Рассмотрите возможность использования расширений d3dx12.h
для C++, которые предоставляют набор вспомогательных структур для всех подобъектов конвейера (например, приведенная выше структура очень похожа на CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER
). Этот заголовок можно найти в репозитории DirectX-Headers на сайте GitHub.
Требования
Требование | Значение |
---|---|
Заголовок | d3d12.h |