--- OpenCL/OpenCL.xs 2012/04/19 14:34:56 1.30 +++ OpenCL/OpenCL.xs 2012/04/20 08:57:09 1.33 @@ -38,17 +38,46 @@ /*****************************************************************************/ // name must include a leading underscore +// all of this horrors would be unneceesary if somebody wrote a proper OpenGL module +// for perl. doh. static void * -getsym (const char *name) +glsym (const char *name) { + void *fun = 0; + #if defined I_DLFCN && defined RTLD_DEFAULT - #if !DLSYM_NEEDS_UNDERSCORE - ++name; // skip _ - #endif - return dlsym (RTLD_DEFAULT, name); - #else - return 0; + fun = dlsym (RTLD_DEFAULT, name + 1); + if (!fun) fun = dlsym (RTLD_DEFAULT, name); + + if (!fun) + { + static void *libgl; + static const char *glso[] = { + "libGL.so.1", + "libGL.so.3", + "libGL.so.4.0", + "libGL.so", + "/usr/lib/libGL.so", + "/usr/X11R6/lib/libGL.1.dylib" + }; + int i; + + for (i = 0; !libgl && i < sizeof (glso) / sizeof (glso [0]); ++i) + { + libgl = dlopen (glso [i], RTLD_LAZY); + if (libgl) + break; + } + + if (libgl) + { + fun = dlsym (libgl, name + 1); + if (!fun) fun = dlsym (libgl, name); + } + } #endif + + return fun; } /*****************************************************************************/ @@ -180,13 +209,30 @@ { cl_context_properties t = SvIV (*av_fetch (av, i , 0)); SV *p_sv = *av_fetch (av, i + 1, 0); - cl_context_properties v; + cl_context_properties v = SvIV (p_sv); // code below can override switch (t) { + case CL_GLX_DISPLAY_KHR: + if (!SvOK (p_sv)) + { + void *func = glsym ("_glXGetCurrentDisplay"); + if (func) + v = (cl_context_properties)((void *(*)(void))func)(); + } + break; + + case CL_GL_CONTEXT_KHR: + if (!SvOK (p_sv)) + { + void *func = glsym ("_glXGetCurrentContext"); + if (func) + v = (cl_context_properties)((void *(*)(void))func)(); + } + break; + default: /* unknown property, treat as int */ - v = SvIV (p_sv); break; } @@ -1266,7 +1312,7 @@ PPCODE: cl_gl_object_type type; cl_GLuint name; - NEED_SUCCESS (clGetGLObjectInfo, (self, &type, &name)); + NEED_SUCCESS (GetGLObjectInfo, (self, &type, &name)); EXTEND (SP, 2); PUSHs (sv_2mortal (newSVuv (type))); PUSHs (sv_2mortal (newSVuv (name))); @@ -1321,7 +1367,7 @@ target (OpenCL::Image self) PPCODE: cl_GLenum value [1]; - NEED_SUCCESS (GetGlTextureInfo, (self, CL_GL_TEXTURE_TARGET, sizeof (value), value, 0)); + NEED_SUCCESS (GetGLTextureInfo, (self, CL_GL_TEXTURE_TARGET, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -1330,7 +1376,7 @@ gl_mipmap_level (OpenCL::Image self) PPCODE: cl_GLint value [1]; - NEED_SUCCESS (GetGlTextureInfo, (self, CL_GL_MIPMAP_LEVEL, sizeof (value), value, 0)); + NEED_SUCCESS (GetGLTextureInfo, (self, CL_GL_MIPMAP_LEVEL, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; PUSHs (sv_2mortal (newSViv (value [i]))); @@ -1646,6 +1692,11 @@ clSetKernelArg (self, idx, sizeof (value), &value); void +set_local (OpenCL::Kernel self, cl_uint idx, size_t size) + CODE: + clSetKernelArg (self, idx, size, 0); + +void set_event (OpenCL::Kernel self, cl_uint idx, OpenCL::Event value) CODE: clSetKernelArg (self, idx, sizeof (value), &value);