Compartir a través de


Método ID3D11DeviceContext1::VSSetConstantBuffers1 (d3d11_1.h)

Establece los búferes de constantes que usa la fase de canalización del sombreador de vértices.

Sintaxis

void VSSetConstantBuffers1(
  [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 comenzar a establecer búferes de constantes en (oscila entre 0 y 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 ppConstantBuffers especifica. 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 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 a partir de su desplazamiento respectivo que se especifica 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

El tiempo de ejecución quita la llamada a VSSetConstantBuffers1 si el número de constantes a las que puntos pNumConstants es mayor que el tamaño máximo del búfer de constantes admitido por sombreadores (4096 constantes). 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 ventana [valor en un elemento de pFirstConstant, valor en un elemento de pFirstConstant + value en un elemento de pNumConstants]. El tiempo de ejecución también quita la llamada a VSSetConstantBuffers1 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 VSSetConstantBuffers . Si el búfer es mayor que el tamaño máximo del búfer de constantes admitido por 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.

Llamar a VSSetConstantBuffers1 con emulación de lista de comandos

La emulación de la lista de comandos del runtime de VSSetConstantBuffers1 a veces no cambia realmente los desplazamientos o tamaños de las matrices de búferes de constantes. Este comportamiento se produce cuando

VSSetConstantBuffers1 no cambia eficazmente los búferes de constantes al principio y al final del intervalo de ranuras que se establecen para actualizar. En esta sección se muestra cómo solucionar este problema

sospechosos.

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->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
     }
     pDeviceContext->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);

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


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

Requisitos

   
Cliente mínimo compatible Windows 8 y Platform Update 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