デバイスの選択 (Direct3D 9)

アプリケーションでは、サポートされている Direct3D デバイス タイプを調べるためにハードウェアにクエリできます。ここでは、ディスプレイ アダプターの列挙と Direct3D デバイスの選択に関与する主要なタスクについて説明します。

適切な Direct3D デバイスを選択するには、アプリケーションで一連のタスクを実行する必要があります。次の手順は全画面モードのアプリケーションを対象としており、多くの場合、ウィンドウ表示モードのアプリケーションではこれらのほとんどの手順をスキップできることを覚えておいてください。

  1. 最初に、アプリケーションでシステム上のディスプレイ アダプターを列挙する必要があります。アダプターは、物理的なハードウェアの一部です。デュアルヘッド ディスプレイと同様に、グラフィック カードが複数のアダプターを含む可能性があることに注意してください。複数モニターのサポートに関係がないアプリケーションは、この手順を無視して、手順 2 で D3DADAPTER_DEFAULT をIDirect3D9::EnumAdapterModes メソッドに渡すことができます。

  2. アプリケーションでは、各アダプターに対して、IDirect3D9::EnumAdapterModes を呼び出すことによって、サポートされているディスプレイ モードを列挙します。

  3. アプリケーションは必要に応じて、次のコード例で示すように、IDirect3D9::CheckDeviceType を呼び出すことによって、列挙された各ディスプレイ モードにハードウェア アクセラレーションが存在しているかどうかをチェックします。これは IDirect3D9::CheckDeviceType の用途の 1 つでしかないことを覚えておいてください。詳細については、「ハードウェア サポートの判定 (Direct3D 9)」を参照してください。

    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    Params.BackBufferFormat = D3DFMT_X1R5G5B5; 
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, 
                      Device.m_DevType, 
                      Params.BackBufferFormat, Params.BackBufferFormat, 
                      FALSE))) 
        return E_FAIL;
    
  4. アプリケーションでは、IDirect3D9::GetDeviceCaps メソッドを呼び出すことによって、このアダプター上のデバイスに必要な機能レベルをチェックします。このメソッドによって返された能力は、IDirect3D9::CheckDeviceType によって検証された、すべてのディスプレイ モードのデバイスに対して一定であることが保証されます。

  5. デバイスは、常に、そのデバイスでサポートされている列挙されたディスプレイ モードのフォーマットのサーフェスにレンダリングできます。アプリケーションで別のフォーマットのサーフェスにレンダリングする必要がある場合は、IDirect3D9::CheckDeviceFormat を呼び出すことができます。デバイスでそのフォーマットにレンダリングできる場合は、IDirect3D9::GetDeviceCaps によって返されたすべての能力を適用できることが保証されます。

  6. 最後に、アプリケーションで IDirect3D9::CheckDeviceMultiSampleType メソッドを使用することによって、レンダリング フォーマットでフルシーン アンチエイリアシングなどのマルチサンプリング テクニックがサポートされるかどうかを決定できます。

上記の手順を完了したら、そのアプリケーションが動作可能なディスプレイ モードの一覧が必要となります。最後の手順では、要求された数のバッファーとアンチエイリアシングに対応するために十分な量の、デバイスからアクセス可能なメモリーが利用可能であることを確認します。モードでのメモリー消費とマルチサンプルの組み合わせを検証せずに予測することは不可能なため、このテストは必須となります。また、ディスプレイ アダプターのアーキテクチャの中には、デバイスからアクセス可能なメモリーの量が一定ではないものがあります。これは、アプリケーションが全画面モードになるときに、ビデオ メモリー不足のエラーをレポートできなければならないことを意味します。通常は、アプリケーションで、ユーザーに提供されるモード一覧から全画面モードを削除するか、または、バック バッファーの数を減らすか複雑なマルチサンプリング テクニックの使用を少なくすることによって消費メモリーの削減を試みる必要があります。

ウィンドウ表示モードのアプリケーションでは、同様の一連のタスクが実行されます。

  1. それにより、ウィンドウのクライアント領域でカバーされるデスクトップの矩形が決定されます。

  2. そのクライアント領域をカバーしているモニターのアダプターが検索され、アダプターが列挙されます。そのクライアント領域が複数のアダプターによって所有されている場合は、アプリケーションで、各アダプターを個別に稼動させることや、単一のアダプターを稼動させて、表示の際に Direct3D でピクセルをあるデバイスから別のデバイスへ転送することを選択できます。アプリケーションでは、上記の 2 つの手順を無視して、D3DADAPTER_DEFAULT アダプターを使用することもできます。これにより、ウィンドウがセカンダリ モニターに置かれる場合に処理が遅くなる可能性があることに注意してください。

  3. デスクトップ モードでの指定されたフォーマットのバック バッファーへのレンダリングが、デバイスでサポートされるかどうかを決定するには、アプリケーションで IDirect3D9::CheckDeviceType を呼び出す必要があります。IDirect3D9::GetAdapterDisplayMode は、次のコード例で示すように、デスクトップのディスプレイ フォーマットを決定するために使用できます。

    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    // Use the current display mode.
    D3DDISPLAYMODE mode;
    
    if(FAILED(m_pD3D->GetAdapterDisplayMode(Device.m_uAdapter , &mode)))
        return E_FAIL;
    
    Params.BackBufferFormat = mode.Format;
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, Device.m_DevType, 
    Params.BackBufferFormat, Params.BackBufferFormat, FALSE)))
        return E_FAIL;