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

Confira também

Estruturas principais