Método ID3D11DeviceContext1::P SSetConstantBuffers1 (d3d11_1.h)

Define os buffers constantes que o estágio de pipeline do sombreador de pixel usa e permite que o sombreador acesse outras partes do buffer.

Sintaxe

void PSSetConstantBuffers1(
  [in]           UINT         StartSlot,
  [in]           UINT         NumBuffers,
  [in, optional] ID3D11Buffer * const *ppConstantBuffers,
  [in, optional] const UINT   *pFirstConstant,
  [in, optional] const UINT   *pNumConstants
);

Parâmetros

[in] StartSlot

Tipo: UINT

Indexe na matriz baseada em zero do dispositivo para começar a definir buffers constantes como (intervalos de 0 a D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).

[in] NumBuffers

Tipo: UINT

Número de buffers a serem definidos (intervalos de 0 a D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT – StartSlot).

[in, optional] ppConstantBuffers

Tipo: ID3D11Buffer*

Matriz de buffers constantes sendo fornecidos ao dispositivo.

[in, optional] pFirstConstant

Tipo: const UINT*

Uma matriz que contém os deslocamentos nos buffers especificados por ppConstantBuffers . Cada deslocamento especifica onde, do ponto de vista do sombreador, cada buffer constante é iniciado. Cada deslocamento é medido em constantes de sombreador, que são 16 bytes (componentes de 4*32 bits). Portanto, um deslocamento de 16 indica que o início do buffer constante associado é de 256 bytes no buffer constante. Cada deslocamento deve ser um múltiplo de 16 constantes.

[in, optional] pNumConstants

Tipo: const UINT*

Uma matriz que contém o número de constantes nos buffers especificados por ppConstantBuffers . Cada número especifica o número de constantes contidas no buffer constante que o sombreador usa. Cada número de constantes começa a partir de seu respectivo deslocamento especificado na matriz pFirstConstant . Cada número de constantes deve ser um múltiplo de 16 constantes, no intervalo [0..4096].

Valor retornado

Nenhum

Comentários

Para permitir que o sombreador acesse outras partes do buffer, chame PSSetConstantBuffers1 em vez de PSSetConstantBuffers. PSSetConstantBuffers1 tem parâmetros adicionais pFirstConstant e pNumConstants.

O runtime descartará a chamada para PSSetConstantBuffers1 se o número de constantes para as quais pNumConstants aponta for maior do que o tamanho máximo de buffer constante compatível com sombreadores. O tamanho máximo do buffer constante compatível com sombreadores contém constantes 4096, em que cada constante tem quatro componentes de 32 bits.

Os valores nos elementos das matrizes pFirstConstant e pFirstConstant + pNumConstants podem exceder o comprimento de cada buffer; do ponto de vista do sombreador, o buffer constante é a interseção da alocação de memória real para o buffer e a seguinte janela (intervalo):

[valor em um elemento de pFirstConstant, valor em um elemento de pFirstConstant + valor em um elemento de pNumConstants]

Ou seja, a janela é o intervalo de (valor em um elemento de pFirstConstant) a (valor em um elemento de pFirstConstant + valor em um elemento de pNumConstants).

O runtime também descarta a chamada para PSSetConstantBuffers1 em drivers existentes que não dão suporte a esse deslocamento.

O runtime emulará esse recurso para o nível de recurso 9.1, 9.2 e 9.3; Portanto, esse recurso tem suporte para o nível de recurso 9.1, 9.2 e 9.3. Esse recurso está sempre disponível em novos drivers para o nível de recurso 10 e superior.

Do ponto de vista do sombreador, o elemento [0] na matriz de buffers constantes é a constante em pFirstConstant.

O acesso fora dos limites aos buffers constantes do sombreador para o intervalo definido por pFirstConstant e pNumConstants retorna 0.

Se as matrizes pFirstConstant e pNumConstants forem NULL, você obterá o mesmo resultado de se estivesse associando todo o buffer à exibição. Você obterá esse mesmo resultado se chamar o método PSSetConstantBuffers . Se o buffer for maior que o tamanho máximo do buffer constante com suporte de sombreadores (elementos 4096), o sombreador poderá acessar apenas as primeiras constantes 4096.

Se pFirstConstant ou pNumConstants for NULL, o outro parâmetro também deverá ser NULL.

Chamando PSSetConstantBuffers1 com emulação de lista de comandos

A emulação de lista de comandos do runtime de PSSetConstantBuffers1 às vezes não altera realmente os deslocamentos ou tamanhos das matrizes de buffers constantes. Esse comportamento ocorre quando PSSetConstantBuffers1 não altera efetivamente os buffers constantes no início e no final do intervalo de slots que você definiu para atualizar. Esta seção mostra como contornar esse comportamento.

Este é o código para marcar se o runtime emula listas de comandos ou se o driver dá suporte a listas de comandos:


     HRESULT hr = S_OK;
     bool needWorkaround = false;
     D3D11_DEVICE_CONTEXT_TYPE contextType = pDeviceContext->GetType();

     if( D3D11_DEVICE_CONTEXT_DEFERRED == contextType)
     {
          D3D11_FEATURE_DATA_THREADING threadingCaps = { FALSE, FALSE };

          hr = pDevice->CheckFeatureSupport( D3D11_FEATURE_THREADING, &threadingCaps, sizeof(threadingCaps) );
          if( SUCCEEDED(hr) && !threadingCaps.DriverCommandLists )
          {
               needWorkaround = true; // the runtime emulates command lists.
          }
     }

Se o runtime emular listas de comandos, você precisará usar um destes snippets de código:

Se você alterar o deslocamento e o tamanho em apenas um único buffer constante, defina o buffer constante como NULL primeiro:


     pDeviceContext->PSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->PSSetConstantBuffers(0, 1, &NullCBuf);
     }
     pDeviceContext->PSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);

Se você alterar vários buffers constantes, defina primeiro e último buffers constantes do intervalo como NULL primeiro:


     pDeviceContext->PSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->PSSetConstantBuffers(0, 1, &NullCBuf);
          pDeviceContext->PSSetConstantBuffers(3, 1, &NullCBuf);
     }
     pDeviceContext->PSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);

Requisitos

   
Cliente mínimo com suporte Windows 8 e Platform Update para Windows 7 [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2012 e Platform Update para Windows Server 2008 R2 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho d3d11_1.h
Biblioteca D3D11.lib

Confira também

ID3D11DeviceContext1