OpenCL-GL 共有メモリに問題があります。
Linux と Windows の両方で動作するアプリケーションがあります。CL-GL 共有は Linux では機能しますが、Windows では機能しません。
Windowsドライバーは、共有をサポートしていると言っています.AMDの例は機能するので、機能するはずです。Windows でコンテキストを作成するための私のコードは次のとおりです。
cl_context_properties properties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)platform_(),
CL_WGL_HDC_KHR, (intptr_t) wglGetCurrentDC(),
CL_GL_CONTEXT_KHR, (intptr_t) wglGetCurrentContext(),
0
};
platform_.getDevices(CL_DEVICE_TYPE_GPU, &devices_);
context_ = cl::Context(devices_, properties, &CL::cl_error_callback, nullptr, &err);
err = clGetGLContextInfoKHR(properties, CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR, sizeof(device_id), &device_id, NULL);
context_device_ = cl::Device(device_id);
queue_ = cl::CommandQueue(context_, context_device_, 0, &err);
私の問題は、共有バッファー内の CL と GL のメモリが同じではないことです。それらを(メモリマッピングによって)印刷すると、それらが異なることに気付きます。メモリ内のデータの変更は CL と GL の両方で機能しますが、両方ではなく、そのメモリのみを変更します (つまり、両方のバッファはそのままのように見えますが、共有されていません)。
また、cl-buffer の clGetGLObjectInfo は正しい gl バッファを返します。
更新: CPU で opencl-context を作成すると、それが機能することがわかりました。私は統合グラフィックスを使用していないため、これは奇妙に思えます。また、CPUがopenglを処理しているとは思えません。ウィンドウの作成に SDL を使用していますが、これと関係があるのでしょうか?
OpenGL コンテキストが GPU 上で実行されていることを確認したので、問題は別の場所にあります。
更新 2:わかりました。これは奇妙です。今日もう一度試してみたら、突然うまくいきました。私の知る限り、昨日コンピューターをシャットダウンする前に新しいドライバーをインストールしなかったので、何が原因なのかわかりません。
更新 3:そうですね、粒子の数を変更するとこれが機能することに気付きました。共有バッファが 1 MB をわずかに超えるほど多くのパーティクルを割り当てると、突然動作し始めます。