デバイスの選択 (Direct3D 9)

アプリケーションでは、ハードウェアに対してクエリを実行して、サポートされている Direct3D デバイスの種類を検出できます。 このセクションでは、ディスプレイ アダプターの列挙と Direct3D デバイスの選択に関連する主なタスクについて説明します。

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

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

  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. アダプターを列挙し、モニターがクライアント領域をカバーするアダプターを探します。 クライアント領域が複数のアダプターによって所有されている場合、アプリケーションは、各アダプターを個別に駆動するか、1 つのアダプターを駆動し、プレゼンテーションで 1 つのデバイスから別のデバイスに 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;
    

Direct3D デバイス