Claire AndrewsさんのNew in DirectX— Feature Level 12_2を訳したのですが、ダメと言われてしまいました(見出しにしかない情報があるって?まぁいろいろありますよ)。
ただ、公式の仕様書(Feature Level 12_2)があって、こちらはオープンソースだから、こちらを使うのが良いよと、言われたので、こちらを訳してみました。
機能レベル 12_2 は、次の機能を含むかなり大きな機能追加で 個別の利用可能性を調べるのではなく、まとめて(いわばGPUの世代を)確認することができます。
- DirectX レイトレーシング
- メッシュシェーダ
- 可変解像度シェーディング
- サンプラーフィードバック
そして、DirectX 12 Ultimate の機能レベルでの呼び名です。
機能レベル 12_2 は、NVIDIA のRTX GPUや、AMDのRDNA 2のGPUが対応しています。Windows Insider Programのビルドバージョン20170以降のSDKですでに利用可能だそうです。
こちらの記事は、Feature Level 12_2 を訳したものです。
元仕様書は、microsoft が著作権を持っており、CC4.0で公開されています。
機能レベル12_2
目的
機能レベル12_2は、Windowsプラットフォーム上のグラフィカルなゲームやアプリケーションでの顧客体験を向上させるために、GPUエコシステム全体で一連の機能を標準化するための手段として存在しています。
クエリー と API
ランタイムは、他のフィーチャレベルのクエリーと同じ方法で、12_2機能レベルをグラフィックスドライバに問い合わせます。
備考
フィーチャーレベル12_2を、正しいCAPSセットが正しい値であることに基づいて推測することができますが、機能レベルの推測は既存の設計に反するため、ランタイムはこれを行いません。機能レベル12_2は、ドライバーによって明示的に報告されるものです。
12_2の列挙値は次のように表されます:
typedef
enum D3D_FEATURE_LEVEL
{
// ...
D3D_FEATURE_LEVEL_12_2 = 0xc200
} D3D_FEATURE_LEVEL;
機能レベル12_2は、他のフィーチャーレベルと同じように、例えばデバイスを作成するときに要求されます:
ComPtr<ID3D12Device> device;
D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_12_2;
HRESULT hr = D3D12CreateDevice(nullptr, featureLevel, IID_PPV_ARGS(&m_spDevice));
if (SUCCEEDED(hr))
{
// 機能レベルはディフォルトアダプターでサポートされている
}
機能
機能レベル12_2は、CheckFeatureSupportで直接問い合わせ可能な、機能と機能階層(tier)で表現されます。
デバイスが機能レベル12_2の場合、次のようになります。
機能 | 12_2 での最低限 | 公開仕様 |
---|---|---|
要求ドライバーモデル | WDDM 2.0 | |
シェーダモデル | 6.5 | Link |
レイトレーシング階層 | Tier 1.1 | Link |
可変シェーディングレート | Tier 2 | Link |
メッシュシェーダ階層 | Tier 1 | Link |
サンプラーフィードバック | Tier 0.9 | Link |
リソースバインディング階層 | Tier 3 | Link |
タイルリソース | Tier 3 | |
保守的(Conservative)ラスタライズ | Tier 3 | Link |
ルートシグネチャ階層 | 1.1 | Link |
深度境界テストサポート | TRUE | Link |
即時書き込みバッファサポートフラグ | Direct, Compute, Bundle | |
リソース単位のGPU仮想アドレスビット最大値(MaxGPUVirtualAddressBitsPerResource) | 40 | |
プロセス単位のGPU仮想アドレスビット最大値(MaxGPUVirtualAddressBitsPerProcess) | 40 |
さらに、次のフラグが設定されています。
機能 | 12_2 での値 | 機能(英語) |
---|---|---|
ウェーブ単位の操作 | TRUE | WaveOps |
出力合成でのロジック操作 | TRUE | OutputMergerLogicOp |
任意のシェーダからのVPとRTの配列インデックス、GSエミュレーションなしでラスタライザをサポート | TRUE | VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportWithoutGSEmulation |
クエリーのタイムスタンプをコピーするクエリーのサポート | TRUE | CopyQueueTimestampQueriesSupported |
完全に型指定された形式のキャストのサポート | TRUE | CastingFullyTypedFormatSupported |
Int64シェーダ操作 | TRUE | Int64ShaderOps |
備考
一部の仕様、特に2019年5月のアップデート以前の仕様はDirectX-Specsのリポジトリに移行されていません。
DDI
Direct3D 12 UMD DDI には、機能レベルを説明するための列挙型 D3D12DDI_3DPIPELINELEVEL があります。この列挙型には、機能レベル 12.2 の値があります。
typedef enum D3D12DDI_3DPIPELINELEVEL
{
// ...
D3D12DDI_3DPIPELINELEVEL_12_2 = 14,
} D3D12DDI_3DPIPELINELEVEL;
ドライバーがサポートしている機能レベルを見つけるために、ランタイムはPFND3D12DDI_GETCAPSを次の設定で呼び出します。
- D3D12DDICAPS_TYPE_3DPIPELINESUPPORT, もしくは
- D3D12DDICAPS_TYPE_3DPIPELINESUPPORT1
この2つのGetCapsの使い方の違いは以下の通りです。
セレクター | データ解釈 | 有効な帰り値を与える機能レベル |
---|---|---|
3DPIPELINESUPPORT | D3D12DDI_3DPIPELINELEVEL, 簡単な出力値 | 12.1 と、それ以前 |
3DPIPELINESUPPORT1 | D3D12DDI_3DPIPELINESUPPORT1_DATA_0081, 入力・出力フィールドを含む構造体 | すべて。12.2 と、それ以降を含む |
D3D12DDI_3DPIPELINESUPPORT1_DATA_0081の定義は以下の通りです。
typedef struct D3D12DDI_3DPIPELINESUPPORT1_DATA_0081
{
D3D12DDI_3DPIPELINELEVEL HighestRuntimeSupportedFeatureLevel; // 入力
D3D12DDI_3DPIPELINELEVEL MaximumDriverSupportedFeatureLevel; // 出力
} D3D12DDI_3DPIPELINESUPPORT1_DATA_0081;
3DPIPELINESUPPORT1の場合、ランタイムはHighestRuntimeSupportedFeatureLevelの値を設定します。
ドライバーは、HighestRuntimeSupportedFeatureLevelを超えないMaximumDriverSupportedFeatureLevelの値を返します。
備考
実際には:
- Manganese (20H2)以前のOSに組み込まれたDirect3Dのバージョンでは、3DPIPELINESUPPORTを使用します。
- Iron OS 以降に組み込まれたDirect3Dのバージョンでは、3DPIPELINESUPPORT1を使用し、失敗した場合は3DPIPELINESUPPORTに差し戻します。
APIレベルとDDIレベルのレポート機能の不一致
D3D12_COMMAND_LIST_SUPPORT_FLAG_BUNDLE機能のWriteBufferImmediateSupportFlagsは、DDIレベルでD3D12DDI_COMMAND_QUEUE_FLAG_3Dを報告するドライバーのAPIレベルでオンになります。
検証
機能レベル12_2で作成されたDirect3D 12デバイスが少なくとも本ドキュメントの「機能」セクションで説明されている機能を満たすことを検証するためのDirect3D 12適合性テストがあります。これは、ドライバーではなくランタイムの動作を実行するため、HLKテストではなく適合性テストです。機能レベル 12_2 の特定のテストとは別に、CheckFeatureSupport の機能がデバイスの動作と適切に一致していることを確認するためのテストも行われています。