--- OpenCL/OpenCL.xs 2012/04/21 20:48:03 1.42 +++ OpenCL/OpenCL.xs 2012/04/24 12:23:56 1.46 @@ -13,18 +13,25 @@ // in addition, you cannot test for this in any future-proof way. // each time a new opencl version comes out, you need to make a new // release. -#define CL_USE_DEPRECATED_OPENCL_1_1_APIS #define CL_USE_DEPRECATED_OPENCL_1_2_APIS /* just guessing, you stupid idiots */ +#ifndef PREFER_1_1 + #define PREFER_1_1 1 +#endif + +#if PREFER_1_1 + #define CL_USE_DEPRECATED_OPENCL_1_1_APIS +#endif + #ifdef __APPLE__ #include #else #include #endif -#if 0 // testing -#undef CL_USE_DEPRECATED_OPENCL_1_1_APIS -#undef CL_VERSION_1_2 +#ifndef CL_VERSION_1_2 + #undef PREFER_1_1 + #define PREFER_1_1 1 #endif typedef cl_platform_id OpenCL__Platform; @@ -761,19 +768,17 @@ #endif -#if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS - void image2d (OpenCL::Context self, cl_mem_flags flags, cl_channel_order channel_order, cl_channel_type channel_type, size_t width, size_t height, size_t row_pitch = 0, SV *data = &PL_sv_undef) PPCODE: STRLEN len; char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; const cl_image_format format = { channel_order, channel_type }; -#if CL_VERSION_1_2 +#if PREFER_1_1 + NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (self, flags, &format, width, height, row_pitch, ptr, &res)); +#else const cl_image_desc desc = { CL_MEM_OBJECT_IMAGE2D, width, height, 0, 0, row_pitch, 0, 0, 0, 0 }; NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res)); -#else - NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (self, flags, &format, width, height, row_pitch, ptr, &res)); #endif XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); @@ -783,16 +788,14 @@ STRLEN len; char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; const cl_image_format format = { channel_order, channel_type }; -#if CL_VERSION_1_2 +#if PREFER_1_1 + NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (self, flags, &format, width, height, depth, row_pitch, slice_pitch, ptr, &res)); +#else const cl_image_desc desc = { CL_MEM_OBJECT_IMAGE3D, width, height, depth, 0, row_pitch, slice_pitch, 0, 0, 0 }; NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res)); -#else - NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (self, flags, &format, width, height, depth, row_pitch, slice_pitch, ptr, &res)); #endif XPUSH_NEW_OBJ ("OpenCL::Image3D", mem); -#endif - #if cl_apple_gl_sharing || cl_khr_gl_sharing void @@ -811,11 +814,12 @@ void gl_texture (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture) + ALIAS: PPCODE: - char *klass = "OpenCL::Memory"; + NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture, (self, flags, target, miplevel, texture, &res)); cl_gl_object_type type; - NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res)); - NEED_SUCCESS (GetGLObjectInfo, (mem, &type, 0)); + NEED_SUCCESS (GetGLObjectInfo, (mem, &type, 0)); // TODO: use target instead? + char *klass = "OpenCL::Memory"; switch (type) { case CL_GL_OBJECT_TEXTURE_BUFFER: klass = "OpenCL::Image1DBuffer"; break; @@ -829,21 +833,25 @@ #endif -#if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS - void gl_texture2d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture) PPCODE: +#if PREFER_1_1 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res)); +#else + NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture , (self, flags, target, miplevel, texture, &res)); +#endif XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); void gl_texture3d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture) PPCODE: +#if PREFER_1_1 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture3D, (self, flags, target, miplevel, texture, &res)); - XPUSH_NEW_OBJ ("OpenCL::Image3D", mem); - +#else + NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture , (self, flags, target, miplevel, texture, &res)); #endif + XPUSH_NEW_OBJ ("OpenCL::Image3D", mem); #endif @@ -1252,13 +1260,20 @@ PPCODE: cl_event ev = 0; EVENT_LIST (1, items - 1); +#if PREFER_1_1 #if CL_VERSION_1_2 - NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); + if (event_list_count) + NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); + else + NEED_SUCCESS (EnqueueMarker, (self, GIMME_V != G_VOID ? &ev : 0)); #else if (event_list_count) croak ("OpenCL::Queue->enqueue_marker does not support a wait list in OpenCL 1.1 - upgrade to 1.2"); NEED_SUCCESS (EnqueueMarker, (self, GIMME_V != G_VOID ? &ev : 0)); #endif +#else + NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); +#endif if (ev) XPUSH_NEW_OBJ ("OpenCL::Event", ev); @@ -1267,8 +1282,12 @@ PPCODE: cl_event ev = 0; EVENT_LIST (1, items - 1); +#if PREFER_1_1 #if CL_VERSION_1_2 - NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, &ev)); + if (event_list_count || GIMME_V != G_VOID) + NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); + else + NEED_SUCCESS (EnqueueBarrier, (self)); #else if (event_list_count) croak ("OpenCL::Queue->enqueue_barrier does not support a wait list in OpenCL 1.1 - upgrade to 1.2"); @@ -1276,6 +1295,9 @@ croak ("OpenCL::Queue->enqueue_barrier does not return an event object in OpenCL 1.1 - upgrade to 1.2"); NEED_SUCCESS (EnqueueBarrier, (self)); #endif +#else + NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); +#endif if (ev) XPUSH_NEW_OBJ ("OpenCL::Event", ev);