--- OpenCL/OpenCL.xs 2011/11/22 10:29:18 1.16 +++ OpenCL/OpenCL.xs 2011/11/24 03:02:57 1.19 @@ -2,7 +2,11 @@ #include "perl.h" #include "XSUB.h" -#include +#ifdef __APPLE__ + #include +#else + #include +#endif typedef cl_platform_id OpenCL__Platform; typedef cl_device_id OpenCL__Device; @@ -10,6 +14,7 @@ typedef cl_command_queue OpenCL__Queue; typedef cl_mem OpenCL__Memory; typedef cl_mem OpenCL__Buffer; +typedef cl_mem OpenCL__BufferObj; typedef cl_mem OpenCL__Image; typedef cl_mem OpenCL__Image2D; typedef cl_mem OpenCL__Image3D; @@ -562,7 +567,7 @@ croak ("clCreateBuffer: cannot use/copy host ptr when no data is given, use $context->buffer_sv instead?"); NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (this, flags, len, 0, &res)); - XPUSH_NEW_OBJ ("OpenCL::Buffer", mem); + XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); void buffer_sv (OpenCL::Context this, cl_mem_flags flags, SV *data) @@ -574,7 +579,7 @@ croak ("clCreateBuffer: have to specify use or copy host ptr when buffer data is given, use $context->buffer instead?"); NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (this, flags, len, ptr, &res)); - XPUSH_NEW_OBJ ("OpenCL::Buffer", mem); + XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); void image2d (OpenCL::Context this, 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) @@ -722,52 +727,66 @@ XPUSH_NEW_OBJ ("OpenCL::Event", ev); void -enqueue_read_image (OpenCL::Queue this, OpenCL::Image src, cl_bool blocking, size_t src_x, size_t src_y, size_t src_z, size_t width, size_t height, size_t depth, size_t row_pitch, size_t slice_pitch, SV *data, ...) +enqueue_read_buffer_rect (OpenCL::Queue this, OpenCL::Memory buf, cl_bool blocking, size_t buf_x, size_t buf_y, size_t buf_z, size_t host_x, size_t host_y, size_t host_z, size_t width, size_t height, size_t depth, size_t buf_row_pitch, size_t buf_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, SV *data, ...) PPCODE: cl_event ev = 0; - const size_t src_origin[3] = { src_x, src_y, src_z }; + const size_t buf_origin [3] = { buf_x , buf_y , buf_z }; + const size_t host_origin[3] = { host_x, host_y, host_z }; const size_t region[3] = { width, height, depth }; - EVENT_LIST (12, items - 12); + EVENT_LIST (17, items - 17); - if (!row_pitch) - row_pitch = img_row_pitch (src); + if (!buf_row_pitch) + buf_row_pitch = region [0]; - if (depth > 1 && !slice_pitch) - slice_pitch = row_pitch * height; + if (!buf_slice_pitch) + buf_slice_pitch = region [1] * buf_row_pitch; - size_t len = slice_pitch ? slice_pitch * depth : row_pitch * height; + if (!host_row_pitch) + host_row_pitch = region [0]; + + if (!host_slice_pitch) + host_slice_pitch = region [1] * host_row_pitch; + + size_t len = host_row_pitch * host_slice_pitch * region [2]; SvUPGRADE (data, SVt_PV); SvGROW (data, len); SvPOK_only (data); SvCUR_set (data, len); - NEED_SUCCESS (EnqueueReadImage, (this, src, blocking, src_origin, region, row_pitch, slice_pitch, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); + NEED_SUCCESS (EnqueueReadBufferRect, (this, buf, blocking, buf_origin, host_origin, region, buf_row_pitch, buf_slice_pitch, host_row_pitch, host_slice_pitch, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); if (ev) XPUSH_NEW_OBJ ("OpenCL::Event", ev); void -enqueue_write_image (OpenCL::Queue this, OpenCL::Image dst, cl_bool blocking, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, size_t row_pitch, size_t slice_pitch, SV *data, ...) +enqueue_write_buffer_rect (OpenCL::Queue this, OpenCL::Memory buf, cl_bool blocking, size_t buf_x, size_t buf_y, size_t buf_z, size_t host_x, size_t host_y, size_t host_z, size_t width, size_t height, size_t depth, size_t buf_row_pitch, size_t buf_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, SV *data, ...) PPCODE: cl_event ev = 0; - const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; + const size_t buf_origin [3] = { buf_x , buf_y , buf_z }; + const size_t host_origin[3] = { host_x, host_y, host_z }; const size_t region[3] = { width, height, depth }; STRLEN len; char *ptr = SvPVbyte (data, len); - EVENT_LIST (12, items - 12); + EVENT_LIST (17, items - 17); - if (!row_pitch) - row_pitch = img_row_pitch (dst); + if (!buf_row_pitch) + buf_row_pitch = region [0]; - if (depth > 1 && !slice_pitch) - slice_pitch = row_pitch * height; + if (!buf_slice_pitch) + buf_slice_pitch = region [1] * buf_row_pitch; - size_t min_len = slice_pitch ? slice_pitch * depth : row_pitch * height; + if (!host_row_pitch) + host_row_pitch = region [0]; + + if (!host_slice_pitch) + host_slice_pitch = region [1] * host_row_pitch; + + size_t min_len = host_row_pitch * host_slice_pitch * region [2]; if (len < min_len) croak ("clEnqueueWriteImage: data string is shorter than what would be transferred"); - NEED_SUCCESS (EnqueueWriteImage, (this, dst, blocking, dst_origin, region, row_pitch, slice_pitch, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); + NEED_SUCCESS (EnqueueWriteBufferRect, (this, buf, blocking, buf_origin, host_origin, region, buf_row_pitch, buf_slice_pitch, host_row_pitch, host_slice_pitch, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); if (ev) XPUSH_NEW_OBJ ("OpenCL::Event", ev); @@ -787,14 +806,52 @@ XPUSH_NEW_OBJ ("OpenCL::Event", ev); void -enqueue_copy_buffer_to_image (OpenCL::Queue this, OpenCL::Buffer src, OpenCL::Image dst, size_t src_offset, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, ...) +enqueue_read_image (OpenCL::Queue this, OpenCL::Image src, cl_bool blocking, size_t src_x, size_t src_y, size_t src_z, size_t width, size_t height, size_t depth, size_t row_pitch, size_t slice_pitch, SV *data, ...) + PPCODE: + cl_event ev = 0; + const size_t src_origin[3] = { src_x, src_y, src_z }; + const size_t region[3] = { width, height, depth }; + EVENT_LIST (12, items - 12); + + if (!row_pitch) + row_pitch = img_row_pitch (src); + + if (depth > 1 && !slice_pitch) + slice_pitch = row_pitch * height; + + size_t len = slice_pitch ? slice_pitch * depth : row_pitch * height; + + SvUPGRADE (data, SVt_PV); + SvGROW (data, len); + SvPOK_only (data); + SvCUR_set (data, len); + NEED_SUCCESS (EnqueueReadImage, (this, src, blocking, src_origin, region, row_pitch, slice_pitch, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); + + if (ev) + XPUSH_NEW_OBJ ("OpenCL::Event", ev); + +void +enqueue_write_image (OpenCL::Queue this, OpenCL::Image dst, cl_bool blocking, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, size_t row_pitch, size_t slice_pitch, SV *data, ...) PPCODE: cl_event ev = 0; const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; const size_t region[3] = { width, height, depth }; - EVENT_LIST (10, items - 10); + STRLEN len; + char *ptr = SvPVbyte (data, len); + EVENT_LIST (12, items - 12); - NEED_SUCCESS (EnqueueCopyBufferToImage, (this, src, dst, src_offset, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); + if (!row_pitch) + row_pitch = img_row_pitch (dst); + + if (depth > 1 && !slice_pitch) + slice_pitch = row_pitch * height; + + size_t min_len = slice_pitch ? slice_pitch * depth : row_pitch * height; + + if (len < min_len) + croak ("clEnqueueWriteImage: data string is shorter than what would be transferred"); + + NEED_SUCCESS (EnqueueWriteImage, (this, dst, blocking, dst_origin, region, row_pitch, slice_pitch, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); if (ev) XPUSH_NEW_OBJ ("OpenCL::Event", ev); @@ -827,6 +884,19 @@ XPUSH_NEW_OBJ ("OpenCL::Event", ev); void +enqueue_copy_buffer_to_image (OpenCL::Queue this, OpenCL::Buffer src, OpenCL::Image dst, size_t src_offset, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, ...) + PPCODE: + cl_event ev = 0; + const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; + const size_t region[3] = { width, height, depth }; + EVENT_LIST (10, items - 10); + + NEED_SUCCESS (EnqueueCopyBufferToImage, (this, src, dst, src_offset, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); + + if (ev) + XPUSH_NEW_OBJ ("OpenCL::Event", ev); + +void enqueue_task (OpenCL::Queue this, OpenCL::Kernel kernel, ...) PPCODE: cl_event ev = 0; @@ -1058,6 +1128,19 @@ #END:mem +MODULE = OpenCL PACKAGE = OpenCL::BufferObj + +void +sub_buffer_region (OpenCL::BufferObj this, cl_mem_flags flags, size_t origin, size_t size) + PPCODE: + if (flags & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR | CL_MEM_ALLOC_HOST_PTR)) + croak ("clCreateSubBuffer: cannot use/copy/alloc host ptr, doesn't make sense, check your flags!"); + + cl_buffer_region crdata = { origin, size }; + + NEED_SUCCESS_ARG (cl_mem mem, CreateSubBuffer, (this, flags, CL_BUFFER_CREATE_TYPE_REGION, &crdata, &res)); + XPUSH_NEW_OBJ ("OpenCL::Buffer", mem); + MODULE = OpenCL PACKAGE = OpenCL::Image void