Windows Phone 8 SDK と Direct3D 11.1

Windows Phone 8 では描画 API として Direct3D が使えるようになっています。
iOS/Android から遅れること 3 年、WindowsPhone でもようやく Shader が
使えるようになりそうです。

Microsoft Windows Phone SDK 8.0

WindowsCE だった WindowsMobile/WindowsPhone 7 までは、
Desktop の Intel/AMD、Mobile の ARM と OS だけでなく
アーキテクチャでも明確な切り分けが行われていました。

Windows 8 RT が Desktop / Tablet で ARM をサポートするようになり、
今後ハードウエアも OS/API も統合されていくものと考えられます。

Windows Phone 8 SDK では開発言語として Native C/C++ が使えるようになり、
描画 API も Direct3D がサポートされています。
iOS/Android 含めたプラットフォーム非依存の共通言語として期待できます。

もっとも WindowsCE の時代、WindowsMobile 6 までは Win32 API と C/C++ で
開発していたので WindowsPhone 7 だけが特別だったのかもしれません。

● Windows Phone 8 SDK

Windows Phone 8 SDK は開発環境が統合されており、
iOS の Xcode のようにインストールするだけで一式揃います。
WindowsCE 時代の eMbedded Visual Tools を思い出します。

注意点は、Windows Phone 8 SDK のインストールに Windows 8 x64 が
必須となっていることです。
その理由の一つに Windows Phone 8 Emulator の Hyper-V があるようです。

インストール時にオプション選択が無いので、対応 CPU では常に Hyper-V が
有効となり、未対応 CPU では Emulator 無しでインストールが行われます。
他の仮想 PC 系ソフトを併用している場合は競合することがあるので注意が必要です。

● Direct3D 11 10Level9

GPU 用 3D API は Desktop と同じ Direct3D11 です。
現時点で Windows Phone 8 が対応する feature level は 9_3 となっています。
よって GPU 機能は OpenGL ES 2.0 と同等で、
Direct3D 11 といっても Geometry/Hull/Domain/ComputeShader 等が
使えるわけではありません。

Direct3D feature levels (Windows)

WindowsVista 登場時に Direct3D10 がリリースされましたが、
DirectX 9 以前とは方針が異なり、一切下位互換を持たない仕様でした。
Direct3D 9 以下 (ShaderModel 4.0未満) の GPU は切り捨てられ、
新しい Direct3D 10 API は Direct3D 10 対応 GPU (ShaderModel 4.0以上)
でなければ使えませんでした。
そのかわり caps といった細かなハードウエア機能のチェックが不要です。

その後 Windows 7 で更新された Direct3D 11 は再び路線を変更し、
DirectX 9 以前と同じように API セットのレベルと GPU のハードウエア機能の
レベルが分離されました。下位互換が復活しています。

Direct3D 11 on DOwnlevel Hardware (Windows)

Direct3D 9/Direct3D 10 相当 (ShaderModel 5.0未満) の GPU でも
ドライバさえ対応していれば新しい API 経由で使えるわけです。
その代償として徐々に caps (feature level) が復活しつつあります。

Feature Level は blog の過去記事だとこのあたり↓で触れています。

 ・2008/11/09 Direct3D11/DirectX11 (4) FeatureLevel と旧 GPU の互換性、テクスチャ形式など
 ・2008/11/06 Direct3D11 Technical Preview D3D11の互換性、WARP Driver

● Windows 8 と Direct3D 11.1

メジャーアップデートだった Vista や 7 とは異なり、
Windows 8 の Direct3D は 11.0 から 11.1 と小規模な拡張にとどまっています。
特に Shader Model が 5.0 のままで、5.1 に更新されていないのは意外でした。

11.1 では GPU のハードウエア進化に合わせたハイエンド向けの機能拡張だけでなく、
むしろ Mobile GPU 向けの機能が大幅に追加されているようです。
時代を反映していると言えます。

例えば D3D11_FEATURE (Caps) の項目が 11.1 で著しく増えています。
Windows 8 RT や WindowsPhone 8 など OpenGL ES 2.0 GPU を
10Level9 でサポートするために必要になったと思われる項目が多数あります。

D3D11_FEATURE_DATA_ARCHITECTURE_INFO の
TileBasedDeferredRenderer はまさに Mobile GPU 向けの Caps で、
D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT
SupportsDepthAsTextureWithLessEqualComparisonFilter も
ShaderModel 4.0 以降は標準のものです。

D3D11_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT も
OpenGL ES 2.0 なら非常に馴染みが深い代物でしょう。

● Mobile GPU と演算精度

OpenGL ES 2.0 用 GPU で最適化を行う場合、シェーダーの演算精度は
非常に大きな問題となります。
shader 内で highp/mediump/lowp の適切な使い分けが要求されます。

Mobile GPU の比較 : Precision
OpenGL ES 2.0 GLSL precision 宣言と GPU 毎の演算精度を調べる

DirectX の場合、DirectX 9 初期 GeForce FX 5800 系の half 型以外では
演算精度を気にする必要がほとんどありませんでした。

11.1 の HLSL では GLSL の highp / mediump / lowp 同様、
最低限必要な演算精度を宣言ができるようになっています。

OpenGL GLSL          Direct3D HLSL
--------------------------------------
highp   float        float
mediump float        min16float (half)
lowp    float        min10float

OpenGL ES 2.0 同様に、WindowsPhone 8 や Windows RT で
最適化する場合に必要になってくるものと思われます。

● ShaderModel 5.0 アセンブラ命令

いつの間にかマニュアルに載っていました。
アセンブラでシェーダーを記述するわけではありませんがデバッグ時に役に立ちます。

Shader Model 5 Assembly (Windows)

Direct3D 10 (ShaderModel 4.0) 時代は載っていなかったので自分で調べていました。

ShaderModel4.0 アセンブラ命令

● DirectX SDK

Windows Phone 8 SDK と同じように、
Desktop 向け Direct3D 11.1 SDK は Windows SDK に統合されています。

Windows Software Development Kit (SDK) for Windows 8

VisualStudio Express 2012 for Windows Desktop の Windows SDK で
dll 番号を見ると 46 になっていました。

DirectX SDK Version 一覧

関連エントリ
2012/02/24 OpenGL ES 2.0 GLSL precision 宣言と GPU 毎の演算精度を調べる
2008/11/09 Direct3D11/DirectX11 (4) FeatureLevel と旧 GPU の互換性、テクスチャ形式など
2008/11/06 Direct3D11 Technical Preview D3D11の互換性、WARP Driver