月別アーカイブ: 2015年7月

Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い

GeForce GTX970 (新 Maxwell) は DirectX12 の Feature Level 12_1 に対応していることを確認しました。

RADEON GeForce GeForce Intel HD
R3 8400 GTX 970 GTX 750 Ti Graphics
GCN 1.1 HSA Maxwell 2 Maxwell Gen 8
15.200.1023 353.30 353.30 10.18.15.4235
FEATURE_LEVEL 12_0 12_1 11_0 11_1
DoublePrec true true true true
OMLogicOp true true true true
MinPrecision NONE NONE NONE NONE
TiledResTier Tier 2 Tier 3 Tier 1
ResBindingTier Tier 3 Tier 2 Tier 2 Tier 1
StencilRef true false false false
TypedUAVFormat true true true false
ROV Supported false true false true
ConservativeRas Tier 1
GPUVAddrBits 38 38 31 31
StdSwizzle64K false false false false
CrossNodeTier
CrossAdaptTex false false false false
VPAndRTArray false false false true
ResHeapTier Tier 2 Tier 1 Tier 1 Tier 2

同じ Maxwell でも、GeForce GTX900 では ROV 及び Conservative Rasterization など新しいハードウエア機能に対応していることがわかります。ただし Resource Binding/Heap Tier は Kelper/旧Maxwell 世代と変わらず、リソースの上限は残ったままです。他の GPU 含めたより詳しい表は下記ページに載せています。

Direct3D 12 (DirectX 12) Windows 詳細

これらの新しい機能自体は GPU が対応していれば Direct3D 11.3 でも使用できます。
DirectX の API Version は下記のように細かく別れています。API Version が古いと新しい機能を利用することができません。ID3D11Device2/ID3D11Device3 のように必要な機能に対応した Interface を使う必要があります。

Direct3D 11.0      Windows 7 (Vista)
Direct3D 11.1      Windows 8 (7)
Direct3D 11.2      Windows 8.1
Direct3D 11.3      Windows 10
Direct3D 12        Windows 10

D3D12 で使える Feature Level は今のところ下記の 4 種類で API Version とは異なっています。こちらは実際に GPU が対応している機能をグループ化したものです。option 扱いの個別の機能を 1つ 1つ判定するのは面倒ですが、Feature Level 毎に必須の機能を決めておくことでまとめて区別しやすくなります。OpenGL の Extension と GL Version 番号の関係に似ているかもしれません。

Feature Level 11_0      Fermi/Kepler/Maxwell1
Feature Level 11_1      GCN 1.0/Intel HD Graphics Iris Gen7.5/8
Feature Level 12_0      GCN 1.1/1.2
Feature Level 12_1      Maxwell2

GPU の機能面に注目する場合は、どの API に対応しているかよりも、どの FeatureLevel に属しているかの方が重要となります。Direct3D11 対応と書かれていても FeatureLevel 9_1 の可能性もあるからです。
下記のページにも同じ表を載せています。

Direct3D (Direct3D/12/11/10)

GeForce GTX970 の OpenGL の結果も下記に追加しました。

Desktop GPU Extensions

GL_VERSION: 4.5.0 NVIDIA 353.30
GL_RENDERER: GeForce GTX 970/PCIe/SSE2
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: 4.50 NVIDIA

↓ Maxwell v1 との違い

GL_AMD_vertex_shader_viewport_index
GL_AMD_vertex_shader_layer
GL_EXT_post_depth_coverage
GL_EXT_raster_multisample
GL_EXT_sparse_texture2
GL_EXT_texture_filter_minmax
GL_NV_conservative_raster
GL_NV_conservative_raster_dilate
GL_NV_fill_rectangle
GL_NV_fragment_coverage_to_color
GL_NV_fragment_shader_interlock
GL_NV_framebuffer_mixed_samples
GL_NV_geometry_shader_passthrough
GL_NV_path_rendering_shared_edge
GL_NV_sample_locations
GL_NV_sample_mask_override_coverage
GL_NV_shader_atomic_fp16_vector
GL_NV_viewport_array2

OpenGL ES 3.1 AEP 対応も他の GeForce と同じです。Extension に違いはありますが ASTC は Emulation となっています。今のところ HW 対応を確認した GPU は Intel HD Graphics (Gen8) のみ。

関連エントリ
3D 低レベル API の現状 Direct3D 12/Metal
Intel HD Graphics Gen 8 は Open GL 4.4/OpenGL ES 3.1 AEP 対応 (Broadwell/Cherry Trail/Braswell)
Direct3D 12 (DirectX12) GPU と API の対応表
DirectX 12 (Direct3D 12) と GPU の対応
Desktop GPU と OpenGL ES 3.1 API
GeForce の OpenGL 4.5 ES3_1_Compatibility は AEP 対応
CPU 負荷が低い 新しい 3D API

3D 低レベル API の現状 Direct3D 12/Metal

もうすぐ Windows 10 のリリースとともに DirectX 12 も使えるようになります。
Mantle から始まった新しい API への流れは、昨年の iOS Metal を経ていよいよ Desktop GPU でも起ころうとしています。

新しい API がこれまでと異なっているのは CPU の負担を大きく減らす事ができるということ。もう一つは GPU の世代交代タイミングと一致していないことです。
以前までの DirectX は GPU の新機能に合わせた API セットの追従でした。
新しい API は GPU の世代交代を必ずしも必要としていません。

・CPU の性能をより引き出せる。最適化の余地が生じる。
・GPU の世代交代タイミングが異なる。対応していれば現状の GPU のまま効果あり。

低レベル API とはいわば、これまで JavaScript や Python で書かれていたアプリケーションを C言語で書き直すようなものです。同じプロセッサの上で走らせても、その都度翻訳する手間が省けるためより効率よく実行できるようになります。

その反面、使える命令はより低レベルになるので、メモリ管理など多くの部分がアプリケーション側の負担となります。また従来の API と互換性が無いので、コードを大きく書き換える必要も生じます。

● Metal

Metal は iOS 向けに昨年(2014)リリースされておりすでに利用可能です。
対応している GPU は下記の通り。
iOS に採用された GPU としては 4世代目以降になります。

GPU                                 OpenGL         Metal iOS
-------------------------------------------------------------------
PowerVR MBX                         OpenGL ES 1.1
PowerVR Series 5    SGX535          OpenGL ES 2.0
PowerVR Series 5XT  SGX543MP/554MP  OpenGL ES 2.0
PowerVR Series 6    G6430           OpenGL ES 3.0  Metal GPUFamily1
PowerVR Series 6XT  GX6450/GX6650   OpenGL ES 3.0  Metal GPUFamily2

PowerVR 専用だった Metal ですが、Mac OS X (10.11 El Capitan) でも採用が発表されました。El Capitan 対応 Mac の中には D3D10 世代の GPU 搭載機種も含まれています。Metal の適用範囲がどこまでかは未確認です。

GPU                             OpenGL        Metal OSX
-------------------------------------------------------
GeForce 9400M                   OpenGL 3.3    ?
Intel HD Graphics 4000 (Gen7)   OpenGL 4.1    Metal

Intel HD Graphics 4000 (Ivy Bridge) は Direct3D 12 には対応していませんが、Metal では利用可能なことがわかりました。低レベル API は GPU の世代と直接関係ないため、API の種類によって対応する GPU も異なっています。HD 4000 に限っては Windows より OSX の方が性能を引き出せる可能性があります。

Metal のこれまでの問題は対応ハードウエアが限られていたことです。iPhone Simulator でも使えなかったので、Metal を使ったアプリケーション開発には iPhone 5s 以降か iPad Air/mini retina の実機が必要でした。Mac OS X の対応により開発のハードルが大きく下がります。また将来的には Simulator でも Metal を実行できるようになるかもしれません。

なお Metal はもともと Mobile GPU 向けに設計されており、想定している GPU は OpenGL ES 3.1 世代となっています。ComputeShader はありますが GeometryShader/Tessellator 等はないので、Desktop 向けとは言え OpenGL 4.x の完全な置換えにはなっていません。今後 OpenGL 4.x 相当まで拡張されるのか、それとも iOS と機能面の歩調を合わせて成長させていくのかは不明です。

● Direct3D 12

Mobile GPU から始まった Metal とは逆に、Direct3D は最初から Desktop GPU 向けにリリースされます。

例えば Metal では PowerVR (TBDR) を想定した RenderPass / CommandEncoder がありました。D3D12 には TB を想定した RenderTarget Group は特になく、その代わり RTV -> SRV のように依存が発生する場合のリソースバリアを自分で設定します。

リソースの上限も撤廃されており、RADEON GCN (Mantle) の仕様が API に影響を与えていると思われます。そのため D3D11 世代でも GCN 以外の D3D12 対応 GPU では仕様に完全に対応出来ていないものがあります。

同じ D3D11 世代でも RADEON HD5000/6000, Intel HD Graphics 2500/4000(Ivy Bridge/BayTrail) は D3D12 非対応となっています。ハード的な制約だけでなくドライバのサポート上の都合もあるのかもしれません。

GPU                               OpenGL  ES          D3D12
-----------------------------------------------------------
Intel HD Graphcis Gen7.5 Haswell    4.3   ES 3.1      D3D12
Intel HD Graphcis Gen8   Broadwell  4.4   ES 3.1 AEP  D3D12
GeForce Fermi                       4.5   ES 3.1 AEP  対応予定
GeForce Kepler                      4.5   ES 3.1 AEP  D3D12
GeForce Maxwell                     4.5   ES 3.1 AEP  D3D12
RADEON  GCN 1.0                     4.5   ES 3.1      D3D12
RADEON  GCN 1.1                     4.5   ES 3.1      D3D12

● Android

Windows, iOS/OSX 共に Mobile/Desktop 区別なく新しい API への移行が始まっています。
しかしながら Android では未だ Graphics 向けの Low Level API への対応が行われていません。SHIELD など Android ベースの Game Console もいくつか登場しているので、同等の API への要望は決して少なくはないでしょう。

ゲーム専用機は互換性を考える必要が無いため 3D API のオーバーヘッドが小さく、汎用 OS に対する利点の一つとなっていました。
低レベル API (Low Overhead API) の登場でその差が縮まります。汎用 OS を使った Console も実現しやすくなると同時に、性能だけ見れば専用機の必要性も薄れてくると思われます。

おそらく Khronos の Vulkan が採用されるのではないかと思いますが、Android が今後どのようなタイミングで新しい API に対応してくるか注目です。

関連エントリ
CPU 負荷が低い 新しい 3D API

Intel HD Graphics Gen 8 は Open GL 4.4/OpenGL ES 3.1 AEP 対応 (Broadwell/Cherry Trail/Braswell)

Broadwell 世代の Intel HD Graphics (Iris Pro) は OpenGL 4.4 に対応していることがわかりました。また ES3 Compatibility では OpenGL ES 3.1 Context を作成可能で GL_ANDROID_extension_pack_es31a が含まれます。つまり OpenGL ES 3.1 AEP です。

今後 Cerry Trail 搭載 Android 端末が登場したら同じように OpenGL ES 3.1 AEP に対応しているものと思われます。

# Braswell Celeron N3150 Windows 10 x64
GL_VERSION: 4.4.0 - Build 10.18.15.4235
GL_RENDERER: Intel(R) HD Graphics
GL_VENDOR: Intel
GL_SHADING_LANGUAGE_VERSION: 4.40 - Build 10.18.15.4235

# Braswell Celeron N3150 Windows 10 x64
GL_VERSION: OpenGL ES 3.1 - Build 10.18.15.4235
GL_RENDERER: Intel(R) HD Graphics
GL_VENDOR: Intel
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10 - Build 10.18.15.4235

この世代の GPU には、Core i の Broadwell だけでなく Atom 系 CPU Airmont を搭載した Cherry Trail や Braswell も含まれます。
実際にこれらのデータは Braswell Celeron N3150 で調べています。

Intel HD Graphics の世代と対応 API まとめ (より詳しくはこちら)

世代 FeatureLevel OpenGL OpenGL ES D3D12 ASTC
Gen 7 11_0 4.0 3.1 N N Ivy Bridge/Bay Trail
Gen 7.5 11_1 4.3 3.1 Y N Haswell
Gen 8 11_1 4.4 3.1 AEP Y Y Broadwell/Cherry Trail/Braswell

詳細な結果は下記ページに掲載しました。

Desktop GPU Extensions

上のページに掲載した “Intel HD Graphics Gen 8 (Braswell Celeron N3150)” の Extension 一覧を見ると、OpenGL 4.4 でも ASTC に Native で対応していることがわかります。
GeForce の Fermi/Kepler/Maxwell1 では Emulation でしたが、今後は Desktop GPU でも ASTC 対応が増えてくるものと思われます。

Extension より
GL_KHR_texture_compression_astc_ldr
GL_ANDROID_extension_pack_es31a

また Atom CPU (Airmont) の Braswell も DirectX12 (Direct3D 12) API に対応していることを確認しました。CPU 性能はあまり変わっていませんが、内蔵 GPU においては Bay Trail との差は非常に大きいようです。
↓こちらの表も更新しています。

Direct3D 12 (DirectX 12) Windows 詳細

D3D12 API からみた Feature Options は今のところ Gen7.5 と変わっていないようです。
ただし、今後ドライバの更新等で仕様が変わる可能性があります。

関連エントリ
Atom プロセッサの比較
Direct3D 12 (DirectX12) GPU と API の対応表
DirectX 12 (Direct3D 12) と GPU の対応
Desktop GPU と OpenGL ES 3.1 API
GeForce の OpenGL 4.5 ES3_1_Compatibility は AEP 対応
CPU 負荷が低い 新しい 3D API
OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応

VisualStudio MSBuild の解説。Makefile と書き方の比較など

VisualStudio の Build tool 、MSBuild の解説を書きました。
make の機能と比較しながら、シンボル定義、Task の実行、Target の依存関係の記述その他に触れています。

Hyperでんち: Visual Studio (MSBuild) 続きはこちら

VisualStudio の vcxproj などで共通の設定を Import しておけば、シンボルの設定や Custom の Build 手順などをプロジェクト間で共有することができます。

関連エントリ
VisualStudio と C++11 、コンパイラの違いなど
fastmake
VisualStudio 2010 beta1
VisualStudio と UTF-8
Visual Studio 2008 IDE で MP を使う
Visual Studio 2008
_T() と TEXT() の違いやソースの文字コード
64bit 開発設定のメモ