OpenGL (Windows 7) を使用して異なる解像度とリフレッシュ レートで複数のディスプレイ (マルチヘッド) を駆動し、デバイス間でテクスチャを共有するにはどうすればよいですか?
マルチヘッド GPU を 1 つ持っています。4つのヘッドを駆動します。(それが問題になる場合は、たまたま AMD FirePro V7900 になります。) ヘッドはすべて「シーン」(頂点とテクスチャ データなど) を共有しますが、ディスプレイで vsync が発生するたびにこのシーンをレンダリングしたい (各ヘッドは本質的に異なるビューポートです)。しかし問題は、ヘッドが異なればリフレッシュ レートも異なる可能性があることです。たとえば、60Hz のディスプレイもあれば、30Hz のディスプレイもあれば、24Hz のディスプレイもあります。
呼び出しブロックを呼び出すとSwapBuffers
、次にどのヘッドをレンダリングする必要があるかわかりません。IDirect3DSwapChain9::Present
フラグ付きの Direct3D9 のようなものD3DPRESENT_DONOTWAIT
と、関連するD3DERR_WASSTILLDRAWING
戻り値を期待していました。このアプローチを使用して、次にレンダリングする頭を決定できました。いずれかが成功するまで、さまざまなヘッドをラウンドロビンでポーリングします。しかし、OpenGL で同等のアプローチが何であるかはわかりません。
私はすでにwglSwapIntervalEXT(1)
vsync を使用することを発見しました。また、HDC を切り替えて、1 つの HGLRC でさまざまなウィンドウにレンダリングすることもできます。しかし、リフレッシュレートの違いは私を台無しにしています。
単一の HGLRC でこれらすべてのディスプレイを異なるリフレッシュ レートでレンダリングするために何ができるかわかりません。共有テクスチャ (およびその他のリソース) を効率的に使用するには、単一の HGLRC である必要があると思います...間違っている場合は修正してください。リソースが複数の HGLRC で複製されている場合、メモリが 25% に削減されると予想されるため、私にとっては興味深いことではありません (1 つの GPU で 4 つのヘッド: したがって、リソースの 4 つのコピーは必要ありません)。
それが必要であれば、複数のスレッドを使用するという考えにオープンです。
リソースを共有しながら、独自のリフレッシュ レートと解像度でディスプレイを駆動できるように、メイン ループを構成する方法を教えてもらえますか?