3

OpenCL / OpenGL の相互運用性とマルチスレッドを使用するプロジェクトに取り組んでいます。Thread1 は VBO のレンダリングのみに使用され、Thread2 は VBO に格納されたジオメトリを処理する OpenCL カーネルの実行に使用されます。カーネルは数回呼び出され、各反復後に処理されたメッシュを視覚化したいと考えています。したがって、Thread1 と Thread2 で openGL コンテキストを共有して VBO を共有し、OpenCL/OpenGL コンテキストを共有するという 2 つのことが必要です。1 つ目は、wglShareLists(HLRC2, HLRC2) を使用して実現できます。2 番目のステップは、共有 OpenGL コンテキストを使用して OpenCL コンテキストを作成することです。このために、Thread2 - 処理スレッドのコンテキストを使用する必要があります。

私が理解している限り、コマンドの順序は次のとおりです。

// コンテキストを作成します

hlrc1 = wglCreateContext(m_hdc);
hlrc2 = wglCreateContext(m_hdc);

// 各スレッドの最新として設定されていない間、リソースを共有します

wglShareLists(hlrc1, hlrc2);

// スレッド 1 で hlrc1 を現行にし、スレッド 2 で hlrc2 を現行にします

wglMakeCurrent(m_hdc, hlrc1) / wglMakeCurrent(m_hdc, hlrc2)

// そして、openCL の共有コンテキストを設定します

cl_context_properties properties[] = {
CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(), // WGL   Context
CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(), // WGL HDC
CL_CONTEXT_PLATFORM, (cl_context_properties)cpPlatform, // OpenCL platform
0   };

cl_device_id devices[32]; size_t sizedev;
clGetGLContextInfoKHR_fn clGetGLContextInfo = (clGetGLContextInfoKHR_fn)clGetExtensionFunctionAddressForPlatform(cpPlatform, "clGetGLContextInfoKHR");

clGetGLContextInfo(properties, CL_DEVICES_FOR_GL_CONTEXT_KHR, 32 * sizeof(cl_device_id), devices, &sizedev);

cl_uint countdev = (cl_uint)(sizedev / sizeof(cl_device_id));
context = clCreateContext(properties, countdev, devices, NULL, 0, 0);

// そして、共有相互運用メモリ オブジェクトが作成され、openCL のカーネル引数として渡されます

cl_mem vbo_cl = clCreateFromGLBuffer(context, CL_MEM_READ_WRITE, vboID, NULL);

そしてここで問題が発生します。コマンド wglShareLists(hlrc1, hlrc2) が呼び出されると、共有 VBO には頂点位置ではなくゼロしかありません。コマンド wglShareLists(hlrc1, hlrc2) がスキップされた場合、VBO には有効な値があり、OpenGL / OpenCL 相互運用の間ですべて正常に動作しますが、スレッド 1 とスレッド 2 の OpenGL コンテックス間のリソースを共有できないため、プロセスをレンダリングできません。

誰かがこのようなことを試しましたか、それは可能ですか? それとも、私は間違った方法で何かをしていますか?

4

0 に答える 0