DirectShow のエラー報告ですよ!
DirectShow を
【Release】【64bit】ランタイム で
【D3DPOOL_DEFAULT】【D3DUSAGE_DYNAMIC】で動的テクスチャにして
ムービーをテクスチャに貼り付けると・・・
メモリアクセスエラーが出た。
もし、テクスチャが【 D3DPOOL_MANAGED 】だとメモリアクセスエラーは出ない。
しかし、
前日
動画は動的テクスチャのほうが良いと学んだばかり。
ずっと D3DPOOL_MANAGED で作ってきた DirectShow を改造しようとしたらダメでした。
何がダメなの-・・・ ( ゚д゚)、ペッ
っと心麗しく悩んでいました。
『1920x1080 のムービーでフルスクリーンだから無理なのかな・・・』
と思い、ウィンドウモードでしてもダメ。 神は無慈悲なり・・
しかし、、、、
サンプルは同じ設定で出来た。
↑ココ重要。
で き ん の か よ( ゚Д゚)
希望の光どころか自分の情けなさに涙がちょちょぎれた。
で、さんざん悩んだ所・・・
サンプルの CreateDevice の所で見慣れないものが・・・
g-pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXORICESSING | D3DCREATE_MULTITHREADED , &d3dpp, &d3dDevice );
D3DCREATE_SOFTWARE_VERTEXORICESSING | D3DCREATE_MULTITHREADED , &d3dpp, &d3dDevice );
ん???
D3DCREATE_MULTITHREADED
??????
調べてみると
『マルチスレッドを安全に行うフラグ』
らしい。
マルチスレッド? 使ってないよ。
と思い、 何故か SOFTWARE の方に目が行き、
『えー・・・ HARDWARE じゃだめなのか・・・』
と、勘違いして → 実行 ↓
落 ち る
( ‘д‘⊂彡☆))Д´) パーン
そうですね。 D3DCREATE_MULTITHREAD を指定するのが正解みたいです。
おそらくは DirectShow はどこかでマルチスレッドをしやがってて、
"描画がまだ完全に成功していない"のにテクスチャを触ってるからメモリアクセスエラーが出ていた。
と考えるのがしっくりちっくりちくびんびん来ました。
D3DCREATE_MULTITHREADED
は 『マルチスレッドを安全に行う』フラグ。
恐らく、
描画時等でテクスチャを触ってる時は、 テクスチャLOCK を自動的に待ってくれるのでろでろ。
だからテクスチャ書き換え時、メモリアクセスエラーが出ない。
あー・・・ なるほど・・・・
そう思った。 それだけです。
ここは見てなかった _| ̄|○
--------------------【追記】--------------------
なんで D3DPOOL_MANAGED だとメモリアクセスエラーが出ないか考えてみた。
D3DPOOL_MANAGED は
VRAMにも、システムメモリにもリソースを取る。
つまり、、
描画時はVRAMを使っている。
そして、
テクスチャ書き換え時はシステムメモリのリソースを使っており、
書き換え終了後、 システムメモリのリソースをVRAMに移してる。 → そして描画。
D3DPOOL_DEFAULT は VRAM にしかリソースを取らない。
→ 同じ所を触ろうとするので、描画中にもかかわらず
テクスチャを書き換えようとアクセスしてエラーなう!!
マルチスレッドを美味くかわしてやがるぜこいつ!!( ゚д゚ )
考えてみたらなんてことなかったけど、今までは危ない橋を渡っていたんだな・・・
やっぱりリソース管理を勉強してよかった。
【結論】
やっぱり D3DPOOL_MANAGED より、 D3DPOOL_DEFAULT の動的テクスチャにしたほうがパフォーマンス良くなりました(笑)