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

Comparing OpenCL/OpenCL.xs (file contents):
Revision 1.39 by root, Sat Apr 21 19:48:58 2012 UTC vs.
Revision 1.46 by root, Tue Apr 24 12:23:56 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;
502 native_vector_width_int = CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 509 native_vector_width_int = CL_DEVICE_NATIVE_VECTOR_WIDTH_INT
503 native_vector_width_long = CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 510 native_vector_width_long = CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG
504 native_vector_width_float = CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 511 native_vector_width_float = CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT
505 native_vector_width_double = CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 512 native_vector_width_double = CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE
506 native_vector_width_half = CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 513 native_vector_width_half = CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF
507 reference_count_ext = CL_DEVICE_REFERENCE_COUNT_EXT 514 reference_count_ext = CL_DEVICE_REFERENCE_COUNT_EXT
508 PPCODE: 515 PPCODE:
509 cl_uint value [1]; 516 cl_uint value [1];
510 NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0)); 517 NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0));
511 EXTEND (SP, 1); 518 EXTEND (SP, 1);
512 const int i = 0; 519 const int i = 0;
729 if (!(flags & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR))) 736 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?"); 737 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)); 738 NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (self, flags, len, ptr, &res));
732 XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); 739 XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem);
733 740
734#if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS 741#if CL_VERSION_1_2
735 742
736void 743void
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) 744image (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: 745 PPCODE:
739 STRLEN len; 746 STRLEN len;
740 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; 747 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0;
741 const cl_image_format format = { channel_order, channel_type }; 748 const cl_image_format format = { channel_order, channel_type };
749 const cl_image_desc desc = {
750 type,
751 width, height, depth,
752 array_size, row_pitch, slice_pitch,
753 num_mip_level, num_samples,
754 type == CL_MEM_OBJECT_IMAGE1D_BUFFER ? (cl_mem)SvPTROBJ ("OpenCL::Context::Image", "data", data, "OpenCL::Buffer") : 0
755 };
742 NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (self, flags, &format, width, height, row_pitch, ptr, &res)); 756 NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res));
757 char *klass = "OpenCL::Image";
758 switch (type)
759 {
760 case CL_MEM_OBJECT_IMAGE1D_BUFFER: klass = "OpenCL::Image1DBuffer"; break;
761 case CL_MEM_OBJECT_IMAGE1D: klass = "OpenCL::Image1D"; break;
762 case CL_MEM_OBJECT_IMAGE1D_ARRAY: klass = "OpenCL::Image2DArray"; break;
763 case CL_MEM_OBJECT_IMAGE2D: klass = "OpenCL::Image2D"; break;
764 case CL_MEM_OBJECT_IMAGE2D_ARRAY: klass = "OpenCL::Image2DArray"; break;
765 case CL_MEM_OBJECT_IMAGE3D: klass = "OpenCL::Image3D"; break;
766 }
743 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); 767 XPUSH_NEW_OBJ (klass, mem);
744 768
769#endif
770
745void 771void
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) 772image2d (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: 773 PPCODE:
748 STRLEN len; 774 STRLEN len;
749 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; 775 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0;
750 const cl_image_format format = { channel_order, channel_type }; 776 const cl_image_format format = { channel_order, channel_type };
777#if PREFER_1_1
778 NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (self, flags, &format, width, height, row_pitch, ptr, &res));
779#else
780 const cl_image_desc desc = { CL_MEM_OBJECT_IMAGE2D, width, height, 0, 0, row_pitch, 0, 0, 0, 0 };
781 NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res));
782#endif
783 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
784
785void
786image3d (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)
787 PPCODE:
788 STRLEN len;
789 char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0;
790 const cl_image_format format = { channel_order, channel_type };
791#if PREFER_1_1
751 NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (self, flags, &format, width, height, depth, row_pitch, slice_pitch, ptr, &res)); 792 NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (self, flags, &format, width, height, depth, row_pitch, slice_pitch, ptr, &res));
793#else
794 const cl_image_desc desc = { CL_MEM_OBJECT_IMAGE3D, width, height, depth, 0, row_pitch, slice_pitch, 0, 0, 0 };
795 NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res));
796#endif
752 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem); 797 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem);
753
754#endif
755 798
756#if cl_apple_gl_sharing || cl_khr_gl_sharing 799#if cl_apple_gl_sharing || cl_khr_gl_sharing
757 800
758void 801void
759gl_buffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint bufobj) 802gl_buffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint bufobj)
760 PPCODE: 803 PPCODE:
761 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLBuffer, (self, flags, bufobj, &res)); 804 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLBuffer, (self, flags, bufobj, &res));
762 XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); 805 XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem);
763 806
764#if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS
765
766void 807void
767gl_texture2d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture) 808gl_renderbuffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint renderbuffer)
768 PPCODE: 809 PPCODE:
769 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res)); 810 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLRenderbuffer, (self, flags, renderbuffer, &res));
770 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); 811 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
771 812
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
780#if CL_VERSION_1_2 813#if CL_VERSION_1_2
781 814
782void 815void
783gl_texture (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture) 816gl_texture (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture)
817 ALIAS:
784 PPCODE: 818 PPCODE:
819 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture, (self, flags, target, miplevel, texture, &res));
820 cl_gl_object_type type;
821 NEED_SUCCESS (GetGLObjectInfo, (mem, &type, 0)); // TODO: use target instead?
785 char *klass = "OpenCL::Memory"; 822 char *klass = "OpenCL::Memory";
786 cl_gl_object_type t;
787 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res));
788 NEED_SUCCESS (GetGLObjectInfo, (mem, &t, 0));
789 switch (t) 823 switch (type)
790 { 824 {
791 case CL_GL_OBJECT_TEXTURE_BUFFER: klass = "OpenCL::Image1DBuffer"; break; 825 case CL_GL_OBJECT_TEXTURE_BUFFER: klass = "OpenCL::Image1DBuffer"; break;
792 case CL_GL_OBJECT_TEXTURE1D: klass = "OpenCL::Image1D"; break; 826 case CL_GL_OBJECT_TEXTURE1D: klass = "OpenCL::Image1D"; break;
793 case CL_GL_OBJECT_TEXTURE1D_ARRAY: klass = "OpenCL::Image2DArray"; break; 827 case CL_GL_OBJECT_TEXTURE1D_ARRAY: klass = "OpenCL::Image2DArray"; break;
794 case CL_GL_OBJECT_TEXTURE2D: klass = "OpenCL::Image2D"; break; 828 case CL_GL_OBJECT_TEXTURE2D: klass = "OpenCL::Image2D"; break;
798 XPUSH_NEW_OBJ (klass, mem); 832 XPUSH_NEW_OBJ (klass, mem);
799 833
800#endif 834#endif
801 835
802void 836void
803gl_renderbuffer (OpenCL::Context self, cl_mem_flags flags, cl_GLuint renderbuffer) 837gl_texture2d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture)
804 PPCODE: 838 PPCODE:
805 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLRenderbuffer, (self, flags, renderbuffer, &res)); 839#if PREFER_1_1
840 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res));
841#else
842 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture , (self, flags, target, miplevel, texture, &res));
843#endif
806 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); 844 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
845
846void
847gl_texture3d (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture)
848 PPCODE:
849#if PREFER_1_1
850 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture3D, (self, flags, target, miplevel, texture, &res));
851#else
852 NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture , (self, flags, target, miplevel, texture, &res));
853#endif
854 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem);
807 855
808#endif 856#endif
809 857
810void 858void
811supported_image_formats (OpenCL::Context self, cl_mem_flags flags, cl_mem_object_type image_type) 859supported_image_formats (OpenCL::Context self, cl_mem_flags flags, cl_mem_object_type image_type)
1210void 1258void
1211enqueue_marker (OpenCL::Queue self, ...) 1259enqueue_marker (OpenCL::Queue self, ...)
1212 PPCODE: 1260 PPCODE:
1213 cl_event ev = 0; 1261 cl_event ev = 0;
1214 EVENT_LIST (1, items - 1); 1262 EVENT_LIST (1, items - 1);
1263#if PREFER_1_1
1215#if CL_VERSION_1_2 1264#if CL_VERSION_1_2
1265 if (event_list_count)
1216 NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 1266 NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1267 else
1268 NEED_SUCCESS (EnqueueMarker, (self, GIMME_V != G_VOID ? &ev : 0));
1217#else 1269#else
1218 if (event_list_count) 1270 if (event_list_count)
1219 croak ("OpenCL::Queue->enqueue_marker does not support a wait list in OpenCL 1.1 - upgrade to 1.2"); 1271 croak ("OpenCL::Queue->enqueue_marker does not support a wait list in OpenCL 1.1 - upgrade to 1.2");
1220 NEED_SUCCESS (EnqueueMarker, (self, GIMME_V != G_VOID ? &ev : 0)); 1272 NEED_SUCCESS (EnqueueMarker, (self, GIMME_V != G_VOID ? &ev : 0));
1221#endif 1273#endif
1274#else
1275 NEED_SUCCESS (EnqueueMarkerWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1276#endif
1222 if (ev) 1277 if (ev)
1223 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 1278 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
1224 1279
1225void 1280void
1226enqueue_barrier (OpenCL::Queue self, ...) 1281enqueue_barrier (OpenCL::Queue self, ...)
1227 PPCODE: 1282 PPCODE:
1228 cl_event ev = 0; 1283 cl_event ev = 0;
1229 EVENT_LIST (1, items - 1); 1284 EVENT_LIST (1, items - 1);
1285#if PREFER_1_1
1230#if CL_VERSION_1_2 1286#if CL_VERSION_1_2
1287 if (event_list_count || GIMME_V != G_VOID)
1231 NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, &ev)); 1288 NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1289 else
1290 NEED_SUCCESS (EnqueueBarrier, (self));
1232#else 1291#else
1233 if (event_list_count) 1292 if (event_list_count)
1234 croak ("OpenCL::Queue->enqueue_barrier does not support a wait list in OpenCL 1.1 - upgrade to 1.2"); 1293 croak ("OpenCL::Queue->enqueue_barrier does not support a wait list in OpenCL 1.1 - upgrade to 1.2");
1235 if (GIMME_V != G_VOID) 1294 if (GIMME_V != G_VOID)
1236 croak ("OpenCL::Queue->enqueue_barrier does not return an event object in OpenCL 1.1 - upgrade to 1.2"); 1295 croak ("OpenCL::Queue->enqueue_barrier does not return an event object in OpenCL 1.1 - upgrade to 1.2");
1237 NEED_SUCCESS (EnqueueBarrier, (self)); 1296 NEED_SUCCESS (EnqueueBarrier, (self));
1297#endif
1298#else
1299 NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
1238#endif 1300#endif
1239 if (ev) 1301 if (ev)
1240 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 1302 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
1241 1303
1242void 1304void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines