ほんと、見えないときは全く姿を現さないですが。見えるときになってからがやっかいですね、
デバイスロストさん。というのも自身のプログラムをWindows7+オンボードGPUの環境で
プレイしてみたのですが、プレイ自体は何も問題ないものの、スリープモードから復帰した
ときにデバイスロストの復旧が正常に行えないという問題に直面したわけです。
以下、メモ書き風に話がグダグダと続きます。プログラム周りに興味のある方だけどうぞ苦笑;
さて、コードを見渡しても復旧前に開放し忘れたりとかは無い…(まぁ、XPで動作出来てる
のでこれは当たり前だろうなと思ってましたが)。しょうがないのでネット上にあるマルペケ
さんの所のデバイスロストのサンプルを実行してみるとこれも復旧できず、、「んっ?」て
思いました。コードを削っていくとどうやらD3Dデバイス作成時にD3DCREATE_SOFT
WARE_VERTEXPROCESSINGを指定するとデバイスロストから復旧できるということが
分かり、オンボだとHARDWAREで指定しちゃいかんのかなとも考えましたが、指定でき
ないのにデバイスの作成が通るというのもおかしいのでもう少しだけ考えることにしました。
そこで、サンプルコードから一旦自身のプログラムに戻って修正してみると、デカール描画
の部分だけデバイスロストから復旧時に不自然な描画の仕方をする現象を見つけました。
デカール描画の部分だけDrawIndexedPrimitive()ではなくDrawIndexedPrimitiveUP()
で描画していたので、これはすぐにピンと来たわけです。
つまり、「Windows7は内部でDirectX10.1を使っているし、DirectX10ではUP系の
描画を廃止してるんだからこれはうまくエミュレートできていないってことだろうな」と思った
訳です。で試しにデバイス作成部分を元に戻してDrawIndexedPrimitiveUP()部分を
コメントアウトしてみるとデバイスロストの復旧が無事出来ました!(要追伸)
ちなみにマルペケさんのサンプルがデバイスロストから復旧出来なかったのはソース
コードの短縮のためにD3DXSPRITEやD3DXFONTを使っていたのでこれが原因みたい
でした(おそらく内部でUP系の処理をしているのかな)。デバイスをSOFTWAREで作成した
時にうまくいったのも、予想の域を超えませんがオンボではなくCPU側で頂点処理をエミュ
レートしたのがうまく働いたのかな。
この問題はオンボGPUのサポートの不手際が悪いとも言えそうですが、結論から言えば
「UP系描画はこの先どう描画されるか分からないから使うな」という警告だなと思いました。
いっそオンボは無視するというのもアリですが。最近のオンボは結構早いですからね。
、、それにしても結論までに結構時間かかったなぁ;
追伸:
UP系命令が原因と書きましたが、デカール描画だけはボリュームテクスチャで描画して
いたので、こっちが原因かもしれないなと思いDrawIndexedPrimitiveUP()を消さずに
ボリュームテクスチャをOFFにすると正常に描画されました。で試しにボリュームテクスチャ
のプールをD3DPOOL_MANAGEDだったのをD3DPOOL_DEFAULTにして自前復旧に
変更することでデバイスロストに対処できました。…ということで、間違った情報を流して
しまいました。そういいつつ、直った理由がいまいちよく分からない上にUP系との併用に
よるバグかもしれないし、デカールと一部分だけ固定パイプラインで描画していることによる
バグかもしれない。原因は何だか特定しきれないですが、、直ったからいいんです苦笑。