使用clCreateEventFromGLsyncKHR扩展函数时发生链接错误

Link error when using clCreateEventFromGLsyncKHR extension function

本文关键字:链接 错误 clCreateEventFromGLsyncKHR 扩展 函数 使用      更新时间:2023-10-16

我最近开始将OpenCL集成到我的OpenGL应用程序中,该应用程序渲染一个基本的粒子系统,两者之间的基本互操作(没有事件)运行良好。然而,为了提高性能,我尝试使用clCreateEventFromGLsyncKHR函数,而不必调用glFinishclFinish,我无法获得正在运行的程序,因为程序会抱怨以下错误:

error LNK2019: unresolved external symbol _clCreateEventFromGLsyncKHR

我已经尝试使用所提供的两个函数来获得扩展函数指针(clGetExtensionFunctionAddressForPlatformclGetExtensionFunctionAddress),但由于我无法理解的原因,我无法使其工作。

样本代码:

#include <CL/cl_gl_ext.h>
typedef cl_event (*PFNCLCREATEEVENTFROMGLSYNCKHR) (cl_context context, cl_GLsync sync, cl_int *errcode_ret);
PFNCLCREATEEVENTFROMGLSYNCKHR clCreateEventFromGLsyncKHR = (PFNCLCREATEEVENTFROMGLSYNCKHR)clGetExtensionFunctionAddressForPlatform(opencl::target::inst()->platform(), "clCreateEventFromGLsyncKHR");
GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
cl_event gl_event = clCreateEventFromGLsyncKHR(opencl::contexts["GL_CL_context"]->_get(), sync, NULL );

有人能帮助我了解我哪里出了问题吗?

对于感兴趣的人:

Name:                        GeForce GT 740M
Vendor:                  NVIDIA Corporation
Device OpenCL C version:             OpenCL C 1.1 
Driver version:              327.23
Profile:                     FULL_PROFILE
Version:                     OpenCL 1.1 CUDA
Extensions:                  cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_d3d9_sharing cl_nv_d3d10_sharing cl_khr_d3d10_sharing cl_nv_d3d11_sharing cl_nv_compiler_options 
cl_nv_device_attribute_query cl_nv_pragma_unroll  cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics 
cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_fp64 

更新如果我使用的设备支持cl_khr_gl_event扩展

,那么上面的代码仍然不起作用

您的设备不支持cl_khr_gl_event扩展。使用clCreateEventFromGLsyncKHR方法需要该扩展。如前所述。通常,作为扩展结束/启动一部分的所有方法的名称中都有KHR/NV/AMD。

代码的另一个问题是,您无论如何都没有启用扩展,您必须定义以下内容:

#include <CL/cl_gl_ext.h>