Metode ID3D11DeviceContext1::VSSetConstantBuffers1 (d3d11_1.h)
Mengatur buffer konstanta yang digunakan tahap alur shader vertex.
Sintaks
void VSSetConstantBuffers1(
[in] UINT StartSlot,
[in] UINT NumBuffers,
[in, optional] ID3D11Buffer * const *ppConstantBuffers,
[in, optional] const UINT *pFirstConstant,
[in, optional] const UINT *pNumConstants
);
Parameter
[in] StartSlot
Jenis: UINT
Indeks ke dalam array berbasis nol perangkat untuk mulai mengatur buffer konstan ke (berkisar dari 0 hingga D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1).
[in] NumBuffers
Jenis: UINT
Jumlah buffer yang akan diatur (berkisar dari 0 hingga D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot).
[in, optional] ppConstantBuffers
Jenis: ID3D11Buffer*
Array buffer konstan diberikan ke perangkat.
[in, optional] pFirstConstant
Jenis: const UINT*
Array yang menyimpan offset ke dalam buffer yang ditentukan ppConstantBuffers . Setiap offset menentukan di mana, dari sudut pandang shader, setiap buffer konstanta 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
Jenis: const UINT*
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].
Mengembalikan nilai
Tidak ada
Keterangan
Runtime menghilangkan panggilan ke VSSetConstantBuffers1 jika jumlah konstanta yang 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 + nilai dalam elemen pNumConstants]. Runtime juga menghilangkan panggilan ke VSSetConstantBuffers1 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 tampilan. Anda mendapatkan hasil yang sama ini jika Anda memanggil metode VSSetConstantBuffers . 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 VSSetConstantBuffers1 dengan emulasi daftar perintah
Daftar perintah runtime vsSetConstantBuffers1 terkadang tidak benar-benar mengubah offset atau ukuran untuk array buffer konstan. Perilaku ini terjadi ketikaVSSetConstantBuffers1 tidak secara efektif mengubah buffer konstanta 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 menimulasi 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->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
}
pDeviceContext->VSSetConstantBuffers1(0, 1, &CBuf, &Offset, &Count);
Jika Anda mengubah beberapa buffer konstanta, atur buffer konstanta pertama dan terakhir dari rentang ke NULL terlebih dahulu:
pDeviceContext->VSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
if( needWorkaround )
{
// Workaround for command list emulation
pDeviceContext->VSSetConstantBuffers(0, 1, &NullCBuf);
pDeviceContext->VSSetConstantBuffers(3, 1, &NullCBuf);
}
pDeviceContext->VSSetConstantBuffers1(0, 4, &CBufs, &Offsets, &Counts);
Persyaratan
Klien minimum yang didukung | Pembaruan Windows 8 dan Platform untuk Windows 7 [aplikasi desktop | Aplikasi UWP] |
Server minimum yang didukung | Windows Server 2012 dan Platform Update untuk Windows Server 2008 R2 [aplikasi desktop | Aplikasi UWP] |
Target Platform | Windows |
Header | d3d11_1.h |
Pustaka | D3D11.lib |