「 2013年03月 」一覧

ICONIA TABにICSアップデート

最近、WindowsのKernel Debugに手を出し始めました。色々とおもしろくなってきたので、これは近々ブログ記事で紹介できそうです。
今回は、それとは全く違って Acer ICONIA TAB A500 のアップデートの話です。

メーカーからのサポートでは、Android 3.2 が配布されておしまいだったのですが、今回どうしても 4.0以降にアップデートしたくてチャレンジする運びとなりました。手元ではとりあえず動いているようなので、その方法をメモがてら紹介したいと思います。ちなみに今更ICSか!という声も聞こえてきそうですが、はい、今更なんです。

参考にさせてもらったのはこちら(http://blog.livedoor.jp/kimikage_sou/archives/6591896.html)になります。

基本的には上記のサイトで紹介されているとおりに行っています。違うのはWindows7を用いたことくらいです。
root-3.2.1-V4.7z をダウンロードして、DotNetDetector.exe を実行。
ClockworkMod Recoveryを更新して、ようやくタッチ操作で ClockworkMod Recovery を操作できるようになります。それまではボリュームボタン&電源ボタンで選択&決定をがんばるしかない。

そして、ICSのROMは Tegra Owners.comというところから入手してきました。
手元でうまく動くように出来たのは、 Tegraowners_ICS_ROM_v170.zip とそれに対応する gapps の組み合わせです。
最近では JellyBeansのほうも公開されているようですが、どこかを間違ったのか、起動中状態から先に進めませんでした。

また、このROMを使っていこうと思った理由として、4.0以降であることはもちろん、
開発者向けオプションがきちんと存在したこと、にあります。
他のROMを試してみたら、開発者向けオプションを見つけることが出来なかったり・・・。


DirectX11で旧シェーダーコード(HLSL)を使う

DirectX11(DX11) は DirectX9(DX9) に対応したハードでも一応動かすことが出来ます。このとき、DX9 にのみ対応ハードで動かす場合、DX11 の機能は当然使えません。シェーダーに関しても同様で、頂点シェーダー、ピクセルシェーダーのみを使用することになります。

fxcや関連するドキュメントをみると、そういった DX9 ハード用のシェーダープロファイルとして、次のものを使用するようになっています。

  • vs_4_0_level_9_0
  • vs_4_0_level_9_1
  • vs_4_0_level_9_3
  • ps_4_0_level_9_1
  • ps_4_0_level_9_3

確かに、DirectX11 の仕様を守って新規にシェーダーファイルを作って行く場合には何の問題も無いのですが、昔からのコードを現世代で動くようにと作業している場合、これだけの指定では足りないのです。

例えば、以下のようなシェーダーファイルのコードがあったとして、これを上記のプロファイルに従い、 vs_4_0_level_9_3 でコンパイルしたとします。

これをコンパイルすると次のようにエラーが表示されます。

fxc /T vs_4_0_level_9_3 vs.hlsl

error X4541: vertex shader must minimally write all four components of SV_Position
compilation failed; no code produced

これをエラー無く、かつ、シェーダーコードを修正することなくシェーダーコンパイルを成功させるためには、/Gec オプションを指定します。

fxc /T vs_4_0_level_9_3 /Gec vs.hlsl

これで vs_4_0 系のタイプでシェーダーをコンパイルすることが出来、DirectX11 のプログラム上で使用することが可能になります。
内部的には、出力セマンティクスのPOSITION を SV_POSITION として勝手に扱ってくれるようです。コマンドラインでコンパイルした結果を見るとそんな感じに見えます。

なお、D3DX11ShaderCompileFromFile で、この “Gec” オプションに相当するものは、 D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY となるようです。

感想

意外と DirectX11 で古いシェーダーコードをそのまま使うという話はないのかな?と思いました。
調べてみても情報はほとんど出てきませんでした。
確かにDirectX11 は初心者にはちょっと手間な部分も多いですし、ある程度までなら DirectX9 を使ってしまった方が楽で、やりたいことを実現できますし。
それでもどこかで、同じように悩んだ人に、この記事が役立ってくれるといいなと思います。