ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.xs
(Generate patch)

Comparing OpenCL/OpenCL.xs (file contents):
Revision 1.38 by root, Sat Apr 21 19:17:09 2012 UTC vs.
Revision 1.47 by root, Tue Apr 24 13:30:49 2012 UTC

11// this. This breaks 100% of the opencl 1.1 apps, for what reason? 11// this. This breaks 100% of the opencl 1.1 apps, for what reason?
12// after all, the functions are deprecated, not removed. 12// after all, the functions are deprecated, not removed.
13// in addition, you cannot test for this in any future-proof way. 13// in addition, you cannot test for this in any future-proof way.
14// each time a new opencl version comes out, you need to make a new 14// each time a new opencl version comes out, you need to make a new
15// release. 15// release.
16#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
17#define CL_USE_DEPRECATED_OPENCL_1_2_APIS /* just guessing, you stupid idiots */ 16#define CL_USE_DEPRECATED_OPENCL_1_2_APIS /* just guessing, you stupid idiots */
17
18#ifndef PREFER_1_1
19 #define PREFER_1_1 1
20#endif
21
22#if PREFER_1_1
23 #define CL_USE_DEPRECATED_OPENCL_1_1_APIS
24#endif
18 25
19#ifdef __APPLE__ 26#ifdef __APPLE__
20 #include <OpenCL/opencl.h> 27 #include <OpenCL/opencl.h>
21#else 28#else
22 #include <CL/opencl.h> 29 #include <CL/opencl.h>
23#endif 30#endif
24 31
25#if 0 // testing
26#undef CL_USE_DEPRECATED_OPENCL_1_1_APIS
27#undef CL_VERSION_1_2 32#ifndef CL_VERSION_1_2
33 #undef PREFER_1_1
34 #define PREFER_1_1 1
28#endif 35#endif
29 36
30typedef cl_platform_id OpenCL__Platform; 37typedef cl_platform_id OpenCL__Platform;
31typedef cl_device_id OpenCL__Device; 38typedef cl_device_id OpenCL__Device;
32typedef cl_context OpenCL__Context; 39typedef cl_context OpenCL__Context;
393 400
394void 401void
395info (OpenCL::Platform self, cl_platform_info name) 402info (OpenCL::Platform self, cl_platform_info name)
396 PPCODE: 403 PPCODE:
397 INFO (Platform) 404 INFO (Platform)
405
406void
407unload_compiler (OpenCL::Platform self)
408 CODE:
409#if CL_VERSION_1_2
410 clUnloadPlatformCompiler (self);
411#endif
398 412
399#BEGIN:platform 413#BEGIN:platform
400 414
401void 415void
402profile (OpenCL::Platform self) 416profile (OpenCL::Platform self)
502 native_vector_width_int = CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 516 native_vector_width_int = CL_DEVICE_NATIVE_VECTOR_WIDTH_INT
503 native_vector_width_long = CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 517 native_vector_width_long = CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG
504 native_vector_width_float = CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 518 native_vector_width_float = CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT
505 native_vector_width_double = CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 519 native_vector_width_double = CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE
506 native_vector_width_half = CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 520 native_vector_width_half = CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF
507 reference_count_ext = CL_DEVICE_REFERENCE_COUNT_EXT 521 reference_count_ext = CL_DEVICE_REFERENCE_COUNT_EXT
508 PPCODE: 522 PPCODE:
509 cl_uint value [1]; 523 cl_uint value [1];
510 NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0)); 524 NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0));
511 EXTEND (SP, 1); 525 EXTEND (SP, 1);
512 const int i = 0; 526 const int i = 0;
729 if (!(flags & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR))) 743 if (!(flags & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR)))
730 croak ("OpenCL::Context::buffer_sv: you have to specify use or copy host ptr when buffer data is given, use $context->buffer instead?"); 744 croak ("OpenCL::Context::buffer_sv: you have to specify use or copy host ptr when buffer data is given, use $context->buffer instead?");
731 NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (self, flags, len, ptr, &res)); 745 NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (self, flags, len, ptr, &res));
732 XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); 746 XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem);
733 747
734#if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS 748#if CL_VERSION_1_2
735 749
736void 750void
737image2d (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) 751image (OpenCL::Context self, cl_mem_flags flags, cl_channel_order channel_order, cl_channel_type channel_type, cl_mem_object_type type, size_t width, size_t height, size_t depth, size_t array_size = 0, size_t row_pitch = 0, size_t slice_pitch = 0, cl_uint num_mip_level = 0, cl_uint num_samples = 0, SV *data = &PL_sv_undef)
738 PPCODE: 752 PPCODE:
739 STRLEN len; 753 STRLEN len;
740 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; 754 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0;
741 const cl_image_format format = { channel_order, channel_type }; 755 const cl_image_format format = { channel_order, channel_type };
756 const cl_image_desc desc = {
757 type,
758 width, height, depth,
759 array_size, row_pitch, slice_pitch,
760 num_mip_level, num_samples,
761 type == CL_MEM_OBJECT_IMAGE1D_BUFFER ? (cl_mem)SvPTROBJ ("OpenCL::Context::Image", "data", data, "OpenCL::Buffer") : 0
762 };
742 NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (self, flags, &format, width, height, row_pitch, ptr, &res)); 763 NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res));
764 char *klass = "OpenCL::Image";
765 switch (type)
766 {
767 case CL_MEM_OBJECT_IMAGE1D_BUFFER: klass = "OpenCL::Image1DBuffer"; break;
768 case CL_MEM_OBJECT_IMAGE1D: klass = "OpenCL::Image1D"; break;
769 case CL_MEM_OBJECT_IMAGE1D_ARRAY: klass = "OpenCL::Image2DArray"; break;
770 case CL_MEM_OBJECT_IMAGE2D: klass = "OpenCL::Image2D"; break;
771 case CL_MEM_OBJECT_IMAGE2D_ARRAY: klass = "OpenCL::Image2DArray"; break;
772 case CL_MEM_OBJECT_IMAGE3D: klass = "OpenCL::Image3D"; break;
773 }
743 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); 774 XPUSH_NEW_OBJ (klass, mem);
744 775
776#endif
777
745void 778void
746image3d (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 depth, size_t row_pitch = 0, size_t slice_pitch = 0, SV *data = &PL_sv_undef) 779image2d (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)
747 PPCODE: 780 PPCODE:
748 STRLEN len; 781 STRLEN len;
749 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; 782 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0;
750 const cl_image_format format = { channel_order, channel_type }; 783 const cl_image_format format = { channel_order, channel_type };
784#if PREFER_1_1
785 NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (self, flags, &format, width, height, row_pitch, ptr, &res));
786#else
787 const cl_image_desc desc = { CL_MEM_OBJECT_IMAGE2D, width, height, 0, 0, row_pitch, 0, 0, 0, 0 };
788 NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res));
789#endif
790 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
791
792void
793image3d (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 depth, size_t row_pitch = 0, size_t slice_pitch = 0, SV *data = &PL_sv_undef)
794 PPCODE:
795 STRLEN len;
796 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0;
797 const cl_image_format format = { channel_order, channel_type };
798#if PREFER_1_1
751 NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (self, flags, &format, width, height, depth, row_pitch, slice_pitch, ptr, &res)); 799 NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (self, flags, &format, width, height, depth, row_pitch, slice_pitch, ptr, &res));
800#else
801 const cl_image_desc desc = { CL_MEM_OBJECT_IMAGE3D, width, height, depth, 0, row_pitch, slice_pitch, 0, 0, 0 };
802 NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res));
803#endif
752 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem); 804 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem);
753
754#endif
755 805
756#if cl_apple_gl_sharing || cl_khr_gl_sharing 806#if cl_apple_gl_sharing || cl_khr_gl_sharing
757 807
758void 808void
759gl_buffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint bufobj) 809gl_buffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint bufobj)
760 PPCODE: 810 PPCODE:
761 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLBuffer, (self, flags, bufobj, &res)); 811 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLBuffer, (self, flags, bufobj, &res));
762 XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); 812 XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem);
763 813
764#if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS
765
766void
767gl_texture2d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture)
768 PPCODE:
769 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res));
770 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
771
772void
773gl_texture3d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture)
774 PPCODE:
775 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture3D, (self, flags, target, miplevel, texture, &res));
776 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem);
777
778#endif
779
780void 814void
781gl_renderbuffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint renderbuffer) 815gl_renderbuffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint renderbuffer)
782 PPCODE: 816 PPCODE:
783 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLRenderbuffer, (self, flags, renderbuffer, &res)); 817 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLRenderbuffer, (self, flags, renderbuffer, &res));
784 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); 818 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
819
820#if CL_VERSION_1_2
821
822void
823gl_texture (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture)
824 ALIAS:
825 PPCODE:
826 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture, (self, flags, target, miplevel, texture, &res));
827 cl_gl_object_type type;
828 NEED_SUCCESS (GetGLObjectInfo, (mem, &type, 0)); // TODO: use target instead?
829 char *klass = "OpenCL::Memory";
830 switch (type)
831 {
832 case CL_GL_OBJECT_TEXTURE_BUFFER: klass = "OpenCL::Image1DBuffer"; break;
833 case CL_GL_OBJECT_TEXTURE1D: klass = "OpenCL::Image1D"; break;
834 case CL_GL_OBJECT_TEXTURE1D_ARRAY: klass = "OpenCL::Image2DArray"; break;
835 case CL_GL_OBJECT_TEXTURE2D: klass = "OpenCL::Image2D"; break;
836 case CL_GL_OBJECT_TEXTURE2D_ARRAY: klass = "OpenCL::Image2DArray"; break;
837 case CL_GL_OBJECT_TEXTURE3D: klass = "OpenCL::Image3D"; break;
838 }
839 XPUSH_NEW_OBJ (klass, mem);
840
841#endif
842
843void
844gl_texture2d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture)
845 PPCODE:
846#if PREFER_1_1
847 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res));
848#else
849 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture , (self, flags, target, miplevel, texture, &res));
850#endif
851 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
852
853void
854gl_texture3d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture)
855 PPCODE:
856#if PREFER_1_1
857 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture3D, (self, flags, target, miplevel, texture, &res));
858#else
859 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture , (self, flags, target, miplevel, texture, &res));
860#endif
861 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem);
785 862
786#endif 863#endif
787 864
788void 865void
789supported_image_formats (OpenCL::Context self, cl_mem_flags flags, cl_mem_object_type image_type) 866supported_image_formats (OpenCL::Context self, cl_mem_flags flags, cl_mem_object_type image_type)
1173 if (ev) 1250 if (ev)
1174 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 1251 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
1175 1252
1176#endif 1253#endif
1177 1254
1178#if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS
1179
1180void 1255void
1181enqueue_wait_for_events (OpenCL::Queue self, ...) 1256enqueue_wait_for_events (OpenCL::Queue self, ...)
1182 CODE: 1257 CODE:
1183 EVENT_LIST (1, items - 1); 1258 EVENT_LIST (1, items - 1);
1259#if PREFER_1_1
1184 NEED_SUCCESS (EnqueueWaitForEvents, (self, event_list_count, event_list_ptr)); 1260 NEED_SUCCESS (EnqueueWaitForEvents, (self, event_list_count, event_list_ptr));
1185 1261#else
1262 NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, 0));
1186#endif 1263#endif
1187 1264
1188void 1265void
1189enqueue_marker (OpenCL::Queue self, ...) 1266enqueue_marker (OpenCL::Queue self, ...)
1190 PPCODE: 1267 PPCODE:
1191 cl_event ev = 0; 1268 cl_event ev = 0;
1192 EVENT_LIST (1, items - 1); 1269 EVENT_LIST (1, items - 1);
1270#if PREFER_1_1
1271 if (!event_list_count)
1272 NEED_SUCCESS (EnqueueMarker, (self, GIMME_V != G_VOID ? &ev : 0));
1273 else
1193#if CL_VERSION_1_2 1274#if CL_VERSION_1_2
1275 NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1276#else
1277 NEED_SUCCESS (EnqueueWaitForEvents, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); // also a barrier
1278#endif
1279#else
1194 NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 1280 NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1195#else
1196 if (event_list_count)
1197 croak ("OpenCL::Queue->enqueue_marker does not support a wait list in OpenCL 1.1 - upgrade to 1.2");
1198 NEED_SUCCESS (EnqueueMarker, (self, GIMME_V != G_VOID ? &ev : 0));
1199#endif 1281#endif
1200 if (ev) 1282 if (ev)
1201 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 1283 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
1202 1284
1203void 1285void
1204enqueue_barrier (OpenCL::Queue self, ...) 1286enqueue_barrier (OpenCL::Queue self, ...)
1205 PPCODE: 1287 PPCODE:
1206 cl_event ev = 0; 1288 cl_event ev = 0;
1207 EVENT_LIST (1, items - 1); 1289 EVENT_LIST (1, items - 1);
1290#if PREFER_1_1
1291 if (!event_list_count && GIMME_V == G_VOID)
1292 NEED_SUCCESS (EnqueueBarrier, (self));
1293 else
1208#if CL_VERSION_1_2 1294#if CL_VERSION_1_2
1209 NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, &ev)); 1295 NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1210#else 1296#else
1297 {
1211 if (event_list_count) 1298 if (event_list_count)
1212 croak ("OpenCL::Queue->enqueue_barrier does not support a wait list in OpenCL 1.1 - upgrade to 1.2"); 1299 NEED_SUCCESS (EnqueueWaitForEvents, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1300
1213 if (GIMME_V != G_VOID) 1301 if (GIMME_V != G_VOID)
1214 croak ("OpenCL::Queue->enqueue_barrier does not return an event object in OpenCL 1.1 - upgrade to 1.2");
1215 NEED_SUCCESS (EnqueueBarrier, (self)); 1302 NEED_SUCCESS (EnqueueMarker, (self, &ev));
1303 }
1304#endif
1305#else
1306 NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1216#endif 1307#endif
1217 if (ev) 1308 if (ev)
1218 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 1309 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
1219 1310
1220void 1311void
1566void 1657void
1567kernel (OpenCL::Program program, SV *function) 1658kernel (OpenCL::Program program, SV *function)
1568 PPCODE: 1659 PPCODE:
1569 NEED_SUCCESS_ARG (cl_kernel kernel, CreateKernel, (program, SvPVbyte_nolen (function), &res)); 1660 NEED_SUCCESS_ARG (cl_kernel kernel, CreateKernel, (program, SvPVbyte_nolen (function), &res));
1570 XPUSH_NEW_OBJ ("OpenCL::Kernel", kernel); 1661 XPUSH_NEW_OBJ ("OpenCL::Kernel", kernel);
1662
1663void
1664kernels_in_program (OpenCL::Program program)
1665 PPCODE:
1666 cl_uint num_kernels;
1667 NEED_SUCCESS (CreateKernelsInProgram, (program, 0, 0, &num_kernels));
1668 cl_kernel *kernels = tmpbuf (sizeof (cl_kernel) * num_kernels);
1669 NEED_SUCCESS (CreateKernelsInProgram, (program, num_kernels, kernels, 0));
1670
1671 int i;
1672 EXTEND (SP, num_kernels);
1673 for (i = 0; i < num_kernels; ++i)
1674 PUSHs (NEW_MORTAL_OBJ ("OpenCL::Kernel", kernels [i]));
1571 1675
1572void 1676void
1573info (OpenCL::Program self, cl_program_info name) 1677info (OpenCL::Program self, cl_program_info name)
1574 PPCODE: 1678 PPCODE:
1575 INFO (Program) 1679 INFO (Program)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines