Class CDeviceInformation

【メソッド】
関数解説
CDeviceInformationコンストラクタ
~CDeviceInformationデコンストラクタ
getAdapters全ての情報の取り出し
getCurrentAdapter使用が推奨されるビデオボードをあらわす番号
getNumAdapters使用可能なビデオボードの枚数を返す


CDeviceInformation(LPDIRECT3D8 lpd3d,BOOL useD,DWORD minD,DWORD minS,ConfirmDeviceCallback cb)

解説

ビデオボード上の使用可能なモード(device)について、情報を集める。
useD,minD,minS,cb の4つの引数を使って、アプリケーションが必要とする条件を
指定し、条件にあったモードについての情報を集める。


引数
lpd3d有効なLPDIRECT3D8 型ポインタ
useDZバッファが必要か?true: 必要 false: 不要
minDZバッファに要求するbit幅。大きい程精度が高い。
minSステンシルバッファに要求するbit幅。不要なら0を渡す。
cbモード確認用コールバック。不要ならNULLを渡す。


D3DAdapterInfo* getAdapters()

解説

ビデオボード上の使用可能なモード(device)について、情報を取り出す。

引数

無し。


返値

D3DAdapterInfo 型配列へのポインタ。
要素数は、関数 getNumAdapters で得る事ができる。




DWORD getNumAdapters ()

解説

使用可能なビデオボードの数を返す。これは、getAdapters() で取得される配列の要素数でもある。

引数

無し。


返値

DWORD 型の整数。ビデオボードの数。




DWORD getCurrentAdapter ()

解説

 使用が推奨されるビデオボード番号を返す。
この番号によって、getAdapters() が返した配列にアクセスできる。

引数

無し。


返値

DWORD 型の整数。使用が推奨されるビデオボード番号。




HRESULT ConfirmDeviceCallback(D3DCAPS8* caps,DWORD behavior,D3DFORMAT fmt);

解説

 ビデオボード上の使用可能なモード(device)について、情報を集める際、
アプリケーションが特別な機能を必要とする場合に、このコールバックを登録する事で、
あるデバイスについて使用可能かどうかを判定できる。

具体的には、CDeviceInformation コンストラクタの中から、発見した各デバイス毎に、
このコールバックを呼び出し、アプリケーション側に判断させる。


引数
capsD3DCAPS型のポインタ、判断に必要な情報が格納されている。
behaviorデバイスの動作に関する以下のフラグのうち一つ以上の組み合わせ
D3DCREATE_HARDWARE_VERTEXPROCESSING
D3DCREATE_MIXED_VERTEXPROCESSING
D3DCREATE_PUREDEVICE
D3DCREATE_SOFTWARE_VERTEXPROCESSING
fmtフレームバッファのフォーマット。

返値
S_OKこのデバイスでOKである。
E_FAILこのデバイスは使用できない。



データ型


D3DAdapterInfo
struct D3DAdapterInfo
{
    D3DADAPTER_IDENTIFIER8 d3dAdapterIdentifier;
    D3DDISPLAYMODE d3ddmDesktop; 
    DWORD          dwNumDevices;
    D3DDeviceInfo  *devices;
    DWORD          dwCurrentDevice;
};
解説

ビデオボードに関する情報が格納される構造体。
一枚のビデオボードに関する情報はすべて、このデータ型に格納される。


メンバ変数
メンバ名データ型説明
d3dAdapterIdentifierD3DADAPTER_IDENTIFIER8ビデオボードに関するシステム情報(DirectX SDK のドキュメント参照のこと)
d3ddmDesktopD3DDISPLAYMODEアプリケーション起動時点でのグラフィックモード
dwNumDevicesDWORDデバイス数
devicesD3DDeviceInfoデバイス情報配列
dwCurrentDeviceDWORD推奨デバイス番号



D3DDeviceInfo
struct D3DDeviceInfo
{
    D3DDEVTYPE   DeviceType;      // Reference, HAL, etc.
    D3DCAPS8     d3dCaps;         // Capabilities of this device
    DWORD        dwNumModes;
    BOOL         bCanDoWindowed;  // Whether this device can work in windowed mode
    D3DModeInfo  *modes;
    DWORD        dwCurrentMode;
    BOOL         bWindowed;
    D3DMULTISAMPLE_TYPE MultiSampleType;
};
解説

ビデオボード上のデバイスに関する情報が格納される構造体。
デバイスとは、画像を描画するものと考えると良い。
通常2種類である。(HAL/REF)


メンバ変数
メンバ名データ型説明
DeviceTypeD3DDEVTYPE描画デバイスの種類(D3DDEVTYPE_HAL/D3DDEVTYPE_REF)
d3dCapsD3DCAPS8このデバイスの能力をあらわすシステム情報(DirectX8 SDK 参照)
bCanDoWindowedBOOLウインドウにレンダリング可能か。true:可能 false:フルスクリーンのみ
dwNumModesDWORD使用可能なモード数
modesD3DModeInfoモード情報
dwCurrentModeDWORD推奨モード番号
bWindowedBOOL現在の動作モード。true:ウインドウモード false:フルスクリーンモード
MultiSampleTypeD3DMULTISAMPLE_TYPE現在常に D3DMULTISAMPLE_NONE




D3DModeInfo
struct D3DModeInfo
{
    DWORD      Width;      // Screen width in this mode
    DWORD      Height;     // Screen height in this mode
    D3DFORMAT  Format;     // Pixel format in this mode
    DWORD      dwBehavior; // Hardware / Software / Mixed vertex processing
    D3DFORMAT  DepthStencilFormat; // Which depth/stencil format to use with this mode
};
解説

ビデオボード上のモードに関する情報が格納される構造体。
ここで言うモードとは、基本的には画面解像度とピクセルフォーマットに関する情報の組み合わせである。

先ほどのデバイスが画像を描画する対象になる。


メンバ変数
メンバ名データ型説明
WidthDWORDスクリーンのX方向解像度
HeightDWORDスクリーンのY方向解像度
FormatD3DFORMATピクセルフォーマット(詳細は、DirectX3 SDK を参照のこと)
dwBehaviorDWORD頂点処理の種類。以下のフラグのうち一つ以上の組み合わせ
D3DCREATE_HARDWARE_VERTEXPROCESSING
D3DCREATE_MIXED_VERTEXPROCESSING
D3DCREATE_PUREDEVICE
D3DCREATE_SOFTWARE_VERTEXPROCESSING
DepthStencilFormatD3DFORMATZバッファ・ステンシルバッファフォーマット



典型的な使用方法

簡易なサンプルを以下に示す。
#define kUseDepthBuffer true
    LPDIRECT3D8             pD3D;
    LPDIRECT3DDEVICE8       pD3DDEV;
    CDeviceInformation*     pDevices;
    D3DAdapterInfo*         pAdapters;
    D3DAdapterInfo*         pAdapterInfo;
    D3DDeviceInfo*          pDeviceInfo;
    D3DModeInfo*            pModeInfo;
    DWORD                   dwAdapter;
    D3DPRESENT_PARAMETERS   d3dprm;

    pD3D = Direct3DCreate8(D3D_SDK_VERSION);

    pDevices = new CDeviceInformation(pD3D,kUseDepthBuffer,16,0,NULL);

    pAdapters = pDevices->getAdapters();
    dwAdapter = pDevices->getCurrentAdapter();
    pAdapterInfo = &pAdapters[dwAdapter];
    pDeviceInfo = &pAdapterInfo->devices[pAdapterInfo->dwCurrentDevice];
    pModeInfo = &pDeviceInfo->modes[pDeviceInfo->dwCurrentMode];

    ZeroMemory( &d3dprm, sizeof(d3dprm) );
    d3dprm.Windowed               = pDeviceInfo->bWindowed;
    d3dprm.BackBufferCount        = 1;
    d3dprm.MultiSampleType        = pDeviceInfo->MultiSampleType;
    d3dprm.SwapEffect             = D3DSWAPEFFECT_DISCARD;
    d3dprm.EnableAutoDepthStencil = kUseDepthBuffer;
    d3dprm.AutoDepthStencilFormat = pModeInfo->DepthStencilFormat;
    d3dprm.hDeviceWindow          = hWnd;     /*    アプリケーションのHWND が必要    */

    if( d3dprm.Windowed )
    {
        RECT    rc;
        GetClientRect(hWnd, &rc);
        d3dprm.BackBufferWidth  = rc.right - rc.left;
        d3dprm.BackBufferHeight = rc.bottom - rc.top;
        d3dprm.BackBufferFormat = pAdapterInfo->d3ddmDesktop.Format;
    }else{
        d3dprm.BackBufferWidth  = pModeInfo->Width;
        d3dprm.BackBufferHeight = pModeInfo->Height;
        d3dprm.BackBufferFormat = pModeInfo->Format;
    }
    pD3D->CreateDevice( dwAdapter, pDeviceInfo->DeviceType,
                              hWnd, pModeInfo->dwBehavior, &d3dprm,
                              &pD3DDEV );
解説

基本的な使用方法は、まず、Direct3D オブジェクトを生成した後、 CDeviceInformation オブジェクトを生成。
そこで推奨されるデバイスについての情報を抽出し、その情報に基づいて、
Direct3DDevice を生成する、というものである。