PFND3DDDI_LOCKASYNC コールバック関数 (d3dumddi.h)
LockAsync 関数は、指定されたリソースまたはリソース内のサーフェスをロックします。
構文
PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;
HRESULT Pfnd3dddiLockasync(
HANDLE hDevice,
D3DDDIARG_LOCKASYNC *unnamedParam2
)
{...}
パラメーター
hDevice
ディスプレイ デバイス (グラフィックス コンテキスト) へのハンドル。
unnamedParam2
pData [in, out]
ロックするリソース内のリソースまたはサーフェスを記述する D3DDDIARG_LOCKASYNC 構造体へのポインター。
戻り値
LockAsync は、次のいずれかの値を返します。
リターン コード | 説明 |
---|---|
S_OK | リソースが正常にロックされています。 |
E_OUTOFMEMORY | LockAsync は、完了するために必要なメモリを割り当てませんでした。 |
D3DDDIERR_WASSTILLDRAWING | D3DDDIARG_LOCKASYNC構造体で指定されているリソースに対応する割り当ての名前を変更できませんでした。 ドライバーは、破棄ビット フィールド フラグが D3DDDIARG_LOCKASYNC の Flags メンバーに設定されている場合にのみ、この値を返します。 |
E_NOTIMPL | ユーザー モード ディスプレイ ドライバーは、指定されたリソースの LockAsync をサポートしていません。 |
注釈
複数プロセッサ コンピューターでは、Microsoft Direct3D ランタイムは、メイン アプリケーション スレッドからではなく、ワーカー スレッドからユーザー モード ディスプレイ ドライバーのほとんどの関数を呼び出す場合があります。 このマルチプロセッサ最適化は、ユーザー モード ディスプレイ ドライバーに対して透過的です。 ランタイムが複数プロセッサ最適化を使用する場合、Lock 関数ではなくLockAsync を呼び出してリソースをロックする可能性があります。
ユーザー モード ディスプレイ ドライバーは、必要に応じて LockAsync を実装します。Direct3D ランタイムは、ドライバーが LockAsync、UnlockAsync、および Rename 関数を実装している場合にのみ、LockAsync を呼び出します。 ただし、動的リソースを頻繁にロックするアプリケーションは、より高いパフォーマンスを実現できるため、ユーザー モードディスプレイ ドライバーは LockAsync 関数と UnlockAsync 関数と Rename 関数を実装する必要があります。
Direct3D ランタイムは、複数プロセッサの最適化を使用する場合、ランタイムが管理するワーカー スレッドからほとんどのユーザー モードディスプレイ ドライバー関数を呼び出します。ただし、ランタイムは、アプリケーションのメイン スレッドで LockAsync を呼び出します。
ユーザー モードディスプレイ ドライバーが DDI バージョンの 0x0000000B 以上を公開している場合 (ドライバーは、ドライバーの OpenAdapter 関数の呼び出しで、D3D10DDIARG_OPENADAPTER構造体の DriverVersion メンバーでこの値を返します)、Direct3D ランタイムは再入可能な方法で LockAsync を呼び出します。 ランタイムが再入可能な方法で LockAsync を呼び出すと、1 つのスレッドが LockAsync 内で実行され、同じディスプレイ デバイスを参照する別のスレッドが別のユーザー モードディスプレイ ドライバー関数内で実行されます。 さらに、この種類のドライバーでは、ランタイムはシステム メモリ サーフェスに対して LockAsync を呼び出します。 D3DDDIARG_LOCKASYNCの Flags メンバーで [ビット フィールドの破棄] フラグが設定されている場合、ドライバーはリソースに対応する割り当ての名前を変更する必要があります。 通常、割り当ての名前を変更するために、ドライバーは、ロックするリソースに対応する割り当てハンドルを使用して pfnLockCb 関数を呼び出します。
ドライバーは、ドライバーが pfnLockCb を呼び出すときに、D3DDDICB_LOCK構造体の Flags メンバーで破棄ビット フィールド フラグを設定する必要があります。 ドライバーは、D3DDDIARG_LOCKASYNCの Flags メンバーで NoExistingReferences ビット フィールド フラグが TRUE に設定されている場合にのみ、ドライバーが pfnLockCb を呼び出すときにD3DDDICB_LOCKの NoExistingReference ビット フィールド フラグを設定する必要があります。また、ドライバーには、リソースへの内部的にキューに登録された参照がありません。
ドライバーが割り当ての名前を変更できない場合、ドライバーの LockAsync 関数はエラーをランタイムに返し、ドライバーはコマンド バッファーをフラッシュしないようにする必要があります。 名前の変更が成功した場合、ドライバーはリソース メモリ、ピッチ、スライス ピッチへのポインターと、D3DDDIARG_LOCKASYNCのメンバーで名前が変更された割り当てを表すリソースへのハンドルを返 す必要があります。 ドライバーは、 pfnLockCb が返す新しい割り当てハンドルを使用して、内部追跡構造を更新しないでください。 代わりに、ドライバーは Rename 関数が呼び出されるまで待機する必要があります。
D3DDDIARG_LOCKASYNCの Flags メンバーで NoOverwrite ビット フィールド フラグが設定されている場合、ドライバーは、上書きなしのセマンティクスで対応する割り当てをロックする必要があります。 ドライバーは、D3DDDICB_LOCK の Flags メンバーに IgnoreSync ビット フィールド フラグを設定して pfnLockCb を呼び出し、リソース メモリ、ピッチ、スライス ピッチへのポインターを、D3DDDIARG_LOCKASYNCのメンバーの Direct3D ランタイムに返す必要があります。 ドライバーが NoOverwrite ビット フィールド フラグを設定した LockAsync の呼び出しから成功 (S_OK) を返した場合は、ロックされたサーフェスでレンダリングするために呼び出される可能性があります。 ドライバーは、ロック中にレンダリングできるサーフェスに対してのみ NoOverwrite が設定された LockAsync の呼び出しから成功を返す必要があります。 ビデオ メモリ マネージャーでは、サーフェスに対応する割り当てを AGP または開口セグメントでサポートする必要があります。それ以外の場合、コマンド バッファーがロックされた割り当てを参照すると 、pfnRenderCb 関数の呼び出しは失敗します。
要約すると、名前の変更が失敗した場合、または上書きなしのセマンティクスがリソースでサポートされていない場合、ドライバーは LockAsync 関数の呼び出しを失敗させる必要があります。 ただし、Direct3D ランタイムは、これらのエラーから復旧します。 その他の状況では、ドライバーは複数プロセッサ コンピューターのパフォーマンスを向上させるために LockAsync から成功を返す必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista 以降のバージョンの Windows オペレーティング システムで使用できます。 |
対象プラットフォーム | デスクトップ |
Header | d3dumddi.h (D3dumddi.h を含む) |