DirectX12 (D3D12) でテクスチャ生成時の挙動がドライバ依存しているようで結構しんどい気がします。巷によく掲載されているコードでは手元の RADEON HD 7750 ではうまく動作しませんでした。d3d12.dll の中で不正メモリアクセスをするような感じでエラーが発生してしまいます。
今回、 Intel HD Graphics Gen8 の環境を構築したので、こちらでもテストしてみたところ正常にテクスチャ生成&描画が出来ていることを確認できました。デバッガで停止しないという点では NVIDIA でも同様でしたが、画像としては正しくないという状況でした。
これらの結果を見ると三者三様でそれぞれに癖がありそうです。 CreateCommittedResource から WriteToSubresource という方法では結果が一致しないので、どこでも動くアプリではこれらの方法は避けた方が無難と言えるでしょう。
正しく動くと思われる方法は、 UPLOAD ヒープに転送したうえで、 DEFAULT ヒープに GPU 側で転送するケースです。 UPLOAD ヒープの処理があるので生成時に若干手間になることが予想されます。
しかし動的なテクスチャの場合にはこの方法だと実行コストがかかっているように思います。 CommittedResource で生成した領域に直接かけるほうが得なのですが・・・。頂点データなどはそれが出来ているだけに残念です。
追記
Intel HD Graphics Gen8 がうまく動いている理由はメモリが UMA だからじゃないかという話もありました。確かに他の2つの環境ではディスクリート GPU であるので、メモリ場所も違うのは確かにありましたね。これを考慮すると UPLOAD から DEFAULT への転送もちょっと納得がいきますね。 APU ではどのような挙動を示すのか、試してみた人がいたら教えてもらいところです
以上色々と書いていますが、あくまで個人の見解です。挙動からそんな気がしているというだけです。
コメント