突然の独り言:複数のスワップチェイン

プロジェクトの進行を物凄い勢いで妨げている問題について。
現状で何が問題なのかというと、Direct3Dにおいてスワップチェインが複数必要とされているということです。スワップチェインを作るだけなら、CreateAdditionalSwapChainという関数を呼ぶだけでできます。しかし、問題が2つ。
1つ目は、デバイスロストの問題。複数のスワップチェインを使用している状態から、他のフルスクリーンアプリケーションを呼び出す必要性があるため、必ずロストする状況が発生します。D3Dアプリケーションがロストに対処する場合の処理は以下のとおりです。まず、IDirect3DDevice9::TestCooperativeLevelの戻り値がD3DERR_DEVICENOTRESETである、つまり復帰可能な状態であることを確認します。そして復帰ができるようなら、そのデバイスで確保していたリソースを解放します。このとき、追加スワップチェインも解放しなければなりません。そして、解放が済んだら、IDirect3DDevice::Resetでリセットします。リセットできたら、解放したリソースを復旧します。もちろん追加スワップチェインもです。これらの処理をこなせば、無事にロストから復旧できます。
2つ目は、かなり根本的な問題で、追加スワップチェインは1つ目のスワップチェインのサイズより小さくなければいけないという問題です(id:rich850:20040927参照)。これは、1つ目のスワップチェインのサイズを画面のサイズとすることで、無理やり解決できます。が、あんまりよろしい気はしません。
以上のような問題がモチベーションを下げる要因となってしまっています。今までの「なんとなくー」で書いたコードでも一応動いてはいるんですが(ロスト復旧も可能)、変に追加スワップチェインの作成回数が多いという状態です。2つ目の問題もあわせて、スマートに解決できる方法を思案中。