PFND3DDDI_LOCKASYNC fungsi panggilan balik (d3dumddi.h)

Fungsi LockAsync mengunci sumber daya yang ditentukan atau permukaan dalam sumber daya.

Sintaks

PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;

HRESULT Pfnd3dddiLockasync(
  HANDLE hDevice,
  D3DDDIARG_LOCKASYNC *unnamedParam2
)
{...}

Parameter

hDevice

Handel ke perangkat tampilan (konteks grafis).

unnamedParam2

pData [masuk, keluar]

Penunjuk ke struktur D3DDDIARG_LOCKASYNC yang menjelaskan sumber daya atau permukaan dalam sumber daya untuk dikunci.

Nilai kembali

LockAsync mengembalikan salah satu nilai berikut:

Menampilkan kode Deskripsi
S_OK Sumber daya berhasil dikunci.
E_OUTOFMEMORY LockAsync tidak dapat mengalokasikan memori yang diperlukan untuk menyelesaikannya.
D3DDDIERR_WASSTILLDRAWING Mengganti nama alokasi yang sesuai dengan sumber daya yang ditentukan struktur D3DDDIARG_LOCKASYNC gagal.
Driver mengembalikan nilai ini hanya jika bendera Buang bit-field diatur dalam anggota Bendera D3DDDIARG_LOCKASYNC.
E_NOTIMPL Driver tampilan mode pengguna tidak mendukung LockAsync untuk sumber daya yang ditentukan.

Keterangan

Pada komputer beberapa prosesor, runtime Microsoft Direct3D mungkin memanggil sebagian besar fungsi driver tampilan mode pengguna dari utas pekerja alih-alih dari utas aplikasi utama. Pengoptimalan multi-prosesor ini transparan terhadap driver tampilan mode pengguna. Saat runtime menggunakan pengoptimalan beberapa prosesor, runtime mungkin memanggil LockAsync daripada fungsi Kunci untuk mengunci sumber daya.

Driver tampilan mode pengguna secara opsional mengimplementasikan LockAsync; runtime Direct3D memanggil LockAsync hanya jika driver mengimplementasikan fungsi LockAsync, UnlockAsync, dan Rename . Namun, driver tampilan mode pengguna harus menerapkan fungsi LockAsync dan UnlockAsync dan Ganti Nama karena aplikasi yang sering mengunci sumber daya dinamis kemudian dapat mencapai performa yang lebih tinggi.

Ketika runtime Direct3D menggunakan pengoptimalan beberapa prosesor, runtime bahasa umum memanggil sebagian besar fungsi driver tampilan mode pengguna dari utas pekerja yang dikelola runtime bahasa umum; namun, runtime memanggil LockAsync pada utas utama aplikasi.

Jika driver tampilan mode pengguna mengekspos versi DDI 0x0000000B atau lebih besar (driver mengembalikan nilai ini di anggota DriverVersion dari struktur D3D10DDIARG_OPENADAPTER dalam panggilan ke fungsi OpenAdapter driver), runtime Direct3D akan memanggil LockAsync dengan cara yang masuk kembali. Ketika runtime memanggil LockAsync dengan cara yang masuk kembali, satu utas dapat dijalankan di dalam LockAsync sementara utas lain yang mereferensikan perangkat tampilan yang sama dijalankan di dalam fungsi driver tampilan mode pengguna lain. Selain itu, pada jenis driver ini, runtime akan memanggil LockAsync untuk permukaan memori sistem. Jika bendera Buang bit-field diatur di anggota BenderaD3DDDIARG_LOCKASYNC, driver harus mencoba mengganti nama alokasi yang sesuai dengan sumber daya. Biasanya, untuk mengganti nama alokasi, driver memanggil fungsi pfnLockCb dengan handel alokasi yang sesuai dengan sumber daya yang akan dikunci.

Driver harus mengatur bendera Buang bit-field di anggota Bendera dari struktur D3DDDICB_LOCK ketika driver memanggil pfnLockCb. Driver harus mengatur bendera bit-field NoExistingReference dari D3DDDICB_LOCK ketika driver memanggil pfnLockCb hanya jika bendera bit-field NoExistingReferences diatur ke TRUE di anggota Bendera D3DDDIARG_LOCKASYNC, dan driver tidak memiliki referensi antrean internal ke sumber daya.

Jika driver gagal mengganti nama alokasi, fungsi LockAsync driver harus mengembalikan kegagalan kembali ke runtime, dan driver tidak boleh menghapus buffer perintahnya. Jika penggantian nama berhasil, driver harus mengembalikan pointer ke memori sumber daya, pitch, dan pitch irisan dan handel ke sumber daya yang mewakili alokasi yang diganti namanya dalam anggota D3DDDIARG_LOCKASYNC. Driver tidak boleh memperbarui struktur pelacakan internalnya dengan handel alokasi baru yang dikembalikan pfnLockCb . Sebaliknya, driver harus menunggu sampai fungsi Ganti Nama dipanggil.

Jika bendera bit-field NoOverwrite diatur dalam anggota Bendera D3DDDIARG_LOCKASYNC, driver harus mengunci alokasi yang sesuai dengan semantik tanpa timpa. Driver harus memanggil pfnLockCb dengan bendera bit-field IgnoreSync yang diatur di anggota BenderaD3DDDICB_LOCK dan kemudian harus mengembalikan penunjuk ke memori sumber daya, pitch, dan potonngan pitch ke runtime Direct3D di anggota D3DDDIARG_LOCKASYNC. Jika driver mengembalikan keberhasilan (S_OK) dari panggilan ke LockAsync-nya dengan set bendera bit-field NoOverwrite , mungkin dipanggil untuk merender dengan permukaan terkunci. Driver harus mengembalikan keberhasilan dari panggilan ke LockAsync-nya dengan NoOverwrite yang diatur hanya untuk permukaan yang dapat dirender saat dikunci. Manajer memori video mengharuskan alokasi yang sesuai dengan permukaan harus didukung di segmen AGP atau aperture; jika tidak, panggilan ke fungsi pfnRenderCb gagal ketika buffer perintah mereferensikan alokasi terkunci.

Singkatnya, driver harus gagal memanggil ke fungsi LockAsync-nya jika penggantian nama gagal atau jika semantik tanpa penimpaan tidak didukung untuk sumber daya. Namun, runtime Direct3D akan pulih dari kegagalan ini. Untuk semua situasi lainnya, driver harus mengembalikan keberhasilan dari LockAsync untuk meningkatkan performa pada komputer multi-prosesor.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Tersedia di Windows Vista dan versi yang lebih baru dari sistem operasi Windows.
Target Platform Desktop
Header d3dumddi.h (termasuk D3dumddi.h)

Lihat juga

CreateResource

D3DDDIARG_CREATERESOURCE

D3DDDIARG_LOCKASYNC

D3DDDICB_LOCK

D3DDDI_DEVICEFUNCS

Lock

Mengubah Nama

UnlockAsync

pfnLockCb

pfnRenderCb