--- OpenCL/OpenCL.xs 2012/04/21 18:49:21 1.37 +++ OpenCL/OpenCL.xs 2012/04/21 19:53:29 1.41 @@ -22,6 +22,11 @@ #include #endif +#if 0 // testing +#undef CL_USE_DEPRECATED_OPENCL_1_1_APIS +#undef CL_VERSION_1_2 +#endif + typedef cl_platform_id OpenCL__Platform; typedef cl_device_id OpenCL__Device; typedef cl_context OpenCL__Context; @@ -499,7 +504,7 @@ native_vector_width_float = CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT native_vector_width_double = CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE native_vector_width_half = CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF - reference_count_ext = CL_DEVICE_REFERENCE_COUNT_EXT + reference_count_ext = CL_DEVICE_REFERENCE_COUNT_EXT PPCODE: cl_uint value [1]; NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0)); @@ -726,7 +731,7 @@ NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (self, flags, len, ptr, &res)); XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); -#if !defined CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS +#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) @@ -756,7 +761,35 @@ NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLBuffer, (self, flags, bufobj, &res)); XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); -#if !defined CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS +void +gl_renderbuffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint renderbuffer) + PPCODE: + NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLRenderbuffer, (self, flags, renderbuffer, &res)); + XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); + +#if CL_VERSION_1_2 + +void +gl_texture (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture) + PPCODE: + char *klass = "OpenCL::Memory"; + cl_gl_object_type t; + NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res)); + NEED_SUCCESS (GetGLObjectInfo, (mem, &t, 0)); + switch (t) + { + case CL_GL_OBJECT_TEXTURE_BUFFER: klass = "OpenCL::Image1DBuffer"; break; + case CL_GL_OBJECT_TEXTURE1D: klass = "OpenCL::Image1D"; break; + case CL_GL_OBJECT_TEXTURE1D_ARRAY: klass = "OpenCL::Image2DArray"; break; + case CL_GL_OBJECT_TEXTURE2D: klass = "OpenCL::Image2D"; break; + case CL_GL_OBJECT_TEXTURE2D_ARRAY: klass = "OpenCL::Image2DArray"; break; + case CL_GL_OBJECT_TEXTURE3D: klass = "OpenCL::Image3D"; break; + } + XPUSH_NEW_OBJ (klass, mem); + +#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) @@ -772,12 +805,6 @@ #endif -void -gl_renderbuffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint renderbuffer) - PPCODE: - NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLRenderbuffer, (self, flags, renderbuffer, &res)); - XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); - #endif void @@ -1170,14 +1197,7 @@ #endif -#if !defined CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS - -void -enqueue_marker (OpenCL::Queue self) - PPCODE: - cl_event ev; - NEED_SUCCESS (EnqueueMarker, (self, &ev)); - XPUSH_NEW_OBJ ("OpenCL::Event", ev); +#if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS void enqueue_wait_for_events (OpenCL::Queue self, ...) @@ -1185,12 +1205,39 @@ EVENT_LIST (1, items - 1); NEED_SUCCESS (EnqueueWaitForEvents, (self, event_list_count, event_list_ptr)); +#endif + void -enqueue_barrier (OpenCL::Queue self) - CODE: - NEED_SUCCESS (EnqueueBarrier, (self)); +enqueue_marker (OpenCL::Queue self, ...) + PPCODE: + cl_event ev = 0; + EVENT_LIST (1, items - 1); +#if CL_VERSION_1_2 + NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, 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 + if (ev) + XPUSH_NEW_OBJ ("OpenCL::Event", ev); +void +enqueue_barrier (OpenCL::Queue self, ...) + PPCODE: + cl_event ev = 0; + EVENT_LIST (1, items - 1); +#if CL_VERSION_1_2 + NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, &ev)); +#else + if (event_list_count) + croak ("OpenCL::Queue->enqueue_barrier does not support a wait list in OpenCL 1.1 - upgrade to 1.2"); + if (GIMME_V != G_VOID) + croak ("OpenCL::Queue->enqueue_barrier does not return an event object in OpenCL 1.1 - upgrade to 1.2"); + NEED_SUCCESS (EnqueueBarrier, (self)); #endif + if (ev) + XPUSH_NEW_OBJ ("OpenCL::Event", ev); void flush (OpenCL::Queue self)