Id3D11DeviceContext1::GSSetConstantBuffers1 (d3d11_1.h)
Establece los búferes de constantes que usa la fase de canalización del sombreador de geometría.
Sintaxis
void GSSetConstantBuffers1(
[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
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
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
Matriz de búferes de constantes (vea ID3D11Buffer) que se asigna al dispositivo.
[in, optional] pFirstConstant
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
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
El tiempo de ejecución quita la llamada a GSSetConstantBuffers1 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 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 + value en un elemento de pNumConstants]. El runtime también quita la llamada a GSSetConstantBuffers1 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 GSSetConstantBuffers . 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 GSSetConstantBuffers1 con emulación de lista de comandos
La emulación de la lista de comandos del runtime de GSSetConstantBuffers1 a veces no cambia realmente los desplazamientos ni los tamaños de las matrices de búferes de constantes. Este comportamiento se produce cuandoGSSetConstantBuffers1 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 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->GSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->GSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->GSSetConstantBuffers1(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->GSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->GSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->GSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->GSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 8 y Actualización de 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 |