IDXGIAdapter
COM公式ドキュメント
IDXGIAdapter インターフェイスは、ディスプレイサブシステム(1 つ以上の GPU、DAC、およびビデオメモリを含む)を表します。
解説(Remarks)
ディスプレイサブシステムはビデオカードと呼ばれることが多いですが、一部のマシンではディスプレイサブシステムがマザーボードの一部になっています。
ディスプレイサブシステムを列挙するには、IDXGIFactory::EnumAdapters を使用します。
特定のデバイスに対応するアダプターのインターフェイスを取得するには、IDXGIDevice::GetAdapter を使用します。
ソフトウェアアダプターを作成するには、IDXGIFactory::CreateSoftwareAdapter を使用します。
Windows Phone 8: この API はサポートされています。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
アダプター(ビデオカード)の出力(アウトプット)を列挙します。
| Output | DWORD | in | 出力(アウトプット)のインデックス。 |
| ppOutput | IDXGIOutput** | out | Output パラメーターで指定された位置にある IDXGIOutput インターフェイスへのポインターのアドレス。 |
戻り値
型: HRESULT
成功または失敗を示すコード(DXGI_ERROR を参照)。インデックスが出力(アウトプット)の数を超えている場合は DXGI_ERROR_NOT_FOUND が返されます。
アダプターが D3D_DRIVER_TYPE_WARP を使用して作成されたデバイスから取得されたものである場合、そのアダプターには出力がないため、DXGI_ERROR_NOT_FOUND が返されます。
解説(Remarks)
EnumOutputs は、まずデスクトップのプライマリが表示されている出力(アウトプット)を返します。この出力はインデックス 0 に対応します。その後、EnumOutputs は他の出力を返します。
例
出力(アウトプット)の列挙
EnumOutputs を使用してアダプター上のすべての出力を列挙する方法の例を次に示します。
UINT i = 0;
IDXGIOutput * pOutput;
std::vector<IDXGIOutput*> vOutputs;
while(pAdapter->EnumOutputs(i, &pOutput) != DXGI_ERROR_NOT_FOUND)
{
vOutputs.push_back(pOutput);
++i;
}
アダプター(またはビデオカード)の DXGI 1.0 の記述を取得します。
| pDesc | DXGI_ADAPTER_DESC* | out | アダプターを記述する DXGI_ADAPTER_DESC 構造体へのポインター。このパラメーターは NULL であってはなりません。フィーチャーレベル 9 のグラフィックスハードウェアでは、GetDesc は DXGI_ADAPTER_DESC の VendorId、DeviceId、SubSysId、Revision の各メンバーにゼロを返し、Description メンバーの記述文字列には「Software Adapter」を返します。 |
戻り値
型: HRESULT
成功した場合は S_OK を返します。それ以外の場合、pDesc パラメーターが NULL であれば E_INVALIDARG を返します。
解説(Remarks)
グラフィックスアプリケーションは、DXGI API を使用して、Windows Display Driver Model (WDDM) ドライバーを備えたシステムで正確なグラフィックスメモリの値のセットを取得できます。以下に、関係する重要な手順を示します。
-
グラフィックスドライバーモデルの判定 — DXGI は WDDM ドライバーを備えたシステムでのみ利用できるため、アプリケーションはまず次の API を使用してドライバーモデルを確認する必要があります。
HasWDDMDriver() { LPDIRECT3DCREATE9EX pD3D9Create9Ex = NULL; HMODULE hD3D9 = NULL; hD3D9 = LoadLibrary( L"d3d9.dll" ); if ( NULL == hD3D9 ) { return false; } // /* Try to create IDirect3D9Ex interface (also known as a DX9L interface). This interface can only be created if the driver is a WDDM driver. */ // pD3D9Create9Ex = (LPDIRECT3DCREATE9EX) GetProcAddress( hD3D9, "Direct3DCreate9Ex" ); return pD3D9Create9Ex != NULL; } -
グラフィックスメモリ値の取得。— アプリケーションがドライバーモデルを WDDM と判定した後は、Direct3D 10 以降の API と DXGI を使用してグラフィックスメモリの量を取得できます。Direct3D デバイスを作成した後、次のコードを使用して、利用可能なグラフィックスメモリの量を含む DXGI_ADAPTER_DESC 構造体を取得します。
IDXGIDevice * pDXGIDevice; hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice); IDXGIAdapter * pDXGIAdapter; pDXGIDevice->GetAdapter(&pDXGIAdapter); DXGI_ADAPTER_DESC adapterDesc; pDXGIAdapter->GetDesc(&adapterDesc);
システムがグラフィックスコンポーネント用のデバイスインターフェイスをサポートしているかどうかを確認します。
| InterfaceName | GUID* | in | サポートの有無を確認するデバイスバージョンのインターフェイスの GUID。通常は __uuidof(IDXGIDevice) を指定します。これは Direct3D 9 の UMD(ユーザーモードドライバー)バイナリのバージョン番号を返します。WDDM 2.3 以降、ドライバーパッケージ内のすべてのドライバーコンポーネント(D3D9、D3D11、D3D12)は単一のバージョン番号を共有することが求められているため、これはどの API を使用しているかにかかわらずドライバーのバージョンを照会する良い方法です。 |
| pUMDVersion | LONGLONG* | out | InterfaceName のユーザーモードドライバーのバージョン。これはインターフェイスがサポートされている場合にのみ返されます。それ以外の場合、このパラメーターは NULL になります。 |
戻り値
型: HRESULT
S_OK はインターフェイスがサポートされていることを示します。それ以外の場合は DXGI_ERROR_UNSUPPORTED が返されます(詳細については DXGI_ERROR を参照してください)。
解説(Remarks)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDXGIAdapter "{2411E7E1-12AC-4CCF-BD14-9798E8534DC0}" #usecom global IDXGIAdapter IID_IDXGIAdapter "{}" #comfunc global IDXGIAdapter_EnumOutputs 7 int,sptr #comfunc global IDXGIAdapter_GetDesc 8 var #comfunc global IDXGIAdapter_CheckInterfaceSupport 9 var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDXGIAdapter "{2411E7E1-12AC-4CCF-BD14-9798E8534DC0}" #usecom global IDXGIAdapter IID_IDXGIAdapter "{}" #comfunc global IDXGIAdapter_EnumOutputs 7 int,sptr #comfunc global IDXGIAdapter_GetDesc 8 sptr #comfunc global IDXGIAdapter_CheckInterfaceSupport 9 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。