2017-10-18 15 views
2

VRシステム用の画像処理を行うOpenFXプラグインを作成しています。所有権を取らずにcl_contextからOpenCLコンテキストを作成する

私たちの既存の処理コードとプラグインが意図しているホストの両方がOpenCLに基づいているため、ホスト開発者はOpenCL環境を共有するためにOFXへの拡張を与えました。

しかし、私たちのコードはC++ API(cl :: Context)を使用しています。提供された拡張は私にC cl_contextへのポインタを与えます。

cl_contextからcl :: contextを作成する方法はありますか?cl_contextの所有権は持ちませんか? (cl_command_queueのcl :: CommandQueueも同様です)。 APIのドキュメントは、コピーコンストラクタと代入演算子の両方が所有権を取得することを示唆しています。

+0

cl :: Contextインスタンスには、クローンを再構築するために必要な情報(多分 'CL_CONTEXT_DEVICES')を得るのに便利な' .getInfo() 'があります。 –

+0

これを把握できましたか?保持機能は保護されているので、以下の方法を使用することはできません – raaj

+0

はい - @Dithermasterは彼のコメントでclRetainContext()を使用する必要があります。 –

答えて

3

幸いなことに、OpenCL C++ヘッダーを調べて、それが何をしているのか(下部ではC API呼び出しを行うだけです)、コードにステップインして確認することができます。 CとC++ APIの両方で作業する場合、OpenCLオブジェクトの保持/解放のカウントに注意する必要があります。特に、C++のコンストラクタが保持されないが、デストラクタが解放された場合、問題があります。ホストのコンテキストをそれらの下から外します)。しかし、簡単に修正できるのは、オブジェクトのバランスを取るために構築した後、オブジェクト上に自分自身を保持することができるからです。私はOpenCLでC APIとC++ APIを混在させました。それは私にもあるC++ヘッダーの保持/解放哲学であり、あなたの苦痛を感じます。 OpenFXホストResolve、Vegas、Catalystなど何か不思議ですか? OpenFXのための統合されたOpenCL拡張があります。

+0

あなたは質問に答えませんでした。それで、私はそれをどのように正確に行うのですか?それはできません。たとえば、Caffeは古いAPIを使用していますが、caffeからcl_contextを取得し、cl :: Contextを使用するAPIで使用する場合は不可能です。保持は保護されています – raaj

+0

'cl_context'ハンドルからコンテキストオブジェクトを作成することができます(__CL_EXPLICIT_CONSTRUCTORSによって有効にされたコンストラクタがあります)、または代入演算子を使用して' cl_context'ハンドルをContextオブジェクトに割り当てることができます。 Contextオブジェクトは現在そのコンテキストを「所有」し、スコープ外に出たときにそのオブジェクトを解放します。それでもcl_contextハンドルを使用したい場合は、Contextオブジェクトを作成または割り当てた後、ハンドルで 'clRetainContext'を呼び出します(オブジェクトのデストラクタで行われたリリースをオフセットします)。 CまたはC++ APIに関係なく、すべて同じ 'cl_content'です。 – Dithermaster

関連する問題