Метод ID3D11DeviceContext1::P SSetConstantBuffers1 (d3d11_1.h)
Задает буферы констант, которые использует этап конвейера пиксельного шейдера, и предоставляет шейдеру доступ к другим частям буфера.
Синтаксис
void PSSetConstantBuffers1(
[in] UINT StartSlot,
[in] UINT NumBuffers,
[in, optional] ID3D11Buffer * const *ppConstantBuffers,
[in, optional] const UINT *pFirstConstant,
[in, optional] const UINT *pNumConstants
);
Параметры
[in] StartSlot
Тип: UINT
Выполните индекс в отсчитываемом от нуля массиве устройства, чтобы задать буферам констант значение (в диапазоне от 0 до D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT – 1).
[in] NumBuffers
Тип: UINT
Число заданных буферов (в диапазоне от 0 до D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT — StartSlot).
[in, optional] ppConstantBuffers
Тип: ID3D11Buffer*
Массив буферов констант, передаваемых устройству.
[in, optional] pFirstConstant
Тип: const UINT*
Массив, содержащий смещения в буферах, которые указывает ppConstantBuffers . Каждое смещение указывает, где, с точки зрения шейдера, начинается каждый буфер констант. Каждое смещение измеряется в константах шейдера, которые имеют размер 16 байт (4*32-разрядные компоненты). Таким образом, смещение 16 указывает, что начало связанного буфера констант составляет 256 байт в буфер констант. Каждое смещение должно быть кратно 16 констант.
[in, optional] pNumConstants
Тип: const UINT*
Массив, содержащий количество констант в буферах, которые указывает ppConstantBuffers . Каждое число определяет количество констант, содержащихся в буфере констант, используемом шейдером. Каждое число констант начинается с соответствующего смещения, указанного в массиве pFirstConstant . Каждое число констант должно быть кратно 16 констант в диапазоне [0..4096].
Возвращаемое значение
None
Remarks
Чтобы разрешить шейдеру доступ к другим частям буфера, вызовите PSSetConstantBuffers1 вместо PSSetConstantBuffers. PSSetConstantBuffers1 имеет дополнительные параметры pFirstConstant и pNumConstants.
Среда выполнения удаляет вызов PSSetConstantBuffers1 , если количество констант, на которые указывают точки pNumConstants , превышает максимальный размер буфера констант, поддерживаемый шейдерами. Максимальный размер буфера констант, поддерживаемый шейдерами, содержит 4096 констант, где каждая константа содержит четыре 32-разрядных компонента.
Значения в элементах массивов pFirstConstant и pFirstConstantpNumConstant + могут превышать длину каждого буфера. С точки зрения шейдера буфер констант — это пересечение фактического выделения памяти для буфера и следующего окна (диапазона):
[значение в элементе pFirstConstant, значение в элементе pFirstConstant + value в элементе pNumConstants]
То есть окно представляет собой диапазон от (значение в элементе pFirstConstant) до (значение в элементе pFirstConstant + value в элементе pNumConstants).
Среда выполнения также удаляет вызов PSSetConstantBuffers1 в существующих драйверах, которые не поддерживают это смещение.
Среда выполнения эмулирует эту функцию для уровней компонентов 9.1, 9.2 и 9.3; Поэтому эта функция поддерживается для уровней компонентов 9.1, 9.2 и 9.3. Эта функция всегда доступна в новых драйверах для уровня компонентов 10 и выше.
С точки зрения шейдера элемент [0] в массиве буферов констант является константой pFirstConstant.
Вне границ доступа к буферам констант из шейдера в диапазон, определенный pFirstConstant и pNumConstants , возвращает 0.
Если массивы pFirstConstant и pNumConstants имеют значение NULL, вы получите тот же результат, что и при привязке всего буфера к представлению. Этот же результат можно получить при вызове метода PSSetConstantBuffers . Если буфер больше максимального размера буфера констант, поддерживаемого шейдерами (4096 элементов), шейдер может получить доступ только к первым константам 4096.
Если pFirstConstant или pNumConstants имеет значение NULL, другой параметр также должен иметь значение NULL.
Вызов PSSetConstantBuffers1 с эмуляцией списка команд
Эмуляция списка командсреды выполнения PSSetConstantBuffers1 иногда фактически не изменяет смещения или размеры массивов буферов констант. Это происходит, когда PSSetConstantBuffers1 не изменяет буферы констант в начале и конце диапазона слотов, которые вы задали для обновления. В этом разделе показано, как обойти это поведение.Ниже приведен код для проверка, эмулирует ли среда выполнения списки команд или драйвер поддерживает списки команд:
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.
}
}
Если среда выполнения эмулирует списки команд, необходимо использовать один из следующих фрагментов кода:
Если изменить смещение и размер только для одного буфера констант, сначала задайте для буфера констант значение 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);
Если изменить несколько буферов констант, сначала задайте для первого и последнего буферов констант диапазона значение 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);
Требования
Минимальная версия клиента | Windows 8 и Обновление платформы для Windows 7 [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2012 и обновление платформы для Windows Server 2008 R2 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | d3d11_1.h |
Библиотека | D3D11.lib |