estructura D3D12_PIPELINE_STATE_STREAM_DESC (d3d12.h)
Describe un flujo de estado de canalización.
Sintaxis
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
SIZE_T SizeInBytes;
void *pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;
Miembros
SizeInBytes
SAL: In
Especifica el tamaño de la estructura de datos opaca a la que apunta el miembro pPipelineStateSubobjectStream, en bytes.
pPipelineStateSubobjectStream
SAL: In_reads(Inexpressible("Dependentonsizeofsubobjects"))
Especifica la dirección de una estructura de datos que describe como secuencia de bytes un subobjeto de estado de canalización arbitrario.
Comentarios
Use esta estructura con el método ID3D12Device2::CreatePipelineState para crear objetos de estado de canalización.
El formato de la secuencia proporcionada debe constar de un conjunto alternado de D3D12_PIPELINE_STATE_SUBOBJECT_TYPE y los tipos de subobjetos correspondientes (por ejemplo, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER pares con D3D12_RASTERIZER_DESC. En términos de alineación, el tiempo de ejecución D3D12 espera que los subobjetos sean pares de estructura individuales de struct enum-struct, en lugar de un conjunto continuo de campos. También espera que estén alineados con la alineación natural de la palabra del sistema. Esto se puede lograr mediante alignas(void*)
, o haciendo un union
de la enumeración + subobjeto y un void*
.
Importante
No es suficiente simplemente unir el D3D12_PIPELINE_STATE_SUBOBJECT_TYPE con un void*, ya que esto provocará que ciertos subobjetos se desalinee.
Por ejemplo, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY va seguido de una enumeración de D3D12_PRIMITIVE_TOPOLOGY_TYPE . Si el tipo de subobjeto se une con un void*, habrá relleno adicional entre estos 2 miembros, lo que provocará daños en la secuencia.
Por este motivo, debe unir toda la estructura del subobjeto con un void*, cuando alignas
no está disponible.
Aquí se muestra un ejemplo de un subobjeto adecuado para su uso con 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;
}
El tiempo de ejecución determinará el tipo de una secuencia de canalización (tipos válidos que son COMPUTE, GRAPHICS y MESH), por el que se encuentra el tipo de subobjeto, fuera de VS (sombreador de vértices), CS (sombreador de proceso) y MS (sombreador de malla). Si el entorno de ejecución no encuentra ninguno de estos sombreadores, se producirá un error en la creación de la canalización. Si encuentra varios de estos sombreadores que no son NULL, también se producirá un error. Esto significa que es legal tener, por ejemplo, un CS y VS en el objeto de secuencia, siempre que solo uno tenga un puntero distinto de null para el código de bytes del sombreador para cualquier llamada dada a ID3D12Device2::CreatePipelineState. Se omitirán los tipos de subobjetos irrelevantes en la canalización (por ejemplo, un subobjeto de sombreador de proceso en una secuencia de gráficos). Si no se proporciona un subobjeto (excepto los subobjetos obligatorios anteriores), el tiempo de ejecución proporcionará un valor predeterminado para él.
Considere la posibilidad de usar las d3dx12.h
extensiones para C++, que proporcionan un conjunto de estructuras auxiliares para todos los subobjetos de canalización (por ejemplo, la estructura anterior es muy similar a CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER
). Este encabezado se puede encontrar en el repositorio DirectX-Headers en github.
Requisitos
Requisito | Valor |
---|---|
Header | d3d12.h |