Поделиться через


Метод ID3D11DeviceContext1::HSSetConstantBuffers1 (d3d11_1.h)

Задает буферы констант, которые использует этап шейдера оболочки конвейера.

Синтаксис

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

Параметры

[in] StartSlot

Выполните индекс в массиве устройства с отсчитываемой от нуля, чтобы начать установку буферов констант (в диапазоне от 0 до D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT – 1).

[in] NumBuffers

Число устанавливаемых буферов (в диапазоне от 0 до D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT — StartSlot).

[in, optional] ppConstantBuffers

Массив буферов констант, передаваемых устройству.

[in, optional] pFirstConstant

Массив, содержащий смещения в буферах, которые указывает ppConstantBuffers . Каждое смещение указывает, где, с точки зрения шейдера, начинается каждый буфер констант. Каждое смещение измеряется в константах шейдера, которые имеют размер 16 байт (4*32-разрядные компоненты). Таким образом, смещение 16 означает, что начало связанного буфера констант составляет 256 байт в буфере констант. Каждое смещение должно быть кратно 16 констант.

[in, optional] pNumConstants

Массив, содержащий количество констант в буферах, которые указывает ppConstantBuffers . Каждое число указывает количество констант, содержащихся в буфере констант, используемом шейдером. Каждое число констант начинается с соответствующего смещения, указанного в массиве pFirstConstant . Каждое число констант должно быть кратно 16 констант в диапазоне [0..4096].

Возвращаемое значение

None

Remarks

Среда выполнения удаляет вызов HSSetConstantBuffers1, если количество констант, на которые указывает pNumConstants , превышает максимальный размер буфера констант, поддерживаемый шейдерами (4096 констант). Значения в элементах массивов pFirstConstant и pFirstConstantpNumConstants + могут превышать длину каждого буфера. С точки зрения шейдера буфер констант — это пересечение фактического выделения памяти для буфера и окна [значение в элементе pFirstConstant, значение в элементе pFirstConstant + value в элементе pNumConstants]. Среда выполнения также удаляет вызов HSSetConstantBuffers1 для существующих драйверов, которые не поддерживают это смещение.

Среда выполнения эмулирует эту функцию для уровней компонентов 9.1, 9.2 и 9.3; Поэтому эта функция поддерживается для уровней компонентов 9.1, 9.2 и 9.3. Эта функция всегда доступна в новых драйверах для уровня компонентов 10 и выше.

С точки зрения шейдера элемент [0] в массиве буферов констант является константой в pFirstConstant.

Доступ вне границ к буферам констант из шейдера в диапазон, определенный pFirstConstant и pNumConstants , возвращает значение 0.

Если массивы pFirstConstant и pNumConstants имеют значение NULL, вы получите тот же результат, что и при привязке всего буфера. Такой же результат можно получить при вызове метода HSSetConstantBuffers . Если размер буфера превышает максимальный размер буфера констант, поддерживаемый шейдерами (4096 элементов), шейдер может получить доступ только к первым константам 4096.

Если pFirstConstant или pNumConstants имеет значение NULL, другой параметр также должен иметь значение NULL.

Вызов HSSetConstantBuffers1 с эмуляцией списка команд

Эмуляция списка команд среды выполнения для HSSetConstantBuffers1 иногда фактически не изменяет смещения или размеры массивов буферов констант. Такое поведение возникает, когда

HSSetConstantBuffers1 не изменяет буферы констант в начале и в конце диапазона слотов, который вы задали для обновления. В этом разделе показано, как обойти эту проблему

Поведение.

Ниже приведен код для проверка, эмулирует ли среда выполнения списки команд или драйвер поддерживает списки команд:


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

При изменении нескольких буферов констант сначала задайте для первого и последнего буферов констант диапазона значение NULL :


     pDeviceContext->HSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
     if( needWorkaround )
     {
          // Workaround for command list emulation
          pDeviceContext->HSSetConstantBuffers(0, 1, &NullCBuf);
          pDeviceContext->HSSetConstantBuffers(3, 1, &NullCBuf);
     }
     pDeviceContext->HSSetConstantBuffers1(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

См. также раздел

ID3D11DeviceContext1