Win32 API 日本語リファレンス
ホームGraphics.Dxgi › IDXGIDevice2

IDXGIDevice2

COM
IID05008617-fbfd-4051-a790-144884b4f6a9継承元IDXGIDevice1自前メソッド開始 vtbl14

公式ドキュメント

IDXGIDevice2 インターフェイスは、画像データを生成する DXGI オブジェクト向けの派生クラスを実装します。このインターフェイスは、GPU の処理が完了するまで CPU の処理をブロックするメソッドや、リソースをオペレーティングシステムに提供(オファー)するメソッドを公開します。

解説(Remarks)

IDXGIDevice2 インターフェイスは、他の DXGI オブジェクトにアクセスする必要がある DXGI オブジェクトが使用することを想定して設計されています。このインターフェイスは、DXGI と通信するために Direct3D を使用しないアプリケーションにとって有用です。

Direct3D のデバイス作成関数は Direct3D デバイスオブジェクトを返します。この Direct3D デバイスオブジェクトは IUnknown インターフェイスを実装しています。この Direct3D デバイスオブジェクトに対してクエリを行い、デバイスに対応する IDXGIDevice2 インターフェイスを取得できます。Direct3D デバイスの IDXGIDevice2 インターフェイスを取得するには、次のコードを使用します。

IDXGIDevice2 * pDXGIDevice;
hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice2), (void **)&pDXGIDevice);

Windows Phone 8: この API はサポートされています。

メソッド 3

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 14 HRESULT OfferResources(DWORD NumResources, IDXGIResource** ppResources, DXGI_OFFER_RESOURCE_PRIORITY Priority)

リソースの内容を破棄することで、オペレーティングシステムがそのビデオメモリを解放できるようにします。(IDXGIDevice2.OfferResources)

NumResourcesDWORDinppResources 引数の配列に含まれるリソースの数。
ppResourcesIDXGIResource**in提供(オファー)するリソースの IDXGIResource インターフェイスへのポインターの配列。
PriorityDXGI_OFFER_RESOURCE_PRIORITYinデータの価値の高さを示す DXGI_OFFER_RESOURCE_PRIORITY 型の値。

戻り値

OfferResources は次の値を返します。

解説(Remarks)

Priority パラメーターで指定する優先度の値は、呼び出し元がその内容をどれだけ価値のあるものとみなしているかを表します。オペレーティングシステムはこの優先度の値を使用して、優先度の順にリソースを破棄します。オペレーティングシステムは、より高い優先度で提供(オファー)されたリソースを破棄する前に、低い優先度で提供されたリソースを破棄します。

リソースがパイプラインにバインドされている状態で OfferResources を呼び出してそのリソースを提供(オファー)すると、そのリソースのバインドは解除されます。マップされているリソースに対して OfferResources を呼び出すことはできません。リソースを提供した後は、IDXGIDevice2::ReclaimResource メソッドを呼び出してリソースを回収(リクレイム)するまで、そのリソースをマップしたりパイプラインにバインドしたりすることはできません。イミュータブル(変更不可)なリソースを提供するために OfferResources を呼び出すことはできません。

共有リソースを提供(オファー)するには、共有しているデバイスのうち 1 つでのみ OfferResources を呼び出します。リソースへの排他的アクセスを確保するには、IDXGIKeyedMutex オブジェクトを使用し、そのミューテックスを保持している間にのみ OfferResources を呼び出す必要があります。実際、IDXGIKeyedMutex を使用しない共有リソースの提供はサポートされていないため、IDXGIKeyedMutex を使用しない限り共有リソースを提供することはできません。

ユーザーモードディスプレイドライバーは、OfferResources の呼び出しで指定したリソースをすぐには提供(オファー)しない場合があります。ドライバーは、次に IDXGISwapChain::PresentIDXGISwapChain1::Present1、または ID3D11DeviceContext::Flush が呼び出されるまで、提供を延期できます。
Windows 7 用プラットフォーム更新プログラム: ランタイムは、非共有リソースに対して OfferResources が正しく使用されているかを検証しますが、意図された機能は実行しません。Windows 7 用プラットフォーム更新プログラムの詳細については、Platform Update for Windows 7 を参照してください。
vtbl 15 HRESULT ReclaimResources(DWORD NumResources, IDXGIResource** ppResources, BOOL* pDiscarded)

IDXGIDevice2::OfferResources を呼び出して以前に提供(オファー)したリソースへのアクセスを復元します。

NumResourcesDWORDinppResources 引数および pDiscarded 引数の配列に含まれるリソースの数。
ppResourcesIDXGIResource**in回収(リクレイム)するリソースの IDXGIResource インターフェイスへのポインターの配列。
pDiscardedBOOL*outoptionalブール値を受け取る配列へのポインター。配列内の各値は、ppResources パラメーターで指定された同じインデックスのリソースに対応します。ランタイムは、対応するリソースの内容が破棄されて現在は未定義である場合は各ブール値を TRUE に設定し、対応するリソースの以前の内容がそのまま残っている場合は FALSE に設定します。古い内容が破棄されたかどうかにかかわらず新しい内容でリソースを埋めるつもりであれば、呼び出し元は NULL を渡すことができます。

戻り値

ReclaimResources は次の値を返します。

解説(Remarks)

IDXGIDevice2::OfferResources を呼び出して 1 つ以上のリソースを提供(オファー)した後、それらのリソースを再び使用するには、その前に ReclaimResources を呼び出す必要があります。各リソースの内容が破棄されたかどうかを判断するには、pDiscarded の配列内の値を確認する必要があります。リソースが提供されている間にその内容が破棄された場合、現在の内容は未定義です。したがって、そのリソースを使用する前にリソースの内容を上書きする必要があります。

共有リソースを回収(リクレイム)するには、共有しているデバイスのうち 1 つでのみ ReclaimResources を呼び出します。リソースへの排他的アクセスを確保するには、IDXGIKeyedMutex オブジェクトを使用し、そのミューテックスを保持している間にのみ ReclaimResources を呼び出す必要があります。

Windows 7 用プラットフォーム更新プログラム: ランタイムは、非共有リソースに対して ReclaimResources が正しく使用されているかを検証しますが、意図された機能は実行しません。Windows 7 用プラットフォーム更新プログラムの詳細については、Platform Update for Windows 7 を参照してください。

vtbl 16 HRESULT EnqueueSetEvent(HANDLE hEvent)

未処理のレンダリングコマンドをすべてフラッシュし、以前に送信されたすべてのレンダリングコマンドが完了した後に、指定されたイベントオブジェクトをシグナル状態に設定します。

hEventHANDLEin

イベントオブジェクトへのハンドル。このハンドルは CreateEvent 関数または OpenEvent 関数が返します。すべての種類のイベントオブジェクト(手動リセット、自動リセットなど)がサポートされています。

このハンドルには EVENT_MODIFY_STATE アクセス権が必要です。アクセス権の詳細については、Synchronization Object Security and Access Rights を参照してください。

戻り値

成功した場合は S_OK を返します。それ以外の場合は、次のいずれかの値を返します。

Windows 7 用プラットフォーム更新プログラム: Platform Update for Windows 7 がインストールされた Windows 7 または Windows Server 2008 R2 では、EnqueueSetEventE_NOTIMPL で失敗します。Windows 7 用プラットフォーム更新プログラムの詳細については、Platform Update for Windows 7 を参照してください。

解説(Remarks)

EnqueueSetEvent は、以前に送信されたすべてのレンダリングコマンドが完了した後、またはデバイスが削除された後に、イベントオブジェクトに対して SetEvent 関数を呼び出します。

アプリケーションは EnqueueSetEvent を呼び出した後、直ちに WaitForSingleObject 関数を呼び出し、レンダリングコマンドが完了するまで自身をスリープ状態にすることができます。

表示(プレゼント)(IDXGISwapChain::Present)に関連する処理の完了を判断するために EnqueueSetEvent を使用することはできません。代わりに、IDXGISwapChain::GetFrameStatistics を使用することをお勧めします。

次のサンプルコードは、EnqueueSetEvent の使用方法を示しています。

void BlockingFinish( IDXGIDevice2* pDevice ) 
{
    // Create a manual-reset event object. 
    hEvent = CreateEvent( 
        NULL,               // default security attributes
        TRUE,               // manual-reset event
        FALSE,              // initial state is nonsignaled
        FALSE
        ); 

    if (hEvent == NULL) 
    { 
        printf("CreateEvent failed (%d)\n", GetLastError());
        return;
    }

    pDevice->EnqueueSetEvent(hEvent);    

    DWORD dwWaitResult = WaitForSingleObject( 
        hEvent, // event handle
        INFINITE);    // indefinite wait

    switch (dwWaitResult) 
    {
        // Event object was signaled
        case WAIT_OBJECT_0: 
            // Commands completed
            break; 

        // An error occurred
        default: 
            printf("Wait error (%d)\n", GetLastError()); 
            return 0; 
    }

    CloseHandle(hEvent);
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IDXGIDevice2 "{05008617-FBFD-4051-A790-144884B4F6A9}"
#usecom global IDXGIDevice2 IID_IDXGIDevice2 "{}"
#comfunc global IDXGIDevice2_OfferResources    14 int,sptr,int
#comfunc global IDXGIDevice2_ReclaimResources  15 int,sptr,var
#comfunc global IDXGIDevice2_EnqueueSetEvent   16 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。