Bagikan melalui


METODE ID3D11DeviceContext1::HSSetConstantBuffers1 (d3d11_1.h)

Mengatur buffer konstan yang digunakan tahap lambung-shader dari alur.

Sintaks

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

Parameter

[in] StartSlot

Indeks ke dalam array berbasis nol perangkat untuk mulai mengatur buffer konstanta ke (berkisar dari 0 hingga D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).

[in] NumBuffers

Jumlah buffer yang akan diatur (berkisar dari 0 hingga D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot).

[in, optional] ppConstantBuffers

Array buffer konstanta yang diberikan ke perangkat.

[in, optional] pFirstConstant

Array yang menyimpan offset ke dalam buffer yang ditentukan ppConstantBuffers . Setiap offset menentukan di mana, dari sudut pandang shader, setiap buffer konstan dimulai. Setiap offset diukur dalam konstanta shader, yaitu 16 byte (komponen 4*32-bit). Oleh karena itu, offset 16 menunjukkan bahwa awal buffer konstanta terkait adalah 256 byte ke dalam buffer konstanta. Setiap offset harus kelipatan 16 konstanta.

[in, optional] pNumConstants

Array yang menyimpan jumlah konstanta dalam buffer yang ditentukan ppConstantBuffers . Setiap angka menentukan jumlah konstanta yang terkandung dalam buffer konstanta yang digunakan shader. Setiap jumlah konstanta dimulai dari offset masing-masing yang ditentukan dalam array pFirstConstant . Setiap jumlah konstanta harus kelipatan 16 konstanta, dalam rentang [0..4096].

Nilai kembali

Tidak ada

Keterangan

Runtime menghilangkan panggilan ke HSSetConstantBuffers1 jika jumlah konstanta di mana titik pNumConstants lebih besar dari ukuran buffer konstanta maksimum yang didukung oleh shader (4096 konstanta). Nilai dalam elemen array pFirstConstant dan pFirstConstant + pNumConstants dapat melebihi panjang setiap buffer; dari sudut pandang shader, buffer konstan adalah persimpangan alokasi memori aktual untuk buffer dan jendela [nilai dalam elemen pFirstConstant, nilai dalam elemen pFirstConstant + value dalam elemen pNumConstants]. Runtime juga menghilangkan panggilan ke HSSetConstantBuffers1 pada driver yang ada yang tidak mendukung offsetting ini.

Runtime akan meniru fitur ini untuk tingkat fitur 9.1, 9.2, dan 9.3; oleh karena itu, fitur ini didukung untuk tingkat fitur 9.1, 9.2, dan 9.3. Fitur ini selalu tersedia pada driver baru untuk tingkat fitur 10 dan yang lebih tinggi.

Dari sudut pandang shader, elemen [0] dalam array buffer konstan adalah konstanta di pFirstConstant.

Akses di luar batas ke buffer konstanta dari shader ke rentang yang ditentukan oleh pFirstConstant dan pNumConstants mengembalikan 0.

Jika array pFirstConstant dan pNumConstantsadalah NULL, Anda mendapatkan hasil yang sama seolah-olah Anda mengikat seluruh buffer ke dalam tampilan. Anda mendapatkan hasil yang sama ini jika Anda memanggil metode HSSetConstantBuffers . Jika buffer lebih besar dari ukuran buffer konstanta maksimum yang didukung oleh shader (4096 elemen), shader hanya dapat mengakses 4096 konstanta pertama.

Jika pFirstConstant atau pNumConstants adalah NULL, parameter lainnya juga harus NULL.

Memanggil HSSetConstantBuffers1 dengan emulasi daftar perintah

Daftar perintah runtime HSSetConstantBuffers1 terkadang tidak benar-benar mengubah offset atau ukuran untuk array buffer konstanta. Perilaku ini terjadi ketika

HSSetConstantBuffers1 tidak secara efektif mengubah buffer konstan di awal dan akhir rentang slot yang Anda atur untuk diperbarui. Bagian ini memperlihatkan cara mengatasi hal ini

Perilaku.

Berikut adalah kode untuk memeriksa apakah runtime menimulasi daftar perintah atau driver mendukung daftar perintah:


     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.
          }
     }

Jika runtime mengemulasi daftar perintah, Anda perlu menggunakan salah satu cuplikan kode ini:

Jika Anda mengubah offset dan ukuran hanya pada satu buffer konstanta, atur buffer konstanta ke NULL terlebih dahulu:


     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);

Jika Anda mengubah beberapa buffer konstanta, atur buffer konstanta pertama dan terakhir dari rentang ke NULL terlebih dahulu:


     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);

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 8 dan Pembaruan Platform untuk Windows 7 [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2012 dan Pembaruan Platform untuk Windows Server 2008 R2 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header d3d11_1.h
Pustaka D3D11.lib

Lihat juga

ID3D11DeviceContext1