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부터 시작하는 배열로 인덱싱하여 상수 버퍼를 로 설정하기 시작합니다(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 배열에 지정된 각 오프셋에서 시작됩니다. 각 상수는 [0..4096] 범위에서 16개 상수의 배수여야 합니다.
반환 값
없음
설명
pNumConstants가 가리키는 상수 수가 셰이더에서 지원하는 최대 상수 버퍼 크기(4096 상수)보다 큰 경우 런타임은 HSSetConstantBuffers1에 대한 호출을 삭제합니다. pFirstConstant 및 pFirstConstantpNumConstants + 배열의 요소에 있는 값은 각 버퍼의 길이를 초과할 수 있습니다. 셰이더의 관점에서 상수 버퍼는 버퍼의 실제 메모리 할당과 창 [pFirstConstant 요소의 값, pNumConstants 요소의 pFirstConstant + 값 요소에 있는 값]의 교차점입니다. 또한 런타임은 이 오프셋을 지원하지 않는 기존 드라이버에서 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 7용 Windows 8 및 플랫폼 업데이트 [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2008 R2용 Windows Server 2012 및 플랫폼 업데이트 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | d3d11_1.h |
라이브러리 | D3D11.lib |