2017-10-18 159 views
2

我創建一個OpenFX插件的虛擬現實系統做一些圖像處理創建從cl_context OpenCL上下文。沒有取得所有權

由於我們現有的加工代碼,插件是爲主機,基於OpenCL的,主機開發商給了我一個擴展,OFX共享OpenCL的環境。

但是 - 我們的代碼使用C++ API(CL ::上下文),以及他們所提供的擴展給了我一個指針是C cl_context。

有沒有辦法爲我創造一個CL ::上下文從cl_context,沒有考慮後者的所有權? (對於來自cl_command_queue的cl :: CommandQueue也是如此)。 API在線文檔建議複製構造函數和賦值運算符都具有所有權。

+0

cl ::上下文實例有一個'.getInfo()',它可以用來獲得必要的信息(可能用'CL_CONTEXT_DEVICES')來重建一個克隆。 –

+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啓用)創建一個Context對象,或者您可以使用賦值運算符將'cl_context'句柄分配給一個Context對象。 Context對象現在「擁有」該上下文,並在超出範圍時釋放它。如果你仍然想使用你的cl_context句柄,那麼在創建或分配Context對象之後,還要在句柄上調用'clRetainContext'(這會抵消在對象的析構函數中完成的釋放)。無論C或C++ API如何,它都是相同的'cl_content'。 – Dithermaster