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.13 by root, Sun Nov 20 01:09:48 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
236void 238void
237info (OpenCL::Platform this, cl_platform_info name) 239info (OpenCL::Platform this, cl_platform_info name)
238 PPCODE: 240 PPCODE:
239 INFO (Platform) 241 INFO (Platform)
240 242
243#BEGIN:platform
244
245void
246profile (OpenCL::Platform this)
247 PPCODE:
248 size_t size;
249 int i, n;
250 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_PROFILE, 0, 0, &size));
251 char *value = tmpbuf (size);
252 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_PROFILE, size, value, 0));
253 n = 1;
254 EXTEND (SP, n);
255 for (i = 0; i < n; ++i)
256 PUSHs (sv_2mortal (newSVpvn (value, size)));
257
258void
259version (OpenCL::Platform this)
260 PPCODE:
261 size_t size;
262 int i, n;
263 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_VERSION, 0, 0, &size));
264 char *value = tmpbuf (size);
265 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_VERSION, size, value, 0));
266 n = 1;
267 EXTEND (SP, n);
268 for (i = 0; i < n; ++i)
269 PUSHs (sv_2mortal (newSVpvn (value, size)));
270
271void
272name (OpenCL::Platform this)
273 PPCODE:
274 size_t size;
275 int i, n;
276 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_NAME, 0, 0, &size));
277 char *value = tmpbuf (size);
278 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_NAME, size, value, 0));
279 n = 1;
280 EXTEND (SP, n);
281 for (i = 0; i < n; ++i)
282 PUSHs (sv_2mortal (newSVpvn (value, size)));
283
284void
285vendor (OpenCL::Platform this)
286 PPCODE:
287 size_t size;
288 int i, n;
289 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_VENDOR, 0, 0, &size));
290 char *value = tmpbuf (size);
291 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_VENDOR, size, value, 0));
292 n = 1;
293 EXTEND (SP, n);
294 for (i = 0; i < n; ++i)
295 PUSHs (sv_2mortal (newSVpvn (value, size)));
296
297void
298extensions (OpenCL::Platform this)
299 PPCODE:
300 size_t size;
301 int i, n;
302 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_EXTENSIONS, 0, 0, &size));
303 char *value = tmpbuf (size);
304 NEED_SUCCESS (GetPlatformInfo, (this, CL_PLATFORM_EXTENSIONS, size, value, 0));
305 n = 1;
306 EXTEND (SP, n);
307 for (i = 0; i < n; ++i)
308 PUSHs (sv_2mortal (newSVpvn (value, size)));
309
310#END:platform
311
241void 312void
242devices (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_ALL) 313devices (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_ALL)
243 PPCODE: 314 PPCODE:
244{
245 cl_device_id *list; 315 cl_device_id *list;
246 cl_uint count; 316 cl_uint count;
247 int i; 317 int i;
248 318
249 NEED_SUCCESS (GetDeviceIDs, (this, type, 0, 0, &count)); 319 NEED_SUCCESS (GetDeviceIDs, (this, type, 0, 0, &count));
251 NEED_SUCCESS (GetDeviceIDs, (this, type, count, list, 0)); 321 NEED_SUCCESS (GetDeviceIDs, (this, type, count, list, 0));
252 322
253 EXTEND (SP, count); 323 EXTEND (SP, count);
254 for (i = 0; i < count; ++i) 324 for (i = 0; i < count; ++i)
255 PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i])); 325 PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i]));
256}
257 326
258void 327void
259context (OpenCL::Platform this, FUTURE properties, SV *devices, FUTURE notify = 0) 328context (OpenCL::Platform this, FUTURE properties, SV *devices, FUTURE notify = 0)
260 PPCODE: 329 PPCODE:
261 if (!SvROK (devices) || SvTYPE (SvRV (devices)) != SVt_PVAV) 330 if (!SvROK (devices) || SvTYPE (SvRV (devices)) != SVt_PVAV)
262 croak ("OpenCL::Platform argument 'device' must be an arrayref with device objects, in call"); 331 croak ("OpenCL::Platform argument 'device' must be an arrayref with device objects, in call");
263 332
264 AV *av = (SV *)SvRV (devices); 333 AV *av = (AV *)SvRV (devices);
265 cl_uint num_devices = av_len (av) + 1; 334 cl_uint num_devices = av_len (av) + 1;
266 cl_device_id *device_list = tmpbuf (sizeof (cl_device_id) * num_devices); 335 cl_device_id *device_list = tmpbuf (sizeof (cl_device_id) * num_devices);
267 int i; 336 int i;
268 337
269 for (i = num_devices; i--; ) 338 for (i = num_devices; i--; )
330 399
331 NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (this, flags, len, ptr, &res)); 400 NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (this, flags, len, ptr, &res));
332 XPUSH_NEW_OBJ ("OpenCL::Buffer", mem); 401 XPUSH_NEW_OBJ ("OpenCL::Buffer", mem);
333 402
334void 403void
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) 404image2d (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: 405 PPCODE:
337 STRLEN len; 406 STRLEN len;
338 char *ptr = SvPVbyte (data, len); 407 char *ptr = SvPVbyte (data, len);
339 const cl_image_format format = { channel_order, channel_type }; 408 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)); 409 NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (this, flags, &format, width, height, row_pitch, ptr, &res));
341 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); 410 XPUSH_NEW_OBJ ("OpenCL::Image2D", mem);
342 411
343void 412void
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) 413image3d (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: 414 PPCODE:
346 STRLEN len; 415 STRLEN len;
347 char *ptr = SvPVbyte (data, len); 416 char *ptr = SvPVbyte (data, len);
348 const cl_image_format format = { channel_order, channel_type }; 417 const cl_image_format format = { channel_order, channel_type };
349 NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (this, flags, &format, width, height, 418 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); 419 XPUSH_NEW_OBJ ("OpenCL::Image3D", mem);
352 420
353void 421void
354supported_image_formats (OpenCL::Context this, cl_mem_flags flags, cl_mem_object_type image_type) 422supported_image_formats (OpenCL::Context this, cl_mem_flags flags, cl_mem_object_type image_type)
355 PPCODE: 423 PPCODE:
387 455
388 len2 = len; 456 len2 = len;
389 NEED_SUCCESS_ARG (cl_program prog, CreateProgramWithSource, (this, 1, &ptr, &len2, &res)); 457 NEED_SUCCESS_ARG (cl_program prog, CreateProgramWithSource, (this, 1, &ptr, &len2, &res));
390 XPUSH_NEW_OBJ ("OpenCL::Program", prog); 458 XPUSH_NEW_OBJ ("OpenCL::Program", prog);
391 459
460#BEGIN:context
461
462#END:context
463
392MODULE = OpenCL PACKAGE = OpenCL::Queue 464MODULE = OpenCL PACKAGE = OpenCL::Queue
393 465
394void 466void
395DESTROY (OpenCL::Queue this) 467DESTROY (OpenCL::Queue this)
396 CODE: 468 CODE:
402 INFO (CommandQueue) 474 INFO (CommandQueue)
403 475
404void 476void
405enqueue_read_buffer (OpenCL::Queue this, OpenCL::Buffer mem, cl_bool blocking, size_t offset, size_t len, SV *data, ...) 477enqueue_read_buffer (OpenCL::Queue this, OpenCL::Buffer mem, cl_bool blocking, size_t offset, size_t len, SV *data, ...)
406 PPCODE: 478 PPCODE:
407{
408 cl_event ev = 0; 479 cl_event ev = 0;
409 EVENT_LIST (6, items - 6); 480 EVENT_LIST (6, items - 6);
410 481
411 SvUPGRADE (data, SVt_PV); 482 SvUPGRADE (data, SVt_PV);
412 SvGROW (data, len); 483 SvGROW (data, len);
414 SvCUR_set (data, len); 485 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)); 486 NEED_SUCCESS (EnqueueReadBuffer, (this, mem, blocking, offset, len, SvPVX (data), event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
416 487
417 if (ev) 488 if (ev)
418 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 489 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
419}
420 490
421void 491void
422enqueue_write_buffer (OpenCL::Queue this, OpenCL::Buffer mem, cl_bool blocking, size_t offset, SV *data, ...) 492enqueue_write_buffer (OpenCL::Queue this, OpenCL::Buffer mem, cl_bool blocking, size_t offset, SV *data, ...)
423 PPCODE: 493 PPCODE:
424{
425 cl_event ev = 0; 494 cl_event ev = 0;
426 STRLEN len; 495 STRLEN len;
427 char *ptr = SvPVbyte (data, len); 496 char *ptr = SvPVbyte (data, len);
428 EVENT_LIST (5, items - 5); 497 EVENT_LIST (5, items - 5);
429 498
430 NEED_SUCCESS (EnqueueReadBuffer, (this, mem, blocking, offset, len, ptr, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 499 NEED_SUCCESS (EnqueueReadBuffer, (this, mem, blocking, offset, len, ptr, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
431 500
432 if (ev) 501 if (ev)
433 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 502 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
434}
435 503
436void 504void
437enqueue_copy_buffer (OpenCL::Queue this, OpenCL::Buffer src, OpenCL::Buffer dst, size_t src_offset, size_t dst_offset, size_t len, ...) 505enqueue_copy_buffer (OpenCL::Queue this, OpenCL::Buffer src, OpenCL::Buffer dst, size_t src_offset, size_t dst_offset, size_t len, ...)
438 PPCODE: 506 PPCODE:
439{
440 cl_event ev = 0; 507 cl_event ev = 0;
441 EVENT_LIST (6, items - 6); 508 EVENT_LIST (6, items - 6);
442 509
443 NEED_SUCCESS (EnqueueCopyBuffer, (this, src, dst, src_offset, dst_offset, len, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 510 NEED_SUCCESS (EnqueueCopyBuffer, (this, src, dst, src_offset, dst_offset, len, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
444 511
445 if (ev) 512 if (ev)
446 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 513 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 514
452void 515void
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, ...) 516enqueue_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: 517 PPCODE:
455{
456 cl_event ev = 0; 518 cl_event ev = 0;
457 const size_t src_origin[3] = { src_x, src_y, src_z }; 519 const size_t src_origin[3] = { src_x, src_y, src_z };
458 const size_t region[3] = { width, height, depth }; 520 const size_t region[3] = { width, height, depth };
459 size_t len = row_pitch * slice_pitch * depth;
460 EVENT_LIST (11, items - 11); 521 EVENT_LIST (12, items - 12);
522
523 if (!row_pitch)
524 row_pitch = img_row_pitch (src);
525
526 if (depth > 1 && !slice_pitch)
527 slice_pitch = row_pitch * height;
528
529 size_t len = slice_pitch ? slice_pitch * depth : row_pitch * height;
461 530
462 SvUPGRADE (data, SVt_PV); 531 SvUPGRADE (data, SVt_PV);
463 SvGROW (data, len); 532 SvGROW (data, len);
464 SvPOK_only (data); 533 SvPOK_only (data);
465 SvCUR_set (data, len); 534 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)); 535 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 536
468 if (ev) 537 if (ev)
469 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 538 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
470}
471 539
472void 540void
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, ...) 541enqueue_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: 542 PPCODE:
475{
476 cl_event ev = 0; 543 cl_event ev = 0;
477 const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; 544 const size_t dst_origin[3] = { dst_x, dst_y, dst_z };
478 const size_t region[3] = { width, height, depth }; 545 const size_t region[3] = { width, height, depth };
479 STRLEN len; 546 STRLEN len;
480 char *ptr = SvPVbyte (data, len); 547 char *ptr = SvPVbyte (data, len);
481 size_t slice_pitch = len / (row_pitch * height);
482 EVENT_LIST (11, items - 11); 548 EVENT_LIST (12, items - 12);
549
550 if (!row_pitch)
551 row_pitch = img_row_pitch (dst);
552
553 if (depth > 1 && !slice_pitch)
554 slice_pitch = row_pitch * height;
555
556 size_t min_len = slice_pitch ? slice_pitch * depth : row_pitch * height;
557
558 if (len < min_len)
559 croak ("clEnqueueWriteImage: data string is shorter than what would be transferred");
483 560
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)); 561 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 562
486 if (ev) 563 if (ev)
487 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 564 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
488}
489 565
490void 566void
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, ...) 567enqueue_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: 568 PPCODE:
493{
494 cl_event ev = 0; 569 cl_event ev = 0;
495 const size_t src_origin[3] = { src_x, src_y, src_z }; 570 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 }; 571 const size_t dst_origin[3] = { dst_x, dst_y, dst_z };
497 const size_t region[3] = { width, height, depth }; 572 const size_t region[3] = { width, height, depth };
498 EVENT_LIST (16, items - 16); 573 EVENT_LIST (16, items - 16);
499 574
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)); 575 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 576
502 if (ev) 577 if (ev)
503 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 578 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
504}
505 579
506void 580void
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, ...) 581enqueue_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: 582 PPCODE:
509{
510 cl_event ev = 0; 583 cl_event ev = 0;
511 const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; 584 const size_t dst_origin[3] = { dst_x, dst_y, dst_z };
512 const size_t region[3] = { width, height, depth }; 585 const size_t region[3] = { width, height, depth };
513 EVENT_LIST (10, items - 10); 586 EVENT_LIST (10, items - 10);
514 587
515 NEED_SUCCESS (EnqueueCopyBufferToImage, (this, src, dst, src_offset, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 588 NEED_SUCCESS (EnqueueCopyBufferToImage, (this, src, dst, src_offset, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
516 589
517 if (ev) 590 if (ev)
518 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 591 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
519}
520 592
521void 593void
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, ...) 594enqueue_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: 595 PPCODE:
524{
525 cl_event ev = 0; 596 cl_event ev = 0;
526 const size_t src_origin[3] = { src_x, src_y, src_z }; 597 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 }; 598 const size_t dst_origin[3] = { dst_x, dst_y, dst_z };
528 const size_t region[3] = { width, height, depth }; 599 const size_t region[3] = { width, height, depth };
529 EVENT_LIST (12, items - 12); 600 EVENT_LIST (12, items - 12);
530 601
531 NEED_SUCCESS (EnqueueCopyImage, (this, src, dst, src_origin, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 602 NEED_SUCCESS (EnqueueCopyImage, (this, src, dst, src_origin, dst_origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
532 603
533 if (ev) 604 if (ev)
534 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 605 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
535}
536 606
537void 607void
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, ...) 608enqueue_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: 609 PPCODE:
540{
541 cl_event ev = 0; 610 cl_event ev = 0;
542 const size_t src_origin[3] = { src_x, src_y, src_z }; 611 const size_t src_origin[3] = { src_x, src_y, src_z };
543 const size_t region[3] = { width, height, depth }; 612 const size_t region[3] = { width, height, depth };
544 EVENT_LIST (10, items - 10); 613 EVENT_LIST (10, items - 10);
545 614
546 NEED_SUCCESS (EnqueueCopyImageToBuffer, (this, src, dst, src_origin, region, dst_offset, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 615 NEED_SUCCESS (EnqueueCopyImageToBuffer, (this, src, dst, src_origin, region, dst_offset, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
547 616
548 if (ev) 617 if (ev)
549 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 618 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
550}
551 619
552void 620void
553enqueue_task (OpenCL::Queue this, OpenCL::Kernel kernel, ...) 621enqueue_task (OpenCL::Queue this, OpenCL::Kernel kernel, ...)
554 PPCODE: 622 PPCODE:
555{
556 cl_event ev = 0; 623 cl_event ev = 0;
557 EVENT_LIST (2, items - 2); 624 EVENT_LIST (2, items - 2);
558 625
559 NEED_SUCCESS (EnqueueTask, (this, kernel, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 626 NEED_SUCCESS (EnqueueTask, (this, kernel, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
560 627
561 if (ev) 628 if (ev)
562 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 629 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
563}
564 630
565void 631void
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, ...) 632enqueue_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: 633 PPCODE:
568{
569 cl_event ev = 0; 634 cl_event ev = 0;
570 size_t *gwo = 0, *gws, *lws = 0; 635 size_t *gwo = 0, *gws, *lws = 0;
571 int gws_len; 636 int gws_len;
572 size_t *lists; 637 size_t *lists;
573 int i; 638 int i;
612 677
613 NEED_SUCCESS (EnqueueNDRangeKernel, (this, kernel, gws_len, gwo, gws, lws, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); 678 NEED_SUCCESS (EnqueueNDRangeKernel, (this, kernel, gws_len, gwo, gws, lws, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
614 679
615 if (ev) 680 if (ev)
616 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 681 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
617}
618 682
619void 683void
620enqueue_marker (OpenCL::Queue this) 684enqueue_marker (OpenCL::Queue this)
621 PPCODE: 685 PPCODE:
622{
623 cl_event ev; 686 cl_event ev;
624 NEED_SUCCESS (EnqueueMarker, (this, &ev)); 687 NEED_SUCCESS (EnqueueMarker, (this, &ev));
625 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 688 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
626}
627 689
628void 690void
629enqueue_wait_for_events (OpenCL::Queue this, ...) 691enqueue_wait_for_events (OpenCL::Queue this, ...)
630 CODE: 692 CODE:
631{
632 EVENT_LIST (1, items - 1); 693 EVENT_LIST (1, items - 1);
633 NEED_SUCCESS (EnqueueWaitForEvents, (this, event_list_count, event_list_ptr)); 694 NEED_SUCCESS (EnqueueWaitForEvents, (this, event_list_count, event_list_ptr));
634}
635 695
636void 696void
637enqueue_barrier (OpenCL::Queue this) 697enqueue_barrier (OpenCL::Queue this)
638 CODE: 698 CODE:
639 NEED_SUCCESS (EnqueueBarrier, (this)); 699 NEED_SUCCESS (EnqueueBarrier, (this));
658void 718void
659info (OpenCL::Memory this, cl_mem_info name) 719info (OpenCL::Memory this, cl_mem_info name)
660 PPCODE: 720 PPCODE:
661 INFO (MemObject) 721 INFO (MemObject)
662 722
723MODULE = OpenCL PACKAGE = OpenCL::Image
724
725void
726image_info (OpenCL::Image this, cl_image_info name)
727 PPCODE:
728 INFO (Image)
729
663MODULE = OpenCL PACKAGE = OpenCL::Sampler 730MODULE = OpenCL PACKAGE = OpenCL::Sampler
664 731
665void 732void
666DESTROY (OpenCL::Sampler this) 733DESTROY (OpenCL::Sampler this)
667 CODE: 734 CODE:
690 NEED_SUCCESS (BuildProgram, (this, 1, &device, SvPVbyte_nolen (options), 0, 0)); 757 NEED_SUCCESS (BuildProgram, (this, 1, &device, SvPVbyte_nolen (options), 0, 0));
691 758
692void 759void
693build_info (OpenCL::Program this, OpenCL::Device device, cl_program_build_info name) 760build_info (OpenCL::Program this, OpenCL::Device device, cl_program_build_info name)
694 PPCODE: 761 PPCODE:
695{
696 size_t size; 762 size_t size;
697 SV *sv;
698
699 NEED_SUCCESS (GetProgramBuildInfo, (this, device, name, 0, 0, &size)); 763 NEED_SUCCESS (GetProgramBuildInfo, (this, device, name, 0, 0, &size));
700 sv = sv_2mortal (newSV (size)); 764 SV *sv = sv_2mortal (newSV (size));
701 SvUPGRADE (sv, SVt_PV); 765 SvUPGRADE (sv, SVt_PV);
702 SvPOK_only (sv); 766 SvPOK_only (sv);
703 SvCUR_set (sv, size); 767 SvCUR_set (sv, size);
704 NEED_SUCCESS (GetProgramBuildInfo, (this, device, name, size, SvPVX (sv), 0)); 768 NEED_SUCCESS (GetProgramBuildInfo, (this, device, name, size, SvPVX (sv), 0));
705 XPUSHs (sv); 769 XPUSHs (sv);
706}
707 770
708void 771void
709kernel (OpenCL::Program program, SV *function) 772kernel (OpenCL::Program program, SV *function)
710 PPCODE: 773 PPCODE:
711 NEED_SUCCESS_ARG (cl_kernel kernel, CreateKernel, (program, SvPVbyte_nolen (function), &res)); 774 NEED_SUCCESS_ARG (cl_kernel kernel, CreateKernel, (program, SvPVbyte_nolen (function), &res));
722info (OpenCL::Kernel this, cl_kernel_info name) 785info (OpenCL::Kernel this, cl_kernel_info name)
723 PPCODE: 786 PPCODE:
724 INFO (Kernel) 787 INFO (Kernel)
725 788
726void 789void
790work_group_info (OpenCL::Kernel this, OpenCL::Device device, cl_kernel_work_group_info name)
791 PPCODE:
792 size_t size;
793 NEED_SUCCESS (GetKernelWorkGroupInfo, (this, device, name, 0, 0, &size));
794 SV *sv = sv_2mortal (newSV (size));
795 SvUPGRADE (sv, SVt_PV);
796 SvPOK_only (sv);
797 SvCUR_set (sv, size);
798 NEED_SUCCESS (GetKernelWorkGroupInfo, (this, device, name, size, SvPVX (sv), 0));
799 XPUSHs (sv);
800
801void
727set_char (OpenCL::Kernel this, cl_uint idx, cl_char value) 802set_char (OpenCL::Kernel this, cl_uint idx, cl_char value)
728 CODE: 803 CODE:
729 clSetKernelArg (this, idx, sizeof (value), &value); 804 clSetKernelArg (this, idx, sizeof (value), &value);
730 805
731void 806void
819info (OpenCL::Event this, cl_event_info name) 894info (OpenCL::Event this, cl_event_info name)
820 PPCODE: 895 PPCODE:
821 INFO (Event) 896 INFO (Event)
822 897
823void 898void
899profiling_info (OpenCL::Event this, cl_profiling_info name)
900 PPCODE:
901 INFO (EventProfiling)
902
903void
824wait (OpenCL::Event this) 904wait (OpenCL::Event this)
825 CODE: 905 CODE:
826 clWaitForEvents (1, &this); 906 clWaitForEvents (1, &this);
827 907
828MODULE = OpenCL PACKAGE = OpenCL::UserEvent 908MODULE = OpenCL PACKAGE = OpenCL::UserEvent

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines