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

Establece los búferes de constantes que usa la fase de canalización del sombreador de píxeles y permite al sombreador acceder a otras partes del búfer.

Sintaxis

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 en la matriz de base cero del dispositivo para empezar a establecer búferes de constantes en (intervalos de 0 a D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).

[in] NumBuffers

Tipo: UINT

Número de búferes que se van a establecer (oscila entre 0 y D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot).

[in, optional] ppConstantBuffers

Tipo: ID3D11Buffer*

Matriz de búferes de constantes que se asignan al dispositivo.

[in, optional] pFirstConstant

Tipo: const UINT*

Matriz que contiene los desplazamientos en los búferes que especifica ppConstantBuffers . Cada desplazamiento especifica dónde, desde el punto de vista del sombreador, se inicia cada búfer de constantes. Cada desplazamiento se mide en constantes de sombreador, que son de 16 bytes (componentes de 4*32 bits). Por lo tanto, un desplazamiento de 16 indica que el inicio del búfer de constantes asociado es de 256 bytes en el búfer de constantes. Cada desplazamiento debe ser un múltiplo de 16 constantes.

[in, optional] pNumConstants

Tipo: const UINT*

Matriz que contiene los números de constantes en los búferes que ppConstantBuffers especifica. Cada número especifica el número de constantes contenidas en el búfer de constantes que usa el sombreador. Cada número de constantes comienza desde su desplazamiento respectivo especificado en la matriz pFirstConstant . Cada número de constantes debe ser un múltiplo de 16 constantes, en el intervalo [0..4096].

Valor devuelto

None

Observaciones

Para permitir que el sombreador acceda a otras partes del búfer, llame a PSSetConstantBuffers1 en lugar de PSSetConstantBuffers. PSSetConstantBuffers1 tiene parámetros adicionales pFirstConstant y pNumConstants.

El tiempo de ejecución quita la llamada a PSSetConstantBuffers1 si el número de constantes a las que apunta pNumConstants es mayor que el tamaño máximo del búfer de constante admitido por los sombreadores. El tamaño máximo del búfer de constantes admitido por los sombreadores contiene 4096 constantes, donde cada constante tiene cuatro componentes de 32 bits.

Los valores de los elementos de las matrices pFirstConstant y pFirstConstant + pNumConstants pueden superar la longitud de cada búfer; desde el punto de vista del sombreador, el búfer de constantes es la intersección de la asignación de memoria real para el búfer y la siguiente ventana (intervalo):

[value en un elemento de pFirstConstant, value en un elemento de pFirstConstant + value en un elemento de pNumConstants]

Es decir, la ventana es el intervalo es de (valor en un elemento de pFirstConstant) a (valor en un elemento de pFirstConstant + value en un elemento de pNumConstants).

El runtime también quita la llamada a PSSetConstantBuffers1 en los controladores existentes que no admiten este desplazamiento.

El tiempo de ejecución emulará esta característica para el nivel de característica 9.1, 9.2 y 9.3; por lo tanto, esta característica es compatible con el nivel de característica 9.1, 9.2 y 9.3. Esta característica siempre está disponible en los nuevos controladores para el nivel de característica 10 y versiones posteriores.

Desde el punto de vista del sombreador, el elemento [0] de la matriz de búferes de constantes es la constante en pFirstConstant.

El acceso fuera de los límites a los búferes de constantes del sombreador al intervalo definido por pFirstConstant y pNumConstants devuelve 0.

Si las matrices pFirstConstant y pNumConstants son NULL, obtendrá el mismo resultado que si estuviera enlazando todo el búfer a la vista. Obtiene este mismo resultado si llama al método PSSetConstantBuffers . Si el búfer es mayor que el tamaño máximo del búfer de constantes admitido por los sombreadores (4096 elementos), el sombreador solo puede tener acceso a las primeras 4096 constantes.

Si pFirstConstant o pNumConstants es NULL, el otro parámetro también debe ser NULL.

Llamada a PSSetConstantBuffers1 con emulación de lista de comandos

La emulación de lista de comandos del runtime de PSSetConstantBuffers1 a veces no cambia realmente los desplazamientos o tamaños de las matrices de búferes de constantes. Este comportamiento se produce cuando PSSetConstantBuffers1 no cambia eficazmente los búferes de constantes al principio y al final del intervalo de ranuras que establece para actualizar. En esta sección se muestra cómo solucionar este comportamiento.

Este es el código para comprobar si el tiempo de ejecución emula las listas de comandos o el controlador admite 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.
          }
     }

Si el tiempo de ejecución emula las listas de comandos, debe usar uno de estos fragmentos de código:

Si cambia el desplazamiento y el tamaño solo en un único búfer de constantes, establezca primero el búfer de constantes en NULL :


     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);

Si cambia varios búferes de constantes, establezca primero y último búferes de constantes del intervalo en NULL :


     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 compatible Actualización de windows 8 y plataforma para Windows 7 [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2012 y Actualización de plataforma para Windows Server 2008 R2 [aplicaciones de escritorio | Aplicaciones para UWP]
Plataforma de destino Windows
Encabezado d3d11_1.h
Library D3D11.lib

Consulte también

ID3D11DeviceContext1