2017-06-28 8 views
1

私はレンダリング(OpenGL)のためにOgreエンジンを使用するアプリケーションを持っています。パイプラインにバインドされたテクスチャがあります。また、そのテクスチャを変更するCUDAコールがあります。基本的には次のようになります。OpenGLが使用するテクスチャを変更するのは安全ですか?

cudaGraphicsMapResources(tex); 

// call cuda kernel that writes to te texture 

cudaGraphicsUnmapResources(tex); 

これはどれくらい安全ですか? CUDAが現在OpenGLによって使用されているテクスチャを更新する可能性はありますか?私はOpenGLを知らないが、他のAPIを知っている。 DirextX 12またはvulkanでは、この種の作業に障壁やその他の同期メカニズムを設定する必要があります。一方DirectX 11では、マップされたリソースを安全に更新することができます。これは、API内部で同期が取られているためです。

答えて

1

これは主にOpenGLがGPUに関連するすべてのバッファとIDを格納するためです。ただし、GPUにバインドされているテクスチャを更新することはできません。

+0

ありがとうございました。実際には機能しますが、未定義の動作がないことを確認したいと思います。この保証について説明するドキュメントまたはその他のリソースへのリンクを提供してください。 – nikitablack

1

テクスチャがCUDAリソースにマップされている限り、OpenGL側で読み書きすると、結果は未定義になります。CUDA docsに明示されています。

+0

はい、私はこの段落を見ました。「リソースが登録されたグラフィックスAPIは、CUDAによってマッピングされている間はリソースにアクセスしてはいけません。しかし、それはAPIによってリソースにアクセスすることを意味します。マッピングとアンマップの間に私はOpenGLを呼び出すつもりはありません。 – nikitablack

+0

CUDAカーネルはOpenGLパイプラインと同期して動作しません。また、CUDAまたはGLが別のスレッドで実行されている可能性もあります。つまり、GL側からテクスチャにアクセスする可能性がありますが、まだCU​​DAコンテキストにマッピングされています。それをしないでください。 –

+0

一方、あなたが参照したのと同じドキュメントでは、 ''関数は '' cudaGraphicsMapResources()の前に発行されたグラフィックス呼び出しがストリームで発行された後続のCUDA作業が完了する前に完了することを保証しています。 ''' OpenGL 。 – nikitablack

関連する問題