estrutura D3D12_PIPELINE_STATE_STREAM_DESC (d3d12.h)
Descreve um fluxo de estado do pipeline.
Sintaxe
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
SIZE_T SizeInBytes;
void *pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;
Membros
SizeInBytes
SAL: In
Especifica o tamanho da estrutura de dados opaca apontada pelo membro pPipelineStateSubobjectStream, em bytes.
pPipelineStateSubobjectStream
SAL: In_reads(Inexpressible("Dependentonsizeofsubobjects"))
Especifica o endereço de uma estrutura de dados que descreve como um bytestream um subobjeto arbitrário de estado de pipeline.
Comentários
Use essa estrutura com o método ID3D12Device2::CreatePipelineState para criar objetos de estado de pipeline.
O formato do fluxo fornecido deve consistir em um conjunto alternado de D3D12_PIPELINE_STATE_SUBOBJECT_TYPE e os tipos de subobjeto correspondentes para eles (por exemplo, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER pares com D3D12_RASTERIZER_DESC. Em termos de alinhamento, o runtime D3D12 espera que os subobjetos sejam pares de struct individuais de enum-struct, em vez de um conjunto contínuo de campos. Ele também espera que eles sejam alinhados ao alinhamento de palavras naturais do sistema. Isso pode ser obtido usando alignas(void*)
ou fazendo um union
da enumeração + subobjeto e um void*
.
Importante
Não é suficiente simplesmente unir o D3D12_PIPELINE_STATE_SUBOBJECT_TYPE com um vazio*, pois isso resultará na desalinhação de certos subobjetos.
Por exemplo, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY é seguido por uma enumeração D3D12_PRIMITIVE_TOPOLOGY_TYPE . Se o tipo de subobjeto for uniãodo com um void*, haverá preenchimento adicional entre esses 2 membros, resultando em corrupção do fluxo.
Por isso, você deve unir todo o struct de subobjeto com um void*, quando alignas
não estiver disponível
Um exemplo de um subobjeto adequado para uso com D3D12_RASTERIZER_DESC é mostrado aqui:
struct alignas(void*) StreamingRasterizerDesc
{
private:
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type = D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;
public:
D3D12_RASTERIZER_DESC Desc;
}
O runtime determinará o tipo de fluxo de pipeline (tipos válidos sendo COMPUTE, GRAPHICS e MESH), pelo qual o tipo de subobjeto, fora do VS (sombreador de vértice), CS (sombreador de computação) e MS (sombreador de malha) é encontrado. Se o runtime não encontrar nenhum desses sombreadores, ele falhará na criação do pipeline. Se encontrar vários desses sombreadores que não são nulos, ele também falhará. Isso significa que é legal ter um CSe VS em seu objeto de fluxo, desde que apenas um tenha um ponteiro não nulo para o código de byte do sombreador para qualquer chamada para ID3D12Device2::CreatePipelineState. Os tipos de subobjeto irrelevantes para o pipeline (por exemplo, um subobjeto de sombreador de computação em um fluxo gráfico) serão ignorados. Se um subobjeto não for fornecido (excluindo os subobjetos necessários acima), o runtime fornecerá um valor padrão para ele.
Considere usar as d3dx12.h
extensões para C++, que fornecem um conjunto de structs auxiliares para todos os subobjetos de pipeline (por exemplo, o struct acima é muito semelhante a CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER
). Esse cabeçalho pode ser encontrado no repositório DirectX-Headers no github.
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | d3d12.h |