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

Comparing OpenCL/OpenCL.xs (file contents):
Revision 1.9 by root, Thu Nov 17 03:05:56 2011 UTC vs.
Revision 1.12 by root, Thu Nov 17 06:22:29 2011 UTC

126 croak ("%s: %s is not of type %s", func, svname, pkg); 126 croak ("%s: %s is not of type %s", func, svname, pkg);
127} 127}
128 128
129/*****************************************************************************/ 129/*****************************************************************************/
130 130
131static size_t
132img_row_pitch (cl_mem img)
133{
134 size_t res;
135 clGetImageInfo (img, CL_IMAGE_ROW_PITCH, sizeof (res), &res, 0);
136 return res;
137}
138
131static cl_event * 139static cl_event *
132event_list (SV **items, int count) 140event_list (SV **items, int count)
133{ 141{
134 cl_event *list = tmpbuf (sizeof (cl_event) * count); 142 cl_event *list = tmpbuf (sizeof (cl_event) * count);
135 143
144 cl_event *event_list_ptr = event_list (&ST (items), event_list_count) 152 cl_event *event_list_ptr = event_list (&ST (items), event_list_count)
145 153
146#define INFO(class) \ 154#define INFO(class) \
147{ \ 155{ \
148 size_t size; \ 156 size_t size; \
149 SV *sv; \
150 \
151 NEED_SUCCESS (Get ## class ## Info, (this, name, 0, 0, &size)); \ 157 NEED_SUCCESS (Get ## class ## Info, (this, name, 0, 0, &size)); \
152 sv = sv_2mortal (newSV (size)); \ 158 SV *sv = sv_2mortal (newSV (size)); \
153 SvUPGRADE (sv, SVt_PV); \ 159 SvUPGRADE (sv, SVt_PV); \
154 SvPOK_only (sv); \ 160 SvPOK_only (sv); \
155 SvCUR_set (sv, size); \ 161 SvCUR_set (sv, size); \
156 NEED_SUCCESS (Get ## class ## Info, (this, name, size, SvPVX (sv), 0)); \ 162 NEED_SUCCESS (Get ## class ## Info, (this, name, size, SvPVX (sv), 0)); \
157 XPUSHs (sv); \ 163 XPUSHs (sv); \
194enum2str (cl_uint value) 200enum2str (cl_uint value)
195 201
196void 202void
197platforms () 203platforms ()
198 PPCODE: 204 PPCODE:
199{
200 cl_platform_id *list; 205 cl_platform_id *list;
201 cl_uint count; 206 cl_uint count;
202 int i; 207 int i;
203 208
204 NEED_SUCCESS (GetPlatformIDs, (0, 0, &count)); 209 NEED_SUCCESS (GetPlatformIDs, (0, 0, &count));
206 NEED_SUCCESS (GetPlatformIDs, (count, list, 0)); 211 NEED_SUCCESS (GetPlatformIDs, (count, list, 0));
207 212
208 EXTEND (SP, count); 213 EXTEND (SP, count);
209 for (i = 0; i < count; ++i) 214 for (i = 0; i < count; ++i)
210 PUSHs (NEW_MORTAL_OBJ ("OpenCL::Platform", list [i])); 215 PUSHs (NEW_MORTAL_OBJ ("OpenCL::Platform", list [i]));
211}
212 216
213void 217void
214context_from_type (FUTURE properties = 0, cl_device_type type = CL_DEVICE_TYPE_DEFAULT, FUTURE notify = 0) 218context_from_type (FUTURE properties = 0, cl_device_type type = CL_DEVICE_TYPE_DEFAULT, FUTURE notify = 0)
215 PPCODE: 219 PPCODE:
216 NEED_SUCCESS_ARG (cl_context ctx, CreateContextFromType, (0, type, 0, 0, &res)); 220 NEED_SUCCESS_ARG (cl_context ctx, CreateContextFromType, (0, type, 0, 0, &res));
222 /* der Gipfel der Kunst */ 226 /* der Gipfel der Kunst */
223 227
224void 228void
225wait_for_events (...) 229wait_for_events (...)
226 CODE: 230 CODE:
227{
228 EVENT_LIST (0, items); 231 EVENT_LIST (0, items);
229 NEED_SUCCESS (WaitForEvents, (event_list_count, event_list_ptr)); 232 NEED_SUCCESS (WaitForEvents, (event_list_count, event_list_ptr));
230}
231 233
232PROTOTYPES: DISABLE 234PROTOTYPES: DISABLE
233 235
234MODULE = OpenCL PACKAGE = OpenCL::Platform 236MODULE = OpenCL PACKAGE = OpenCL::Platform
235 237
239 INFO (Platform) 241 INFO (Platform)
240 242
241void 243void
242devices (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_ALL) 244devices (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_ALL)
243 PPCODE: 245 PPCODE:
244{
245 cl_device_id *list; 246 cl_device_id *list;
246 cl_uint count; 247 cl_uint count;
247 int i; 248 int i;
248 249
249 NEED_SUCCESS (GetDeviceIDs, (this, type, 0, 0, &count)); 250 NEED_SUCCESS (GetDeviceIDs, (this, type, 0, 0, &count));
251 NEED_SUCCESS (GetDeviceIDs, (this, type, count, list, 0)); 252 NEED_SUCCESS (GetDeviceIDs, (this, type, count, list, 0));
252 253
253 EXTEND (SP, count); 254 EXTEND (SP, count);
254 for (i = 0; i < count; ++i) 255 for (i = 0; i < count; ++i)
255 PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i])); 256 PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i]));
256}
257 257
258void 258void
259context (OpenCL::Platform this, FUTURE properties, SV *devices, FUTURE notify = 0) 259context (OpenCL::Platform this, FUTURE properties, SV *devices, FUTURE notify = 0)
260 PPCODE: 260 PPCODE:
261 if (!SvROK (devices) || SvTYPE (SvRV (devices)) != SVt_PVAV) 261 if (!SvROK (devices) || SvTYPE (SvRV (devices)) != SVt_PVAV)
262 croak ("OpenCL::Platform argument 'device' must be an arrayref with device objects, in call"); 262 croak ("OpenCL::Platform argument 'device' must be an arrayref with device objects, in call");
263 263
264 AV *av = (SV *)SvRV (devices); 264 AV *av = (AV *)SvRV (devices);
265 cl_uint num_devices = av_len (av) + 1; 265 cl_uint num_devices = av_len (av) + 1;
266 cl_device_id *device_list = tmpbuf (sizeof (cl_device_id) * num_devices); 266 cl_device_id *device_list = tmpbuf (sizeof (cl_device_id) * num_devices);
267 int i; 267 int i;
268 268
269 for (i = num_devices; i--; ) 269 for (i = num_devices; i--; )
330 330
331 NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (this, flags, len, ptr, &res)); 331 NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (this, flags, len, ptr, &res));
332 XPUSH_NEW_OBJ ("OpenCL::Buffer", mem); 332 XPUSH_NEW_OBJ ("OpenCL::Buffer", mem);
333 333
334void 334void
335image2d (OpenCL::Context this, cl_mem_flags flags, cl_channel_order channel_order, cl_channel_type channel_type, size_t width, size_t height, SV *data) 335image2d (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)
336 PPCODE: 336 PPCODE:
337 STRLEN len; 337 STRLEN len;
338 char *ptr = SvPVbyte (data, len); 338 char *ptr = SvPVbyte (data, len);
339 const cl_image_format format = { channel_order, channel_type }; 339 const cl_image_format format = { channel_order, channel_type };
340 NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (this, flags, &format, width, height, len / height, ptr, &res)); 340 NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (this, flags, &format, width, height, row_pitch, ptr, &res));
341 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); 341 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
342 342
343void 343void
344image3d (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 depth, size_t slice_pitch, SV *data) 344image3d (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 depth, size_t row_pitch = 0, size_t slice_pitch = 0, SV *data = &PL_sv_undef)
345 PPCODE: 345 PPCODE:
346 STRLEN len; 346 STRLEN len;
347 char *ptr = SvPVbyte (data, len); 347 char *ptr = SvPVbyte (data, len);
348 const cl_image_format format = { channel_order, channel_type }; 348 const cl_image_format format = { channel_order, channel_type };
349 NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (this, flags, &format, width, height, 349 NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (this, flags, &format, width, height, depth, row_pitch, slice_pitch, ptr, &res));
350 depth, len / (height * slice_pitch), slice_pitch, ptr, &res));
351 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem); 350 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem);
352 351
353void 352void
354supported_image_formats (OpenCL::Context this, cl_mem_flags flags, cl_mem_object_type image_type) 353supported_image_formats (OpenCL::Context this, cl_mem_flags flags, cl_mem_object_type image_type)
355 PPCODE: 354 PPCODE:
402 INFO (CommandQueue) 401 INFO (CommandQueue)
403 402
404void 403void
405enqueue_read_buffer (OpenCL::Queue this, OpenCL::Buffer mem, cl_bool blocking, size_t offset, size_t len, SV *data, ...) 404enqueue_read_buffer (OpenCL::Queue this, OpenCL::Buffer mem, cl_bool blocking, size_t offset, size_t len, SV *data, ...)
406 PPCODE: 405 PPCODE:
407{
408 cl_event ev = 0; 406 cl_event ev = 0;
409 EVENT_LIST (6, items - 6); 407 EVENT_LIST (6, items - 6);
410 408
411 SvUPGRADE (data, SVt_PV); 409 SvUPGRADE (data, SVt_PV);
412 SvGROW (data, len); 410 SvGROW (data, len);
414 SvCUR_set (data, len); 412 SvCUR_set (data, len);
415 NEED_SUCCESS (EnqueueReadBuffer, (this, mem, blocking, offset, len, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 413 NEED_SUCCESS (EnqueueReadBuffer, (this, mem, blocking, offset, len, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
416 414
417 if (ev) 415 if (ev)
418 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 416 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
419}
420 417
421void 418void
422enqueue_write_buffer (OpenCL::Queue this, OpenCL::Buffer mem, cl_bool blocking, size_t offset, SV *data, ...) 419enqueue_write_buffer (OpenCL::Queue this, OpenCL::Buffer mem, cl_bool blocking, size_t offset, SV *data, ...)
423 PPCODE: 420 PPCODE:
424{
425 cl_event ev = 0; 421 cl_event ev = 0;
426 STRLEN len; 422 STRLEN len;
427 char *ptr = SvPVbyte (data, len); 423 char *ptr = SvPVbyte (data, len);
428 EVENT_LIST (5, items - 5); 424 EVENT_LIST (5, items - 5);
429 425
430 NEED_SUCCESS (EnqueueReadBuffer, (this, mem, blocking, offset, len, ptr, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 426 NEED_SUCCESS (EnqueueReadBuffer, (this, mem, blocking, offset, len, ptr, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
431 427
432 if (ev) 428 if (ev)
433 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 429 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
434}
435 430
436void 431void
437enqueue_copy_buffer (OpenCL::Queue this, OpenCL::Buffer src, OpenCL::Buffer dst, size_t src_offset, size_t dst_offset, size_t len, ...) 432enqueue_copy_buffer (OpenCL::Queue this, OpenCL::Buffer src, OpenCL::Buffer dst, size_t src_offset, size_t dst_offset, size_t len, ...)
438 PPCODE: 433 PPCODE:
439{
440 cl_event ev = 0; 434 cl_event ev = 0;
441 EVENT_LIST (6, items - 6); 435 EVENT_LIST (6, items - 6);
442 436
443 NEED_SUCCESS (EnqueueCopyBuffer, (this, src, dst, src_offset, dst_offset, len, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 437 NEED_SUCCESS (EnqueueCopyBuffer, (this, src, dst, src_offset, dst_offset, len, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
444 438
445 if (ev) 439 if (ev)
446 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 440 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
447}
448
449 /*TODO http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html */
450 /*TODO http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html */
451 441
452void 442void
453enqueue_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, ...) 443enqueue_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, ...)
454 PPCODE: 444 PPCODE:
455{
456 cl_event ev = 0; 445 cl_event ev = 0;
457 const size_t src_origin[3] = { src_x, src_y, src_z }; 446 const size_t src_origin[3] = { src_x, src_y, src_z };
458 const size_t region[3] = { width, height, depth }; 447 const size_t region[3] = { width, height, depth };
459 size_t len = row_pitch * slice_pitch * depth;
460 EVENT_LIST (11, items - 11); 448 EVENT_LIST (12, items - 12);
449
450 if (!row_pitch)
451 row_pitch = img_row_pitch (src);
452
453 if (depth > 1 && !slice_pitch)
454 slice_pitch = row_pitch * height;
455
456 size_t len = slice_pitch ? slice_pitch * depth : row_pitch * height;
461 457
462 SvUPGRADE (data, SVt_PV); 458 SvUPGRADE (data, SVt_PV);
463 SvGROW (data, len); 459 SvGROW (data, len);
464 SvPOK_only (data); 460 SvPOK_only (data);
465 SvCUR_set (data, len); 461 SvCUR_set (data, len);
466 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)); 462 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));
467 463
468 if (ev) 464 if (ev)
469 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 465 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
470}
471 466
472void 467void
473enqueue_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, SV *data, ...) 468enqueue_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, ...)
474 PPCODE: 469 PPCODE:
475{
476 cl_event ev = 0; 470 cl_event ev = 0;
477 const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; 471 const size_t dst_origin[3] = { dst_x, dst_y, dst_z };
478 const size_t region[3] = { width, height, depth }; 472 const size_t region[3] = { width, height, depth };
479 STRLEN len; 473 STRLEN len;
480 char *ptr = SvPVbyte (data, len); 474 char *ptr = SvPVbyte (data, len);
481 size_t slice_pitch = len / (row_pitch * height);
482 EVENT_LIST (11, items - 11); 475 EVENT_LIST (12, items - 12);
476
477 if (!row_pitch)
478 row_pitch = img_row_pitch (dst);
479
480 if (depth > 1 && !slice_pitch)
481 slice_pitch = row_pitch * height;
482
483 size_t min_len = slice_pitch ? slice_pitch * depth : row_pitch * height;
484
485 if (len < min_len)
486 croak ("clEnqueueWriteImage: data string is shorter than what would be transferred");
483 487
484 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)); 488 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));
485 489
486 if (ev) 490 if (ev)
487 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 491 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
488}
489 492
490void 493void
491enqueue_copy_buffer_rect (OpenCL::Queue this, OpenCL::Buffer src, OpenCL::Buffer dst, size_t src_x, size_t src_y, size_t src_z, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, size_t src_row_pitch, size_t src_slice_pitch, size_t dst_row_pitch, size_t dst_slice_pitch, ...) 494enqueue_copy_buffer_rect (OpenCL::Queue this, OpenCL::Buffer src, OpenCL::Buffer dst, size_t src_x, size_t src_y, size_t src_z, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, size_t src_row_pitch, size_t src_slice_pitch, size_t dst_row_pitch, size_t dst_slice_pitch, ...)
492 PPCODE: 495 PPCODE:
493{
494 cl_event ev = 0; 496 cl_event ev = 0;
495 const size_t src_origin[3] = { src_x, src_y, src_z }; 497 const size_t src_origin[3] = { src_x, src_y, src_z };
496 const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; 498 const size_t dst_origin[3] = { dst_x, dst_y, dst_z };
497 const size_t region[3] = { width, height, depth }; 499 const size_t region[3] = { width, height, depth };
498 EVENT_LIST (16, items - 16); 500 EVENT_LIST (16, items - 16);
499 501
500 NEED_SUCCESS (EnqueueCopyBufferRect, (this, src, dst, src_origin, dst_origin, region, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 502 NEED_SUCCESS (EnqueueCopyBufferRect, (this, src, dst, src_origin, dst_origin, region, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
501 503
502 if (ev) 504 if (ev)
503 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 505 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
504}
505 506
506void 507void
507enqueue_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, ...) 508enqueue_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, ...)
508 PPCODE: 509 PPCODE:
509{
510 cl_event ev = 0; 510 cl_event ev = 0;
511 const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; 511 const size_t dst_origin[3] = { dst_x, dst_y, dst_z };
512 const size_t region[3] = { width, height, depth }; 512 const size_t region[3] = { width, height, depth };
513 EVENT_LIST (10, items - 10); 513 EVENT_LIST (10, items - 10);
514 514
515 NEED_SUCCESS (EnqueueCopyBufferToImage, (this, src, dst, src_offset, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 515 NEED_SUCCESS (EnqueueCopyBufferToImage, (this, src, dst, src_offset, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
516 516
517 if (ev) 517 if (ev)
518 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 518 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
519}
520 519
521void 520void
522enqueue_copy_image (OpenCL::Queue this, OpenCL::Image src, OpenCL::Image dst, size_t src_x, size_t src_y, size_t src_z, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, ...) 521enqueue_copy_image (OpenCL::Queue this, OpenCL::Image src, OpenCL::Image dst, size_t src_x, size_t src_y, size_t src_z, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, ...)
523 PPCODE: 522 PPCODE:
524{
525 cl_event ev = 0; 523 cl_event ev = 0;
526 const size_t src_origin[3] = { src_x, src_y, src_z }; 524 const size_t src_origin[3] = { src_x, src_y, src_z };
527 const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; 525 const size_t dst_origin[3] = { dst_x, dst_y, dst_z };
528 const size_t region[3] = { width, height, depth }; 526 const size_t region[3] = { width, height, depth };
529 EVENT_LIST (12, items - 12); 527 EVENT_LIST (12, items - 12);
530 528
531 NEED_SUCCESS (EnqueueCopyImage, (this, src, dst, src_origin, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 529 NEED_SUCCESS (EnqueueCopyImage, (this, src, dst, src_origin, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
532 530
533 if (ev) 531 if (ev)
534 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 532 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
535}
536 533
537void 534void
538enqueue_copy_image_to_buffer (OpenCL::Queue this, OpenCL::Image src, OpenCL::Buffer dst, size_t src_x, size_t src_y, size_t src_z, size_t width, size_t height, size_t depth, size_t dst_offset, ...) 535enqueue_copy_image_to_buffer (OpenCL::Queue this, OpenCL::Image src, OpenCL::Buffer dst, size_t src_x, size_t src_y, size_t src_z, size_t width, size_t height, size_t depth, size_t dst_offset, ...)
539 PPCODE: 536 PPCODE:
540{
541 cl_event ev = 0; 537 cl_event ev = 0;
542 const size_t src_origin[3] = { src_x, src_y, src_z }; 538 const size_t src_origin[3] = { src_x, src_y, src_z };
543 const size_t region[3] = { width, height, depth }; 539 const size_t region[3] = { width, height, depth };
544 EVENT_LIST (10, items - 10); 540 EVENT_LIST (10, items - 10);
545 541
546 NEED_SUCCESS (EnqueueCopyImageToBuffer, (this, src, dst, src_origin, region, dst_offset, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 542 NEED_SUCCESS (EnqueueCopyImageToBuffer, (this, src, dst, src_origin, region, dst_offset, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
547 543
548 if (ev) 544 if (ev)
549 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 545 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
550}
551 546
552void 547void
553enqueue_task (OpenCL::Queue this, OpenCL::Kernel kernel, ...) 548enqueue_task (OpenCL::Queue this, OpenCL::Kernel kernel, ...)
554 PPCODE: 549 PPCODE:
555{
556 cl_event ev = 0; 550 cl_event ev = 0;
557 EVENT_LIST (2, items - 2); 551 EVENT_LIST (2, items - 2);
558 552
559 NEED_SUCCESS (EnqueueTask, (this, kernel, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 553 NEED_SUCCESS (EnqueueTask, (this, kernel, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
560 554
561 if (ev) 555 if (ev)
562 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 556 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
563}
564 557
565void 558void
566enqueue_nd_range_kernel (OpenCL::Queue this, OpenCL::Kernel kernel, SV *global_work_offset, SV *global_work_size, SV *local_work_size = &PL_sv_undef, ...) 559enqueue_nd_range_kernel (OpenCL::Queue this, OpenCL::Kernel kernel, SV *global_work_offset, SV *global_work_size, SV *local_work_size = &PL_sv_undef, ...)
567 PPCODE: 560 PPCODE:
568{
569 cl_event ev = 0; 561 cl_event ev = 0;
570 size_t *gwo = 0, *gws, *lws = 0; 562 size_t *gwo = 0, *gws, *lws = 0;
571 int gws_len; 563 int gws_len;
572 size_t *lists; 564 size_t *lists;
573 int i; 565 int i;
612 604
613 NEED_SUCCESS (EnqueueNDRangeKernel, (this, kernel, gws_len, gwo, gws, lws, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 605 NEED_SUCCESS (EnqueueNDRangeKernel, (this, kernel, gws_len, gwo, gws, lws, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
614 606
615 if (ev) 607 if (ev)
616 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 608 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
617}
618 609
619void 610void
620enqueue_marker (OpenCL::Queue this) 611enqueue_marker (OpenCL::Queue this)
621 PPCODE: 612 PPCODE:
622{
623 cl_event ev; 613 cl_event ev;
624 NEED_SUCCESS (EnqueueMarker, (this, &ev)); 614 NEED_SUCCESS (EnqueueMarker, (this, &ev));
625 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 615 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
626}
627 616
628void 617void
629enqueue_wait_for_events (OpenCL::Queue this, ...) 618enqueue_wait_for_events (OpenCL::Queue this, ...)
630 CODE: 619 CODE:
631{
632 EVENT_LIST (1, items - 1); 620 EVENT_LIST (1, items - 1);
633 NEED_SUCCESS (EnqueueWaitForEvents, (this, event_list_count, event_list_ptr)); 621 NEED_SUCCESS (EnqueueWaitForEvents, (this, event_list_count, event_list_ptr));
634}
635 622
636void 623void
637enqueue_barrier (OpenCL::Queue this) 624enqueue_barrier (OpenCL::Queue this)
638 CODE: 625 CODE:
639 NEED_SUCCESS (EnqueueBarrier, (this)); 626 NEED_SUCCESS (EnqueueBarrier, (this));
690 NEED_SUCCESS (BuildProgram, (this, 1, &device, SvPVbyte_nolen (options), 0, 0)); 677 NEED_SUCCESS (BuildProgram, (this, 1, &device, SvPVbyte_nolen (options), 0, 0));
691 678
692void 679void
693build_info (OpenCL::Program this, OpenCL::Device device, cl_program_build_info name) 680build_info (OpenCL::Program this, OpenCL::Device device, cl_program_build_info name)
694 PPCODE: 681 PPCODE:
695{
696 size_t size; 682 size_t size;
697 SV *sv;
698
699 NEED_SUCCESS (GetProgramBuildInfo, (this, device, name, 0, 0, &size)); 683 NEED_SUCCESS (GetProgramBuildInfo, (this, device, name, 0, 0, &size));
700 sv = sv_2mortal (newSV (size)); 684 SV *sv = sv_2mortal (newSV (size));
701 SvUPGRADE (sv, SVt_PV); 685 SvUPGRADE (sv, SVt_PV);
702 SvPOK_only (sv); 686 SvPOK_only (sv);
703 SvCUR_set (sv, size); 687 SvCUR_set (sv, size);
704 NEED_SUCCESS (GetProgramBuildInfo, (this, device, name, size, SvPVX (sv), 0)); 688 NEED_SUCCESS (GetProgramBuildInfo, (this, device, name, size, SvPVX (sv), 0));
705 XPUSHs (sv); 689 XPUSHs (sv);
706}
707 690
708void 691void
709kernel (OpenCL::Program program, SV *function) 692kernel (OpenCL::Program program, SV *function)
710 PPCODE: 693 PPCODE:
711 NEED_SUCCESS_ARG (cl_kernel kernel, CreateKernel, (program, SvPVbyte_nolen (function), &res)); 694 NEED_SUCCESS_ARG (cl_kernel kernel, CreateKernel, (program, SvPVbyte_nolen (function), &res));

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines