IDirect3DSwapChain9
COM公式ドキュメント
IDirect3DSwapChain9 (d3d9.h) インターフェイスは、アプリケーションがスワップチェーンを操作するために使用します。
解説(Remarks)
各デバイスには常に少なくとも 1 つのスワップチェーン (暗黙のスワップチェーン) が存在します。ただし、同一デバイスから複数のビューをレンダリングするための追加のスワップチェーンを、IDirect3DDevice9::CreateAdditionalSwapChain メソッドを呼び出して作成できます。
このインターフェイスは、すべての COM インターフェイスと同様に IUnknown インターフェイスを継承します。
LPDIRECT3DSWAPCHAIN9 型および PDIRECT3DSWAPCHAIN9 型は、IDirect3DSwapChain9 インターフェイスへのポインターとして定義されています。
typedef struct IDirect3DSwapChain9 *LPDIRECT3DSWAPCHAIN9, *PDIRECT3DSWAPCHAIN9;
スワップチェーンがフルスクリーンモードのときは、アプリケーションは関連付けられたデバイスウィンドウが可視状態であることを保証してください。不可視のウィンドウはユーザーモードのイベントを受け取れず、不可視のフルスクリーンウィンドウは他のウィンドウモードアプリケーションのプレゼンテーションを妨げます。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IDirect3DSwapChain9::Present (d3d9.h) メソッドは、スワップチェーンが所有するバックバッファーの並びのうち、次のバッファーの内容を表示します。
| pSourceRect | RECT* | in | ソース矩形へのポインター (RECT を参照)。サーフェス全体を表示するには NULL を指定します。スワップチェーンが D3DSWAPEFFECT_COPY で作成されている場合を除き、この値は NULL でなければなりません。矩形がソースサーフェスを超える場合、矩形はソースサーフェスにクリップされます。 |
| pDestRect | RECT* | in | クライアント座標での転送先矩形へのポインター (RECT を参照)。スワップチェーンが D3DSWAPEFFECT_COPY で作成されている場合を除き、この値は NULL でなければなりません。クライアント領域全体を埋めるには NULL を指定します。矩形が転送先クライアント領域を超える場合、矩形は転送先クライアント領域にクリップされます。 |
| hDestWindowOverride | HWND | in | このプレゼンテーションの対象として、そのクライアント領域が使用される転送先ウィンドウ。この値が NULL の場合、ランタイムはプレゼンテーションに D3DPRESENT_PARAMETERS の hDeviceWindow メンバーを使用します。 |
| pDirtyRegion | RGNDATA* | in | スワップチェーンが D3DSWAPEFFECT_COPY で作成されている場合を除き、この値は NULL でなければなりません。Flipping Surfaces (Direct3D 9) を参照してください。 この値が NULL 以外の場合、含まれるリージョンはバックバッファー座標で表されます。リージョン内の矩形は、更新が必要な最小のピクセル集合です。このメソッドはこれらの矩形を考慮し、リージョン内のピクセルのみ (または適度に拡張された矩形集合) をコピーすることでプレゼンテーションを最適化します。これは最適化の手掛かりにすぎず、アプリケーションはリージョンが厳密にコピーされることに依存すべきではありません。実装はソース矩形全体をコピーすることを選択する場合があります。 |
| dwFlags | DWORD | in | ドライバーがプレゼンテーションをスケジュールできないと報告した場合に、メソッドが直ちに戻るようアプリケーションが要求できるようにします。有効な値は 0、または D3DPRESENT_DONOTWAIT と D3DPRESENT_LINEAR_CONTENT の任意の組み合わせです。
|
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。メソッドが失敗した場合、戻り値は次のいずれかになります: D3DERR_DEVICELOST、D3DERR_DRIVERINTERNALERROR、D3DERR_INVALIDCALL、D3DERR_OUTOFVIDEOMEMORY、E_OUTOFMEMORY。
解説(Remarks)
Present メソッドは Present へのショートカットです。Present は更新され、ドライバーがプレゼンテーションをスケジュールできないと報告した場合にメソッドが直ちに戻るようアプリケーションが要求できるフラグを受け取るようになりました。
必要に応じてストレッチ処理が適用され、ソース矩形内のピクセルが対象ウィンドウのクライアント領域内の転送先矩形へ転送されます。
レンダーターゲットが現在のレンダーターゲットではない場合 (追加のスワップチェーンの作成によって得られたバックバッファーなど) を除き、Present を BeginScene と EndScene の間で呼び出すと失敗します。これは Direct3D 9 での新しい動作です。
IDirect3DSwapChain9::GetFrontBufferData (d3d9.h) メソッドは、スワップチェーンのフロントバッファーのコピーを生成し、そのコピーをシステムメモリバッファーに格納します。
| pDestSurface | IDirect3DSurface9* | in | スワップチェーンのフロントバッファーのコピーを受け取る IDirect3DSurface9 インターフェイスへのポインター。データは、垂直方向の最上行から最下行に向かって、行間に隙間なく連続した行として返されます。ウィンドウモードの場合、転送先サーフェスのサイズはデスクトップのサイズにしてください。フルスクリーンモードの場合、転送先サーフェスのサイズは画面サイズにしてください。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。 BackBuffer がバックバッファーの総数以上の場合、この関数は失敗し、D3DERR_INVALIDCALL を返します。
解説(Remarks)
このメソッドを呼び出すと、IDirect3DSurface9 インターフェイスの内部参照カウントが増加します。この IDirect3DSurface9 インターフェイスの使用終了時に IUnknown::Release を呼び出さないと、メモリリークが発生します。
IDirect3DSwapChain9::GetBackBuffer (d3d9.h) メソッドは、デバイスのスワップチェーンからバックバッファーを取得します。
| iBackBuffer | DWORD | in | 返すバックバッファーオブジェクトのインデックス。バックバッファーには 0 から (バックバッファーの総数 - 1) までの番号が付けられます。値 0 はフロントバッファーではなく、最初のバックバッファーを返します。フロントバッファーにはこのメソッドではアクセスできません。フロントバッファーのコピーを取得するには IDirect3DSwapChain9::GetFrontBufferData を使用してください。 |
| Type | D3DBACKBUFFER_TYPE | in | Direct3D 9 ではステレオビューはサポートされていないため、このパラメーターに指定できる有効な値は D3DBACKBUFFER_TYPE_MONO のみです。 |
| ppBackBuffer | IDirect3DSurface9** | out | 返されるバックバッファーサーフェスを表す IDirect3DSurface9 インターフェイスへのポインターのアドレス。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。 BackBuffer がバックバッファーの総数以上の場合、この関数は失敗し、D3DERR_INVALIDCALL を返します。
解説(Remarks)
このメソッドを呼び出すと、IDirect3DSurface9 インターフェイスの内部参照カウントが増加します。この IDirect3DSurface9 インターフェイスの使用終了時に IUnknown::Release を呼び出さないと、メモリリークが発生します。このメソッドで取得したサーフェスは、それが属するスワップチェーンを解放する前にすべて解放する必要があります。
IDirect3DSwapChain9::GetRasterStatus (d3d9.h) メソッドは、スワップチェーンが表示されるモニターのラスターを表す情報を返します。
| pRasterStatus | D3DRASTER_STATUS* | inout | このアダプターが駆動するモニター上のラスターの位置やその他の状態に関する情報が格納される D3DRASTER_STATUS 構造体へのポインター。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。pRasterStatus が無効な場合、またはデバイスが現在のスキャンラインの読み取りをサポートしていない場合は D3DERR_INVALIDCALL が返されます。デバイスがスキャンラインの読み取りをサポートしているかどうかを判断するには、D3DCAPS9 の Caps メンバーに D3DCAPS_READ_SCANLINE フラグが設定されているかを確認してください。
IDirect3DSwapChain9::GetDisplayMode (d3d9.h) メソッドは、ディスプレイモードの空間解像度、色解像度、およびリフレッシュレートを取得します。
| pMode | D3DDISPLAYMODE* | inout | アダプターのディスプレイモードに関するデータを格納する D3DDISPLAYMODE 構造体へのポインター。これはデバイスのディスプレイモードとは異なり、デバイスがフルスクリーンモードを所有していない場合はアクティブでないことがあります。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。メソッドが失敗した場合、戻り値は D3DERR_INVALIDCALL になることがあります。
IDirect3DSwapChain9::GetDevice (d3d9.h) メソッドは、スワップチェーンに関連付けられたデバイスを取得します。
| ppDevice | IDirect3DDevice9** | out | クエリが成功した場合にデバイスポインターが設定される IDirect3DDevice9 インターフェイスへのポインターのアドレス。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。メソッドが失敗した場合、戻り値は D3DERR_INVALIDCALL になることがあります。
解説(Remarks)
このメソッドにより、所有元のデバイスオブジェクトへたどることができます。
このメソッドを呼び出すと、IDirect3DDevice9 インターフェイスの内部参照カウントが増加します。この IDirect3DDevice9 インターフェイスの使用終了時に IUnknown::Release を呼び出さないと、メモリリークが発生します。
IDirect3DSwapChain9::GetPresentParameters (d3d9.h) メソッドは、スワップチェーンに関連付けられたプレゼンテーションパラメーターを取得します。
| pPresentationParameters | D3DPRESENT_PARAMETERS* | inout | プレゼンテーションパラメーターへのポインター。D3DPRESENT_PARAMETERS を参照してください。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。メソッドが失敗した場合、戻り値は D3DERR_INVALIDCALL になることがあります。
解説(Remarks)
このメソッドは、サーフェス (たとえばバックバッファー) の親スワップチェーンのプレゼンテーションパラメーターを確認するために使用できます。親スワップチェーンは IDirect3DSurface9::GetContainer で取得できます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDirect3DSwapChain9 "{794950F2-ADFC-458A-905E-10A10B0B503B}" #usecom global IDirect3DSwapChain9 IID_IDirect3DSwapChain9 "{}" #comfunc global IDirect3DSwapChain9_Present 3 var,var,sptr,var,int #comfunc global IDirect3DSwapChain9_GetFrontBufferData 4 sptr #comfunc global IDirect3DSwapChain9_GetBackBuffer 5 int,int,sptr #comfunc global IDirect3DSwapChain9_GetRasterStatus 6 var #comfunc global IDirect3DSwapChain9_GetDisplayMode 7 var #comfunc global IDirect3DSwapChain9_GetDevice 8 sptr #comfunc global IDirect3DSwapChain9_GetPresentParameters 9 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDirect3DSwapChain9 "{794950F2-ADFC-458A-905E-10A10B0B503B}" #usecom global IDirect3DSwapChain9 IID_IDirect3DSwapChain9 "{}" #comfunc global IDirect3DSwapChain9_Present 3 sptr,sptr,sptr,sptr,int #comfunc global IDirect3DSwapChain9_GetFrontBufferData 4 sptr #comfunc global IDirect3DSwapChain9_GetBackBuffer 5 int,int,sptr #comfunc global IDirect3DSwapChain9_GetRasterStatus 6 sptr #comfunc global IDirect3DSwapChain9_GetDisplayMode 7 sptr #comfunc global IDirect3DSwapChain9_GetDevice 8 sptr #comfunc global IDirect3DSwapChain9_GetPresentParameters 9 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。