METODE ID3D10Device::UpdateSubresource (d3d10.h)
CPU menyalin data dari memori ke subsumber daya yang dibuat dalam memori yang tidak dapat dipetakan. Lihat komentar.
Sintaks
void UpdateSubresource(
[in] ID3D10Resource *pDstResource,
[in] UINT DstSubresource,
[in] const D3D10_BOX *pDstBox,
[in] const void *pSrcData,
[in] UINT SrcRowPitch,
[in] UINT SrcDepthPitch
);
Parameter
[in] pDstResource
Jenis: ID3D10Resource*
Pointer ke sumber daya tujuan (lihat ID3D10Resource Interface).
[in] DstSubresource
Jenis: UINT
Indeks berbasis nol, yang mengidentifikasi subsumber daya tujuan. Lihat D3D10CalcSubresource untuk detail selengkapnya.
[in] pDstBox
Jenis: const D3D10_BOX*
Kotak yang menentukan bagian subsumber daya tujuan untuk menyalin data sumber daya ke dalamnya. Koordinat berada dalam byte untuk buffer dan dalam texel untuk tekstur. Jika NULL, data ditulis ke subsumber daya tujuan tanpa offset. Dimensi sumber harus sesuai dengan tujuan (lihat D3D10_BOX).
Kotak kosong menghasilkan no-op. Kotak kosong jika nilai atas lebih besar dari atau sama dengan nilai bawah, atau nilai kiri lebih besar dari atau sama dengan nilai kanan, atau nilai depan lebih besar dari atau sama dengan nilai belakang. Saat kotak kosong, UpdateSubresource tidak melakukan operasi pembaruan.
[in] pSrcData
Jenis: const void*
Penunjuk ke data sumber dalam memori.
[in] SrcRowPitch
Jenis: UINT
Ukuran satu baris data sumber.
[in] SrcDepthPitch
Jenis: UINT
Ukuran satu iringan kedalaman data sumber.
Mengembalikan nilai
Tidak ada
Keterangan
Untuk buffer shader-constant; atur pDstBox ke NULL. Tidak dimungkinkan untuk menggunakan metode ini untuk memperbarui sebagian buffer shader-constant.
Sumber daya tidak dapat digunakan sebagai tujuan jika:
- sumber daya dibuat dengan penggunaan yang tidak dapat diubah atau dinamis .
- sumber daya dibuat sebagai sumber daya stensil kedalaman.
- sumber daya dibuat dengan kemampuan multisampling (lihat DXGI_SAMPLE_DESC).
Performa UpdateSubresource tergantung pada apakah ada ketidakcocokan untuk sumber daya tujuan atau tidak. Misalnya, ketidakcocokan untuk sumber daya buffer vertex terjadi ketika aplikasi menjalankan panggilan Draw dan kemudian memanggil UpdateSubresource pada buffer vertex yang sama sebelum panggilan Draw benar-benar dijalankan oleh GPU.
- Ketika ada ketidakcocokan untuk sumber daya, UpdateSubresource akan melakukan 2 salinan data sumber. Pertama, data disalin oleh CPU ke ruang penyimpanan sementara yang dapat diakses oleh buffer perintah. Salinan ini terjadi sebelum metode kembali. Salinan kedua kemudian dilakukan oleh GPU untuk menyalin data sumber ke dalam memori yang tidak dapat dipetakan. Salinan kedua ini terjadi secara asinkron karena dijalankan oleh GPU ketika buffer perintah dibersihkan.
- Ketika tidak ada ketidakcocokan sumber daya, perilaku UpdateSubresource bergantung pada yang lebih cepat (dari perspektif CPU): menyalin data ke buffer perintah dan kemudian menjalankan salinan kedua ketika buffer perintah dibersihkan, atau meminta CPU menyalin data ke lokasi sumber daya akhir. Ini tergantung pada arsitektur sistem yang mendasar.
Setiap blok dalam visual ini mewakili elemen data, dan ukuran setiap elemen bergantung pada format sumber daya. Misalnya, jika format sumber daya DXGI_FORMAT_R32G32B32A32_FLOAT, maka ukuran setiap elemen akan menjadi 128 bit, atau 16 byte. Tekstur volume 3D ini memiliki lebar dua, tinggi tiga, dan kedalaman empat.
Untuk menghitung pitch baris sumber dan pitch kedalaman sumber untuk sumber daya tertentu, gunakan rumus berikut:
- Source Row Pitch = [ukuran satu elemen dalam byte] * [jumlah elemen dalam satu baris]
- Pitch Kedalaman Sumber = [Pitch Baris Sumber] * [jumlah baris (tinggi)]
- Pitch Baris Sumber = 16 * 2 = 32
- Pitch Kedalaman Sumber = 16 * 2 * 3 = 96
Misalnya, cuplikan kode berikut menunjukkan cara menentukan wilayah tujuan dalam tekstur 2D. Asumsikan tekstur tujuan adalah 512x512 dan operasi akan menyalin data yang ditujukan oleh pData ke [(120.100).. (200.220)] dalam tekstur tujuan. Asumsikan juga bahwa rowPitch telah diinisialisasi dengan nilai yang tepat (seperti yang dijelaskan di atas). Depan dan belakang masing-masing diatur ke 0 dan 1, karena dengan memiliki depan sama dengan belakang, kotak secara teknis kosong.
D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 100;
destRegion.bottom = 220;
destRegion.front = 0;
destRegion.back = 1;
pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );
Kasus 1D serupa. Cuplikan berikut menunjukkan cara menentukan wilayah tujuan dalam tekstur 1D. Gunakan asumsi yang sama seperti di atas, kecuali bahwa teksturnya panjangnya 512.
D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 0;
destRegion.bottom = 1;
destRegion.front = 0;
destRegion.back = 1;
pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );
Perbedaan antara Direct3D 10 dan Direct3D 10.1: Direct3D 10.1 memungkinkan sumber daya stensil kedalaman digunakan sebagai sumber atau tujuan. |
Persyaratan
Target Platform | Windows |
Header | d3d10.h |
Pustaka | D3D10.lib |