IDXGIObject
COM公式ドキュメント
IDXGIObject インターフェイスは、すべての DXGI オブジェクトの基底インターフェイスです。IDXGIObject は、呼び出し元が定義したデータ(プライベートデータ)をオブジェクトに関連付けることと、親オブジェクトへのインターフェイスの取得をサポートします。
解説(Remarks)
IDXGIObject は、次のインターフェイスに対して基底クラスの機能を実装します。
Windows Phone 8: この API はサポートされています。メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
アプリケーション定義のデータをオブジェクトに設定し、そのデータを GUID に関連付けます。
| Name | GUID* | in | データを識別する GUID です。データを取得するには、この GUID を GetPrivateData の呼び出しで使用します。 |
| DataSize | DWORD | in | オブジェクトのデータのサイズです。 |
| pData | void* | in | オブジェクトのデータへのポインターです。 |
戻り値
Type: HRESULT
DXGI_ERROR 値のいずれかを返します。
解説(Remarks)
SetPrivateData は、指定されたデータのコピーを作成し、オブジェクトとともに格納します。
SetPrivateData がオブジェクトに格納するプライベートデータは、関連付けられた Direct3D オブジェクトが格納するプライベートデータ(たとえば、Microsoft Direct3D 11 デバイスが ID3D11Device::SetPrivateData を通じて格納するもの、または Direct3D 11 子デバイスが ID3D11DeviceChild::SetPrivateData を通じて格納するもの)と同じ記憶領域を占有します。
デバッグレイヤーは、オブジェクトインターフェイスのポインターの一覧を、その分かりやすい名前(フレンドリ名)とともに出力することで、メモリリークを報告します。既定のフレンドリ名は "<unnamed>" です。フレンドリ名を設定しておくと、対応するオブジェクトインターフェイスのポインターがリークの原因かどうかを判断できます。フレンドリ名を設定するには、SetPrivateData メソッドと、D3Dcommon.h にある既知のプライベートデータ GUID(WKPDID_D3DDebugObjectName)を使用します。たとえば、pContext に My name というフレンドリ名を付けるには、次のコードを使用します。
static const char c_szName[] = "My name";
hr = pContext->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );
WKPDID_D3DDebugObjectName を使用すると、メモリリークを追跡し、アプリケーションのパフォーマンス特性を把握できます。この情報は、メモリリークに関連するデバッグレイヤーの出力(ID3D11Debug::ReportLiveDeviceObjects)や、Windows 8 で追加された Windows イベント用のイベントトレースに反映されます。
オブジェクトのプライベートデータにインターフェイスを設定します。
| Name | GUID* | in | インターフェイスを識別する GUID です。 |
| pUnknown | IUnknown* | inoptional | デバイスオブジェクトに関連付ける IUnknown 派生インターフェイスへのポインターです。設定時にその参照カウントがインクリメントされ、IDXGIObject が破棄されるとき、または同じ GUID を指定して SetPrivateData もしくは SetPrivateDataInterface を呼び出してデータが上書きされるときにデクリメントされます。 |
戻り値
Type: HRESULT
次の DXGI_ERROR のいずれかを返します。
オブジェクトのデータへのポインターを取得します。
| Name | GUID* | in | データを識別する GUID です。 |
| pDataSize | DWORD* | inout | データのサイズです。 |
| pData | void* | out | データへのポインターです。 |
戻り値
Type: HRESULT
次の DXGI_ERROR のいずれかを返します。
解説(Remarks)
返されるデータが、以前に IDXGIObject::SetPrivateDataInterface によって設定された IUnknown またはその派生クラスへのポインターである場合は、参照カウントをデクリメントするために、ポインターが解放される前にそのポインターに対して ::Release() を呼び出す必要があります。
GetPrivateData の Name パラメーターに GUID_DeviceType を渡すと、ディスプレイアダプターオブジェクト(IDXGIAdapter、IDXGIAdapter1、IDXGIAdapter2)からデバイスの種類を取得できます。
ディスプレイアダプターが作成されたデバイスの種類を取得するには
- ID3D11Device または ID3D10Device オブジェクトに対して IUnknown::QueryInterface を呼び出し、IDXGIDevice オブジェクトを取得します。
- IDXGIDevice オブジェクトに対して GetParent を呼び出し、IDXGIAdapter オブジェクトを取得します。
- IDXGIAdapter オブジェクトに対して GUID_DeviceType を指定して GetPrivateData を呼び出し、ディスプレイアダプターが作成されたデバイスの種類を取得します。pData は、ドライバーの種類を表す列挙型の値(たとえば D3D_DRIVER_TYPE の値)を指します。
オブジェクトの親を取得します。
| riid | GUID* | in | 要求するインターフェイスの ID です。 |
| ppParent | void** | out | 親オブジェクトへのポインターのアドレスです。 |
戻り値
Type: HRESULT
DXGI_ERROR 値のいずれかを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDXGIObject "{AEC22FB8-76F3-4639-9BE0-28EB43A67A2E}" #usecom global IDXGIObject IID_IDXGIObject "{}" #comfunc global IDXGIObject_SetPrivateData 3 var,int,sptr #comfunc global IDXGIObject_SetPrivateDataInterface 4 var,sptr #comfunc global IDXGIObject_GetPrivateData 5 var,var,sptr #comfunc global IDXGIObject_GetParent 6 var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDXGIObject "{AEC22FB8-76F3-4639-9BE0-28EB43A67A2E}" #usecom global IDXGIObject IID_IDXGIObject "{}" #comfunc global IDXGIObject_SetPrivateData 3 sptr,int,sptr #comfunc global IDXGIObject_SetPrivateDataInterface 4 sptr,sptr #comfunc global IDXGIObject_GetPrivateData 5 sptr,sptr,sptr #comfunc global IDXGIObject_GetParent 6 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。