IDXGIKeyedMutex::AcquireSync
キーを使用して、共有リソースへの排他レンダリング アクセスを取得します。
HRESULT
AcquireSync(
UINT64 Key,
DWORD dwMilliseconds
);
パラメータ
- Key
アクセス可能とするデバイスを示す値。サーフェスを現在所有しているデバイスが、同じ値を使用して IDXGIKeyedMutex::ReleaseSync メソッドを呼び出すと、このメソッドが成功します。この値には任意の UINT64 値を指定できます。 - dwMilliseconds
タイムアウト インターバル (ミリ秒単位) です。指定のインターバルが終了しても、キー付きミューテックスを指定のキーで解放できなかった場合に、このメソッドは返ります。この値をゼロに設定すると、AcquireSync メソッドはキー付きミューテックスが解放されているかどうかを確認するテストを実行して直ちに返ります。この値を INFINITE に設定すると、タイムアウト インターバルは無限大となり、終了しません。
戻り値
正常に実行された場合は S_OK を返し、それ以外の場合は次のいずれかのエラー コードを返します。
- WAIT_ABANDONED - 共有サーフェスとキー付きミューテックスが、一貫性のあるステートではなくなっています。このエラーが発生した場合は、キー付きミューテックスと共有サーフェスの両方を解放し、再作成する必要があります。
- WAIT_TIMEOUT - 指定のキーが解放されないまま、タイムアウト インターバルが終了しました。
- E_FAIL - サーフェスを所有しているデバイスが、同じ共有リソース上に別のキー付きミューテックスを作成しようとしました。
解説
AcquireSync メソッドは、複数のデバイスで共有しているサーフェスに対するロックを作成し、そのサーフェスにレンダリングできるデバイスを一度に 1 つのみに制限します。このメソッドでは、サーフェスに対する排他アクセス権を現在どのデバイスが持っているかを、キーを使用して判断します。
D3D10_RESOURCE_MISC_FLAG 列挙型の D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX メンバーを使用して作成されているサーフェスにレンダリングするには、先に AcquireSync メソッドを呼び出す必要があります。サーフェスへのレンダリングが終了した時点で ReleaseSync メソッドを呼び出す必要があります。
共有リソースのキー付きミューテックス オブジェクトへの参照を取得するには、その共有リソースの QueryInterface メソッドを呼び出し、IDXGIKeyedMutex インターフェイスの UUID を渡します。詳細については、以下に示すコード例を参照してください。
AcquireSync メソッドでは、サーフェスのステートに応じて、次のようにキーを使用します。
- 作成した当初のサーフェスには所有しているデバイスが存在しないので、どのデバイスでも AcquireSync メソッドを呼び出してそのサーフェスにアクセスできます。所有者がいないデバイスに対して使用できるキーは 0 のみです。他のキーで AcquireSync メソッドを呼び出すと、呼び出し元の CPU スレッドがストールします。
- AcquireSync メソッドを呼び出したときにサーフェスを所有しているデバイスが存在している場合は、そのデバイスが同じキーを使用して ReleaseSync メソッドを呼び出すまで、AcquireSync メソッドを呼び出した CPU スレッドはストールした状態になります。
- AcquireSync メソッドを呼び出すときにどのデバイスもサーフェスを所有していない場合は (前回そのサーフェスを所有していたデバイスが ReleaseSync メソッドを既に呼び出している場合など)、ReleaseSync が前回呼び出されたときに指定されたキーと同じキーを指定すれば、AcquireSync メソッドは成功します。他のキーを使用して AcquireSync メソッドを呼び出すとストールが発生します。
- サーフェスを所有しているデバイスが特定のキーを使用して ReleaseSync メソッドを呼び出したとき、それと同じキーを使用して複数のデバイスが AcquireSync メソッドを呼び出して待機中の場合は、それら待機中のデバイスのいずれかが最初にウェーク アップします。デバイスがウェーク アップする順番は決まっていません。
- キー付きミューテックスは、AcquireSync メソッドに対する再帰呼び出しをサポートしていません。
例
キー付きミューテックスの取得
次のコード例は、共有リソースに対するロックの取得方法とリソースを解放するときのキーの指定方法を示しています。// pDesc has already been set up with texture description. pDesc.MiscFlags = D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX; // Create a shared texture resource. pD3D10DeviceD->CreateTexture2D(pDesc, NULL, pD3D10Texture); // Acquire a reference to the keyed mutex. pD3D10Texture->QueryInterface(_uuidof(IDXGIKeyedMutex), pDXGIKeyedMutex); // Acquire a lock to the resource. pDXGIKeyedMutex->AcquireSync(0, INFINITE); // Release the lock and specify a key. pDXGIKeyedMutex->ReleaseSync(1);
要件
ヘッダー: DXGI.h 宣言
ライブラリ: DXGI.lib 内容
関連項目
DXGI のインターフェイス | IDXGIKeyedMutex | IDXGIKeyedMutex::ReleaseSync