Re: [Gegl-developer] [PATCH 2/2] opencl: Load extension function in a portable way.



ping, any takers?

Jan

On Mon, 2014-07-28 at 11:32 -0400, Jan Vesely wrote:
Signed-off-by: Jan Vesely <jan vesely rutgers edu>
---
 gegl/opencl/gegl-cl-init.c  | 31 +++++++++++++++----------------
 gegl/opencl/gegl-cl-init.h  |  4 ++++
 gegl/opencl/gegl-cl-types.h |  2 ++
 3 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/gegl/opencl/gegl-cl-init.c b/gegl/opencl/gegl-cl-init.c
index da5f97d..f4ba3ce 100644
--- a/gegl/opencl/gegl-cl-init.c
+++ b/gegl/opencl/gegl-cl-init.c
@@ -324,6 +324,16 @@ if (gegl_##func == NULL)
 
 #endif
 
+#define CL_LOAD_EXTENSION_FUNCTION(func)                                          \
+g_assert(gegl_clGetExtensionFunctionAddress);                                     \
+gegl_##func = gegl_clGetExtensionFunctionAddress(#func);                          \
+if (gegl_##func == NULL)                                                          \
+  {                                                                               \
+    GEGL_NOTE (GEGL_DEBUG_OPENCL, "symbol gegl_##func is NULL");                  \
+    g_set_error (error, GEGL_OPENCL_ERROR, 0, "symbol gegl_##func is NULL");      \
+    return FALSE;                                                                 \
+  }
+
 #if defined(__APPLE__)
 typedef struct _CGLContextObject *CGLContextObj;
 typedef struct CGLShareGroupRec  *CGLShareGroupObj;
@@ -501,28 +511,17 @@ gegl_cl_init_load_functions (GError **error)
   CL_LOAD_FUNCTION (clReleaseContext)
   CL_LOAD_FUNCTION (clReleaseMemObject)
 
+  CL_LOAD_FUNCTION (clGetExtensionFunctionAddress);
+
   return TRUE;
 }
 
 static gboolean
 gegl_cl_gl_init_load_functions (GError **error)
 {
-#ifdef G_OS_WIN32
-  HINSTANCE module = LoadLibrary ("OpenCL.dll");
-#else
-  GModule *module = g_module_open (CL_LIBRARY_NAME, G_MODULE_BIND_LAZY);
-#endif
-
-  if (!module)
-    {
-      GEGL_NOTE (GEGL_DEBUG_OPENCL, "Unable to load OpenCL library");
-      g_set_error (error, GEGL_OPENCL_ERROR, 0, "Unable to load OpenCL library");
-      return FALSE;
-    }
-
-  CL_LOAD_FUNCTION (clCreateFromGLTexture2D)
-  CL_LOAD_FUNCTION (clEnqueueAcquireGLObjects)
-  CL_LOAD_FUNCTION (clEnqueueReleaseGLObjects)
+  CL_LOAD_EXTENSION_FUNCTION (clCreateFromGLTexture2D)
+  CL_LOAD_EXTENSION_FUNCTION (clEnqueueAcquireGLObjects)
+  CL_LOAD_EXTENSION_FUNCTION (clEnqueueReleaseGLObjects)
 
   return TRUE;
 }
diff --git a/gegl/opencl/gegl-cl-init.h b/gegl/opencl/gegl-cl-init.h
index 92ddd3b..9d1c983 100644
--- a/gegl/opencl/gegl-cl-init.h
+++ b/gegl/opencl/gegl-cl-init.h
@@ -119,6 +119,8 @@ t_clReleaseCommandQueue gegl_clReleaseCommandQueue = NULL;
 t_clReleaseContext      gegl_clReleaseContext      = NULL;
 t_clReleaseMemObject    gegl_clReleaseMemObject    = NULL;
 
+t_clGetExtensionFunctionAddress gegl_clGetExtensionFunctionAddress = NULL;
+
 t_clCreateFromGLTexture2D    gegl_clCreateFromGLTexture2D = NULL;
 t_clEnqueueAcquireGLObjects  gegl_clEnqueueAcquireGLObjects = NULL;
 t_clEnqueueReleaseGLObjects  gegl_clEnqueueReleaseGLObjects = NULL;
@@ -169,6 +171,8 @@ extern t_clReleaseCommandQueue gegl_clReleaseCommandQueue;
 extern t_clReleaseContext      gegl_clReleaseContext;
 extern t_clReleaseMemObject    gegl_clReleaseMemObject;
 
+extern t_clGetExtensionFunctionAddress gegl_clGetExtensionFunctionAddress;
+
 extern t_clCreateFromGLTexture2D gegl_clCreateFromGLTexture2D;
 extern t_clEnqueueAcquireGLObjects gegl_clEnqueueAcquireGLObjects;
 extern t_clEnqueueReleaseGLObjects gegl_clEnqueueReleaseGLObjects;
diff --git a/gegl/opencl/gegl-cl-types.h b/gegl/opencl/gegl-cl-types.h
index 73c9b3b..eb0ea38 100644
--- a/gegl/opencl/gegl-cl-types.h
+++ b/gegl/opencl/gegl-cl-types.h
@@ -103,4 +103,6 @@ typedef CL_API_ENTRY cl_int            (CL_API_CALL *t_clEnqueueReleaseGLObjects
    const cl_event *event_wait_list,
    cl_event *event);
 
+typedef CL_API_ENTRY void *            (CL_API_CALL *t_clGetExtensionFunctionAddress)  (const char *);
+
 #endif /* __GEGL_CL_TYPES_H__ */

-- 
Jan Vesely <jan vesely rutgers edu>

Attachment: signature.asc
Description: This is a digitally signed message part



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]