none
D3D11CreateDeviceについて RRS feed

  • 質問

  • D3D11CreateDeviceの引数に関しての質問です。

    第一引数(pAdapter)にNULLを渡すと既定のアダプタが使用されますが、

    IDXGIFactory::EnumAdaptersよりアダプタインデクス0で取得したものを指定した場合、エラーとなりデバイスの作成に失敗します。

    既定のアダプタはインデクス0と同じだと思うのですが、指定した場合なぜエラーとなるのでしょうか?

    もう1点質問です。

    第五引数(pFeatureLevels)にNULLを渡すと、自動で機能レベルの配列が使用されるとの事ですが、

    その場合第六引数(FeatureLevels)に指定する要素数はいくつになるのでしょうか?

    D3D11CreateDeviceのページには、

    pFeatureLevels を NULL に設定すると、次のような機能レベルの配列が使用されます。

    { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1, };

    と記載されていますが、上記の要素数である6を指定するのでしょうか。

    それとも「のような」と書いてあるようにあくまで一例であり、配列は不定なのでしょうか。

    ご回答のほど、よろしくお願い致します。

    2014年11月17日 15:02

回答

  • 質問するときはまず開発環境・ターゲット環境の情報(Visual C++のバージョン、Windows SDK/DirectX SDKのバージョン、OS、CPU、グラフィックスカードなど)を詳しく書きましょう。特にDirectXやOpenGLのようにハードウェアアクセラレーターを使用するAPIを使用するときは、ハードウェア環境(GPU)に関する情報を提示するのは必須です。マルチGPU環境・マルチモニター環境だと勝手が違うこともあります。

    [1] 第1引数 IDXGIAdapter* pAdapter

    第2引数 D3D_DRIVER_TYPE DriverType に D3D_DRIVER_TYPE_UNKNOWN をきちんと指定していますか?

    また、アダプターを列挙する際、DXGI 1.1系インターフェイスの IDXGIFactory1, CreateDXGIFactory1(), IDXGIAdapter1, IDXGIFactory1::EnumAdapters1() を使っていますか?

    可能であれば、D3D11CreateDevice()関数の呼び出し箇所、および前後のソースコードをこの場で提示することで、何か誤りが分かるかもしれません。

    [2] 第5引数 CONST D3D_FEATURE_LEVEL* pFeatureLevels と 第6引数 UINT FeatureLevels

    pFeatureLevelsにNULL/nullptrを指定する場合、FeatureLevelsは0を指定します。

    この手の呼び出し方をするときは、たいていこのパターンです(常にそうだとは限りませんが)。

    d3d11.h ヘッダーのSAL注釈も参考にできます。

    関数パラメーターおよび戻り値の注釈設定

    ちなみに、D3D11CreateDevice()の日本語版ヘルプの説明は情報が古く、Direct3D 11.1以降に関する情報が記載されていません。Windows 8以降(Windows SDK 8.0以降)の場合、D3D_FEATURE_LEVEL_11_1がありえますが、pFeatureLevelsにNULLを指定した場合は、以前のバージョンと変わらず内部で11_0~9_1の代替配列が使用されます。

    なお日本語版ヘルプにあいまいな点を感じたら、まず原文である英語版のほうを読みましょう。他にもDirectX SDKの日本語版ヘルプは非常にミスが多く、あまり信用しないほうがよいです。

    D3D11CreateDevice function (Windows)

    • 編集済み sygh 2014年11月17日 16:15
    • 回答としてマーク 杉ぽん 2014年11月18日 15:00
    2014年11月17日 15:51

すべての返信

  • 質問するときはまず開発環境・ターゲット環境の情報(Visual C++のバージョン、Windows SDK/DirectX SDKのバージョン、OS、CPU、グラフィックスカードなど)を詳しく書きましょう。特にDirectXやOpenGLのようにハードウェアアクセラレーターを使用するAPIを使用するときは、ハードウェア環境(GPU)に関する情報を提示するのは必須です。マルチGPU環境・マルチモニター環境だと勝手が違うこともあります。

    [1] 第1引数 IDXGIAdapter* pAdapter

    第2引数 D3D_DRIVER_TYPE DriverType に D3D_DRIVER_TYPE_UNKNOWN をきちんと指定していますか?

    また、アダプターを列挙する際、DXGI 1.1系インターフェイスの IDXGIFactory1, CreateDXGIFactory1(), IDXGIAdapter1, IDXGIFactory1::EnumAdapters1() を使っていますか?

    可能であれば、D3D11CreateDevice()関数の呼び出し箇所、および前後のソースコードをこの場で提示することで、何か誤りが分かるかもしれません。

    [2] 第5引数 CONST D3D_FEATURE_LEVEL* pFeatureLevels と 第6引数 UINT FeatureLevels

    pFeatureLevelsにNULL/nullptrを指定する場合、FeatureLevelsは0を指定します。

    この手の呼び出し方をするときは、たいていこのパターンです(常にそうだとは限りませんが)。

    d3d11.h ヘッダーのSAL注釈も参考にできます。

    関数パラメーターおよび戻り値の注釈設定

    ちなみに、D3D11CreateDevice()の日本語版ヘルプの説明は情報が古く、Direct3D 11.1以降に関する情報が記載されていません。Windows 8以降(Windows SDK 8.0以降)の場合、D3D_FEATURE_LEVEL_11_1がありえますが、pFeatureLevelsにNULLを指定した場合は、以前のバージョンと変わらず内部で11_0~9_1の代替配列が使用されます。

    なお日本語版ヘルプにあいまいな点を感じたら、まず原文である英語版のほうを読みましょう。他にもDirectX SDKの日本語版ヘルプは非常にミスが多く、あまり信用しないほうがよいです。

    D3D11CreateDevice function (Windows)

    • 編集済み sygh 2014年11月17日 16:15
    • 回答としてマーク 杉ぽん 2014年11月18日 15:00
    2014年11月17日 15:51
  • すでに回答がついていますが参考までに。

    類似の D3D11CreateDeviceAndSwapChain を使ったサンプルが MSDN に掲載されていますが、NULL かつ 0 が使われています。
    関数のドキュメントを見てもらえばわかりますが、D3D11CreateDevice と同じ名前・役割を持つ部分となります。
    http://msdn.microsoft.com/en-us/library/ff476879(v=vs.85).aspx

    2014年11月17日 15:56
    モデレータ
  • syghさん

    ご丁寧にご回答いただきましてありがとうございます。

    D3D_DRIVER_TYPE_UNKNOWNの指定漏れでした、

    ドキュメントの見落としでお恥ずかしい限りです。

    pFeatureLevelsがNULLの場合の挙動も理解しました。

    有益な情報を色々提示していただいて感謝致します。

    2014年11月18日 15:00
  • Azuleanさん

    情報ありがとうございます。

    参考に致します。

    2014年11月18日 15:01