… | |
… | |
270 | /* they can be upgraded at runtime to the array form */ |
270 | /* they can be upgraded at runtime to the array form */ |
271 | static void * |
271 | static void * |
272 | SvCLOBJ (const char *func, const char *svname, SV *sv, const char *pkg) |
272 | SvCLOBJ (const char *func, const char *svname, SV *sv, const char *pkg) |
273 | { |
273 | { |
274 | if (SvROK (sv) && sv_derived_from (sv, pkg)) |
274 | if (SvROK (sv) && sv_derived_from (sv, pkg)) |
275 | { |
|
|
276 | SV *rv = SvRV (sv); |
|
|
277 | |
|
|
278 | if (SvTYPE (rv) == SVt_PVAV) |
|
|
279 | rv = AvARRAY (rv)[0]; |
|
|
280 | |
|
|
281 | return (void *)SvIV (SvRV (sv)); |
275 | return (void *)SvIV (SvRV (sv)); |
282 | } |
|
|
283 | |
276 | |
284 | croak ("%s: %s is not of type %s", func, svname, pkg); |
277 | croak ("%s: %s is not of type %s", func, svname, pkg); |
285 | } |
|
|
286 | |
|
|
287 | static void |
|
|
288 | CLOBJ_push (SV *self, SV *data) |
|
|
289 | { |
|
|
290 | SV *rv = SvRV (self); |
|
|
291 | |
|
|
292 | if (SvTYPE (rv) != SVt_PVAV) |
|
|
293 | { |
|
|
294 | AV *av = newAV (); |
|
|
295 | av_push (av, rv); |
|
|
296 | rv = (SV *)av; |
|
|
297 | SvRV_set (self, rv); |
|
|
298 | } |
|
|
299 | |
|
|
300 | av_push ((AV *)rv, data); |
|
|
301 | } |
|
|
302 | |
|
|
303 | static SV * |
|
|
304 | sv_struct (STRLEN size) |
|
|
305 | { |
|
|
306 | SV *sv = newSV (size); |
|
|
307 | SvPOK_only (sv); |
|
|
308 | return sv; |
|
|
309 | } |
|
|
310 | |
|
|
311 | static void * |
|
|
312 | CLOBJ_push_struct (SV *self, STRLEN size) |
|
|
313 | { |
|
|
314 | SV *sv = sv_struct (size); |
|
|
315 | CLOBJ_push (self, sv); |
|
|
316 | return SvPVX (sv); |
|
|
317 | } |
278 | } |
318 | |
279 | |
319 | /*****************************************************************************/ |
280 | /*****************************************************************************/ |
320 | /* callback stuff */ |
281 | /* callback stuff */ |
321 | |
282 | |
… | |
… | |
347 | |
308 | |
348 | static void |
309 | static void |
349 | eq_enq (eq_vtbl *vtbl, SV *cb, void *data1, void *data2, void *data3) |
310 | eq_enq (eq_vtbl *vtbl, SV *cb, void *data1, void *data2, void *data3) |
350 | { |
311 | { |
351 | eq_item *item = malloc (sizeof (eq_item)); |
312 | eq_item *item = malloc (sizeof (eq_item)); |
352 | |
|
|
353 | printf ("enq(%p,%p,%p,%p,%p)\n", vtbl, cb, data1, data2, data3);//D |
|
|
354 | |
313 | |
355 | item->next = 0; |
314 | item->next = 0; |
356 | item->vtbl = vtbl; |
315 | item->vtbl = vtbl; |
357 | item->cb = cb; |
316 | item->cb = cb; |
358 | item->data1 = data1; |
317 | item->data1 = data1; |
… | |
… | |
383 | X_UNLOCK (eq_lock); |
342 | X_UNLOCK (eq_lock); |
384 | |
343 | |
385 | return res; |
344 | return res; |
386 | } |
345 | } |
387 | |
346 | |
388 | #if 0 |
|
|
389 | static void |
|
|
390 | mem_free (pTHX_ void *p) |
|
|
391 | { |
|
|
392 | free (p); |
|
|
393 | } |
|
|
394 | //SAVEDESTRUCTOR_X (mem_free, item); |
|
|
395 | #endif |
|
|
396 | |
|
|
397 | static void |
347 | static void |
398 | eq_poll (void) |
348 | eq_poll (void) |
399 | { |
349 | { |
400 | eq_item *item; |
350 | eq_item *item; |
401 | |
351 | |
… | |
… | |
428 | eq_poll_interrupt (pTHX_ void *c_arg, int value) |
378 | eq_poll_interrupt (pTHX_ void *c_arg, int value) |
429 | { |
379 | { |
430 | eq_poll (); |
380 | eq_poll (); |
431 | } |
381 | } |
432 | |
382 | |
|
|
383 | /*****************************************************************************/ |
433 | /* context notify */ |
384 | /* context notify */ |
434 | |
385 | |
435 | static void |
386 | static void |
436 | eq_context_push (void *data1, void *data2, void *data3) |
387 | eq_context_push (void *data1, void *data2, void *data3) |
437 | { |
388 | { |
438 | dSP; |
389 | dSP; |
439 | PUSHs (sv_2mortal (newSVpv (data1, 0))); |
390 | PUSHs (sv_2mortal (newSVpv (data1, 0))); |
440 | PUSHs (sv_2mortal (newSVpvn (data2, (STRLEN)data3))); |
391 | PUSHs (sv_2mortal (newSVpvn (data2, (STRLEN)data3))); |
441 | PUTBACK; |
392 | PUTBACK; |
|
|
393 | |
|
|
394 | free (data1); |
|
|
395 | free (data2); |
442 | } |
396 | } |
443 | |
397 | |
444 | static eq_vtbl eq_context_vtbl = { 0, eq_context_push }; |
398 | static eq_vtbl eq_context_vtbl = { 0, eq_context_push }; |
445 | |
399 | |
|
|
400 | static void CL_CALLBACK |
|
|
401 | eq_context_notify (const char *msg, const void *pvt, size_t cb, void *user_data) |
|
|
402 | { |
|
|
403 | void *pvt_copy = malloc (cb); |
|
|
404 | memcpy (pvt_copy, pvt, cb); |
|
|
405 | eq_enq (&eq_context_vtbl, user_data, strdup (msg), pvt_copy, (void *)cb); |
|
|
406 | } |
|
|
407 | |
|
|
408 | #define CONTEXT_NOTIFY_CALLBACK \ |
|
|
409 | void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *) = context_default_notify; \ |
|
|
410 | void *user_data = 0; \ |
|
|
411 | \ |
|
|
412 | if (SvOK (notify)) \ |
|
|
413 | { \ |
|
|
414 | pfn_notify = eq_context_notify; \ |
|
|
415 | user_data = s_get_cv (notify); \ |
|
|
416 | } |
|
|
417 | |
|
|
418 | static SV * |
|
|
419 | new_clobj_context (cl_context ctx, void *user_data) |
|
|
420 | { |
|
|
421 | SV *sv = NEW_CLOBJ ("OpenCL::Context", ctx); |
|
|
422 | |
|
|
423 | if (user_data) |
|
|
424 | sv_magicext (SvRV (sv), user_data, PERL_MAGIC_ext, 0, 0, 0); |
|
|
425 | |
|
|
426 | return sv; |
|
|
427 | } |
|
|
428 | |
|
|
429 | #define XPUSH_CLOBJ_CONTEXT XPUSHs (new_clobj_context (ctx, user_data)); |
|
|
430 | |
|
|
431 | /*****************************************************************************/ |
446 | /* build/compile/link notify */ |
432 | /* build/compile/link notify */ |
447 | |
433 | |
448 | static void |
434 | static void |
449 | eq_program_push (void *data1, void *data2, void *data3) |
435 | eq_program_push (void *data1, void *data2, void *data3) |
450 | { |
436 | { |
… | |
… | |
497 | |
483 | |
498 | xthread_t id; |
484 | xthread_t id; |
499 | thread_create (&id, build_program_thread, arg); |
485 | thread_create (&id, build_program_thread, arg); |
500 | } |
486 | } |
501 | |
487 | |
|
|
488 | /*****************************************************************************/ |
502 | /* event objects */ |
489 | /* event objects */ |
503 | |
490 | |
504 | static void |
491 | static void |
505 | eq_event_push (void *data1, void *data2, void *data3) |
492 | eq_event_push (void *data1, void *data2, void *data3) |
506 | { |
493 | { |
… | |
… | |
514 | |
501 | |
515 | static void CL_CALLBACK |
502 | static void CL_CALLBACK |
516 | eq_event_notify (cl_event event, cl_int event_command_exec_status, void *user_data) |
503 | eq_event_notify (cl_event event, cl_int event_command_exec_status, void *user_data) |
517 | { |
504 | { |
518 | clRetainEvent (event); |
505 | clRetainEvent (event); |
519 | eq_enq (&eq_event_vtbl, user_data, (void *)event, (void *)event_command_exec_status, 0); |
506 | eq_enq (&eq_event_vtbl, user_data, (void *)event, (void *)(IV)event_command_exec_status, 0); |
520 | } |
507 | } |
521 | |
508 | |
522 | /*****************************************************************************/ |
509 | /*****************************************************************************/ |
523 | |
510 | |
524 | static size_t |
511 | static size_t |
… | |
… | |
635 | EXTEND (SP, count); |
622 | EXTEND (SP, count); |
636 | for (i = 0; i < count; ++i) |
623 | for (i = 0; i < count; ++i) |
637 | PUSH_CLOBJ ("OpenCL::Platform", list [i]); |
624 | PUSH_CLOBJ ("OpenCL::Platform", list [i]); |
638 | |
625 | |
639 | void |
626 | void |
640 | context_from_type (cl_context_properties *properties = 0, cl_device_type type = CL_DEVICE_TYPE_DEFAULT, FUTURE notify = 0) |
627 | context_from_type (cl_context_properties *properties = 0, cl_device_type type = CL_DEVICE_TYPE_DEFAULT, SV *notify = &PL_sv_undef) |
641 | PPCODE: |
628 | PPCODE: |
|
|
629 | CONTEXT_NOTIFY_CALLBACK; |
642 | NEED_SUCCESS_ARG (cl_context ctx, CreateContextFromType, (properties, type, 0, 0, &res)); |
630 | NEED_SUCCESS_ARG (cl_context ctx, CreateContextFromType, (properties, type, 0, 0, &res)); |
643 | XPUSH_CLOBJ ("OpenCL::Context", ctx); |
631 | XPUSH_CLOBJ_CONTEXT; |
644 | |
632 | |
645 | #if 0 |
|
|
646 | |
|
|
647 | void |
633 | void |
648 | context (cl_context_properties *properties = 0, FUTURE devices, FUTURE notify = 0) |
634 | context (FUTURE properties, FUTURE devices, FUTURE notify) |
649 | PPCODE: |
635 | PPCODE: |
650 | /* der Gipfel der Kunst */ |
636 | /* der Gipfel der Kunst */ |
651 | |
|
|
652 | #endif |
|
|
653 | |
637 | |
654 | void |
638 | void |
655 | wait_for_events (...) |
639 | wait_for_events (...) |
656 | CODE: |
640 | CODE: |
657 | EVENT_LIST (0, items); |
641 | EVENT_LIST (0, items); |
… | |
… | |
708 | EXTEND (SP, count); |
692 | EXTEND (SP, count); |
709 | for (i = 0; i < count; ++i) |
693 | for (i = 0; i < count; ++i) |
710 | PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i])); |
694 | PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i])); |
711 | |
695 | |
712 | void |
696 | void |
713 | context (OpenCL::Platform self, cl_context_properties *properties, SV *devices, SV *notify = 0) |
697 | context (OpenCL::Platform self, cl_context_properties *properties, SV *devices, SV *notify = &PL_sv_undef) |
714 | PPCODE: |
698 | PPCODE: |
715 | if (!SvROK (devices) || SvTYPE (SvRV (devices)) != SVt_PVAV) |
699 | if (!SvROK (devices) || SvTYPE (SvRV (devices)) != SVt_PVAV) |
716 | croak ("OpenCL::Platform::context argument 'device' must be an arrayref with device objects, in call"); |
700 | croak ("OpenCL::Platform::context argument 'device' must be an arrayref with device objects, in call"); |
717 | |
701 | |
718 | AV *av = (AV *)SvRV (devices); |
702 | AV *av = (AV *)SvRV (devices); |
… | |
… | |
721 | |
705 | |
722 | int i; |
706 | int i; |
723 | for (i = num_devices; i--; ) |
707 | for (i = num_devices; i--; ) |
724 | device_list [i] = SvCLOBJ ("clCreateContext", "devices", *av_fetch (av, i, 0), "OpenCL::Device"); |
708 | device_list [i] = SvCLOBJ ("clCreateContext", "devices", *av_fetch (av, i, 0), "OpenCL::Device"); |
725 | |
709 | |
726 | void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *) = context_default_notify; |
710 | CONTEXT_NOTIFY_CALLBACK; |
727 | void *user_data = 0; |
|
|
728 | |
|
|
729 | NEED_SUCCESS_ARG (cl_context ctx, CreateContext, (properties, num_devices, device_list, pfn_notify, user_data, &res)); |
711 | NEED_SUCCESS_ARG (cl_context ctx, CreateContext, (properties, num_devices, device_list, pfn_notify, user_data, &res)); |
730 | XPUSH_CLOBJ ("OpenCL::Context", ctx); |
712 | XPUSH_CLOBJ_CONTEXT; |
731 | |
713 | |
732 | void |
714 | void |
733 | context_from_type (OpenCL::Platform self, SV *properties = 0, cl_device_type type = CL_DEVICE_TYPE_DEFAULT, FUTURE notify = 0) |
715 | context_from_type (OpenCL::Platform self, SV *properties = 0, cl_device_type type = CL_DEVICE_TYPE_DEFAULT, SV *notify = &PL_sv_undef) |
734 | PPCODE: |
716 | PPCODE: |
735 | cl_context_properties extra[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)self }; |
717 | cl_context_properties extra[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)self }; |
736 | cl_context_properties *props = SvCONTEXTPROPERTIES ("OpenCL::Platform::context_from_type", "properties", properties, extra, 2); |
718 | cl_context_properties *props = SvCONTEXTPROPERTIES ("OpenCL::Platform::context_from_type", "properties", properties, extra, 2); |
|
|
719 | |
|
|
720 | CONTEXT_NOTIFY_CALLBACK; |
737 | NEED_SUCCESS_ARG (cl_context ctx, CreateContextFromType, (props, type, 0, 0, &res)); |
721 | NEED_SUCCESS_ARG (cl_context ctx, CreateContextFromType, (props, type, 0, 0, &res)); |
738 | XPUSH_CLOBJ ("OpenCL::Context", ctx); |
722 | XPUSH_CLOBJ_CONTEXT; |
739 | |
723 | |
740 | MODULE = OpenCL PACKAGE = OpenCL::Device |
724 | MODULE = OpenCL PACKAGE = OpenCL::Device |
741 | |
725 | |
742 | void |
726 | void |
743 | info (OpenCL::Device self, cl_device_info name) |
727 | info (OpenCL::Device self, cl_device_info name) |
… | |
… | |
1012 | XPUSH_CLOBJ ("OpenCL::BufferObj", mem); |
996 | XPUSH_CLOBJ ("OpenCL::BufferObj", mem); |
1013 | |
997 | |
1014 | #if CL_VERSION_1_2 |
998 | #if CL_VERSION_1_2 |
1015 | |
999 | |
1016 | void |
1000 | void |
1017 | image (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) |
1001 | image (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 = 0, 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) |
1018 | PPCODE: |
1002 | PPCODE: |
1019 | STRLEN len; |
1003 | STRLEN len; |
1020 | char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; |
1004 | char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; |
1021 | const cl_image_format format = { channel_order, channel_type }; |
1005 | const cl_image_format format = { channel_order, channel_type }; |
1022 | const cl_image_desc desc = { |
1006 | const cl_image_desc desc = { |
… | |
… | |
1215 | DESTROY (OpenCL::Queue self) |
1199 | DESTROY (OpenCL::Queue self) |
1216 | CODE: |
1200 | CODE: |
1217 | clReleaseCommandQueue (self); |
1201 | clReleaseCommandQueue (self); |
1218 | |
1202 | |
1219 | void |
1203 | void |
1220 | enqueue_read_buffer (OpenCL::Queue self, OpenCL::Buffer mem, cl_bool blocking, size_t offset, size_t len, SV *data, ...) |
1204 | read_buffer (OpenCL::Queue self, OpenCL::Buffer mem, cl_bool blocking, size_t offset, size_t len, SV *data, ...) |
|
|
1205 | ALIAS: |
|
|
1206 | enqueue_read_buffer = 0 |
1221 | PPCODE: |
1207 | PPCODE: |
1222 | cl_event ev = 0; |
1208 | cl_event ev = 0; |
1223 | EVENT_LIST (6, items - 6); |
1209 | EVENT_LIST (6, items - 6); |
1224 | |
1210 | |
1225 | SvUPGRADE (data, SVt_PV); |
1211 | SvUPGRADE (data, SVt_PV); |
… | |
… | |
1230 | |
1216 | |
1231 | if (ev) |
1217 | if (ev) |
1232 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1218 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1233 | |
1219 | |
1234 | void |
1220 | void |
1235 | enqueue_write_buffer (OpenCL::Queue self, OpenCL::Buffer mem, cl_bool blocking, size_t offset, SV *data, ...) |
1221 | write_buffer (OpenCL::Queue self, OpenCL::Buffer mem, cl_bool blocking, size_t offset, SV *data, ...) |
|
|
1222 | ALIAS: |
|
|
1223 | enqueue_write_buffer = 0 |
1236 | PPCODE: |
1224 | PPCODE: |
1237 | cl_event ev = 0; |
1225 | cl_event ev = 0; |
1238 | STRLEN len; |
1226 | STRLEN len; |
1239 | char *ptr = SvPVbyte (data, len); |
1227 | char *ptr = SvPVbyte (data, len); |
1240 | EVENT_LIST (5, items - 5); |
1228 | EVENT_LIST (5, items - 5); |
… | |
… | |
1245 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1233 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1246 | |
1234 | |
1247 | #if CL_VERSION_1_2 |
1235 | #if CL_VERSION_1_2 |
1248 | |
1236 | |
1249 | void |
1237 | void |
1250 | enqueue_fill_buffer (OpenCL::Queue self, OpenCL::Buffer mem, SV *data, size_t offset, size_t size, ...) |
1238 | fill_buffer (OpenCL::Queue self, OpenCL::Buffer mem, SV *data, size_t offset, size_t size, ...) |
|
|
1239 | ALIAS: |
|
|
1240 | enqueue_fill_buffer = 0 |
1251 | PPCODE: |
1241 | PPCODE: |
1252 | cl_event ev = 0; |
1242 | cl_event ev = 0; |
1253 | STRLEN len; |
1243 | STRLEN len; |
1254 | char *ptr = SvPVbyte (data, len); |
1244 | char *ptr = SvPVbyte (data, len); |
1255 | EVENT_LIST (5, items - 5); |
1245 | EVENT_LIST (5, items - 5); |
… | |
… | |
1258 | |
1248 | |
1259 | if (ev) |
1249 | if (ev) |
1260 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1250 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1261 | |
1251 | |
1262 | void |
1252 | void |
1263 | enqueue_fill_image (OpenCL::Queue self, OpenCL::Image img, NV r, NV g, NV b, NV a, size_t x, size_t y, size_t z, size_t width, size_t height, size_t depth, ...) |
1253 | fill_image (OpenCL::Queue self, OpenCL::Image img, NV r, NV g, NV b, NV a, size_t x, size_t y, size_t z, size_t width, size_t height, size_t depth, ...) |
|
|
1254 | ALIAS: |
|
|
1255 | enqueue_fill_image = 0 |
1264 | PPCODE: |
1256 | PPCODE: |
1265 | cl_event ev = 0; |
1257 | cl_event ev = 0; |
1266 | STRLEN len; |
1258 | STRLEN len; |
1267 | const size_t origin [3] = { x, y, z }; |
1259 | const size_t origin [3] = { x, y, z }; |
1268 | const size_t region [3] = { width, height, depth }; |
1260 | const size_t region [3] = { width, height, depth }; |
… | |
… | |
1277 | NEED_SUCCESS (GetImageInfo, (img, CL_IMAGE_FORMAT, sizeof (format), &format, 0)); |
1269 | NEED_SUCCESS (GetImageInfo, (img, CL_IMAGE_FORMAT, sizeof (format), &format, 0)); |
1278 | assert (sizeof (fus) == CL_FLOAT + 1 - CL_SNORM_INT8); |
1270 | assert (sizeof (fus) == CL_FLOAT + 1 - CL_SNORM_INT8); |
1279 | if (format.image_channel_data_type < CL_SNORM_INT8 || CL_FLOAT < format.image_channel_data_type) |
1271 | if (format.image_channel_data_type < CL_SNORM_INT8 || CL_FLOAT < format.image_channel_data_type) |
1280 | croak ("enqueue_fill_image: image has unsupported channel type, only opencl 1.2 channel types supported."); |
1272 | croak ("enqueue_fill_image: image has unsupported channel type, only opencl 1.2 channel types supported."); |
1281 | |
1273 | |
1282 | NEED_SUCCESS (EnqueueFillImage, (self, img, c_fus [fus [format.image_channel_data_type]], |
1274 | NEED_SUCCESS (EnqueueFillImage, (self, img, c_fus [fus [format.image_channel_data_type - CL_SNORM_INT8]], |
1283 | origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); |
1275 | origin, region, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); |
1284 | |
1276 | |
1285 | if (ev) |
1277 | if (ev) |
1286 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1278 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1287 | |
1279 | |
1288 | #endif |
1280 | #endif |
1289 | |
1281 | |
1290 | void |
1282 | void |
1291 | enqueue_copy_buffer (OpenCL::Queue self, OpenCL::Buffer src, OpenCL::Buffer dst, size_t src_offset, size_t dst_offset, size_t len, ...) |
1283 | copy_buffer (OpenCL::Queue self, OpenCL::Buffer src, OpenCL::Buffer dst, size_t src_offset, size_t dst_offset, size_t len, ...) |
|
|
1284 | ALIAS: |
|
|
1285 | enqueue_copy_buffer = 0 |
1292 | PPCODE: |
1286 | PPCODE: |
1293 | cl_event ev = 0; |
1287 | cl_event ev = 0; |
1294 | EVENT_LIST (6, items - 6); |
1288 | EVENT_LIST (6, items - 6); |
1295 | |
1289 | |
1296 | NEED_SUCCESS (EnqueueCopyBuffer, (self, src, dst, src_offset, dst_offset, len, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); |
1290 | NEED_SUCCESS (EnqueueCopyBuffer, (self, src, dst, src_offset, dst_offset, len, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); |
1297 | |
1291 | |
1298 | if (ev) |
1292 | if (ev) |
1299 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1293 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1300 | |
1294 | |
1301 | void |
1295 | void |
1302 | enqueue_read_buffer_rect (OpenCL::Queue self, 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, ...) |
1296 | read_buffer_rect (OpenCL::Queue self, 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, ...) |
|
|
1297 | ALIAS: |
|
|
1298 | enqueue_read_buffer_rect = 0 |
1303 | PPCODE: |
1299 | PPCODE: |
1304 | cl_event ev = 0; |
1300 | cl_event ev = 0; |
1305 | const size_t buf_origin [3] = { buf_x , buf_y , buf_z }; |
1301 | const size_t buf_origin [3] = { buf_x , buf_y , buf_z }; |
1306 | const size_t host_origin[3] = { host_x, host_y, host_z }; |
1302 | const size_t host_origin[3] = { host_x, host_y, host_z }; |
1307 | const size_t region[3] = { width, height, depth }; |
1303 | const size_t region[3] = { width, height, depth }; |
… | |
… | |
1329 | |
1325 | |
1330 | if (ev) |
1326 | if (ev) |
1331 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1327 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1332 | |
1328 | |
1333 | void |
1329 | void |
1334 | enqueue_write_buffer_rect (OpenCL::Queue self, 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, ...) |
1330 | write_buffer_rect (OpenCL::Queue self, 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, ...) |
|
|
1331 | ALIAS: |
|
|
1332 | enqueue_write_buffer_rect = 0 |
1335 | PPCODE: |
1333 | PPCODE: |
1336 | cl_event ev = 0; |
1334 | cl_event ev = 0; |
1337 | const size_t buf_origin [3] = { buf_x , buf_y , buf_z }; |
1335 | const size_t buf_origin [3] = { buf_x , buf_y , buf_z }; |
1338 | const size_t host_origin[3] = { host_x, host_y, host_z }; |
1336 | const size_t host_origin[3] = { host_x, host_y, host_z }; |
1339 | const size_t region[3] = { width, height, depth }; |
1337 | const size_t region[3] = { width, height, depth }; |
… | |
… | |
1362 | |
1360 | |
1363 | if (ev) |
1361 | if (ev) |
1364 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1362 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1365 | |
1363 | |
1366 | void |
1364 | void |
1367 | enqueue_copy_buffer_rect (OpenCL::Queue self, 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, ...) |
1365 | copy_buffer_rect (OpenCL::Queue self, 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, ...) |
|
|
1366 | ALIAS: |
|
|
1367 | enqueue_copy_buffer_rect = 0 |
1368 | PPCODE: |
1368 | PPCODE: |
1369 | cl_event ev = 0; |
1369 | cl_event ev = 0; |
1370 | const size_t src_origin[3] = { src_x, src_y, src_z }; |
1370 | const size_t src_origin[3] = { src_x, src_y, src_z }; |
1371 | const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; |
1371 | const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; |
1372 | const size_t region[3] = { width, height, depth }; |
1372 | const size_t region[3] = { width, height, depth }; |
… | |
… | |
1376 | |
1376 | |
1377 | if (ev) |
1377 | if (ev) |
1378 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1378 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1379 | |
1379 | |
1380 | void |
1380 | void |
1381 | enqueue_read_image (OpenCL::Queue self, 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, ...) |
1381 | read_image (OpenCL::Queue self, 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, ...) |
|
|
1382 | ALIAS: |
|
|
1383 | enqueue_read_image = 0 |
1382 | PPCODE: |
1384 | PPCODE: |
1383 | cl_event ev = 0; |
1385 | cl_event ev = 0; |
1384 | const size_t src_origin[3] = { src_x, src_y, src_z }; |
1386 | const size_t src_origin[3] = { src_x, src_y, src_z }; |
1385 | const size_t region[3] = { width, height, depth }; |
1387 | const size_t region[3] = { width, height, depth }; |
1386 | EVENT_LIST (12, items - 12); |
1388 | EVENT_LIST (12, items - 12); |
… | |
… | |
1401 | |
1403 | |
1402 | if (ev) |
1404 | if (ev) |
1403 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1405 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1404 | |
1406 | |
1405 | void |
1407 | void |
1406 | enqueue_write_image (OpenCL::Queue self, 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, ...) |
1408 | write_image (OpenCL::Queue self, 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, ...) |
|
|
1409 | ALIAS: |
|
|
1410 | enqueue_write_image = 0 |
1407 | PPCODE: |
1411 | PPCODE: |
1408 | cl_event ev = 0; |
1412 | cl_event ev = 0; |
1409 | const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; |
1413 | const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; |
1410 | const size_t region[3] = { width, height, depth }; |
1414 | const size_t region[3] = { width, height, depth }; |
1411 | STRLEN len; |
1415 | STRLEN len; |
… | |
… | |
1427 | |
1431 | |
1428 | if (ev) |
1432 | if (ev) |
1429 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1433 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1430 | |
1434 | |
1431 | void |
1435 | void |
1432 | enqueue_copy_image (OpenCL::Queue self, 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, ...) |
1436 | copy_image (OpenCL::Queue self, 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, ...) |
|
|
1437 | ALIAS: |
|
|
1438 | enqueue_copy_image = 0 |
1433 | PPCODE: |
1439 | PPCODE: |
1434 | cl_event ev = 0; |
1440 | cl_event ev = 0; |
1435 | const size_t src_origin[3] = { src_x, src_y, src_z }; |
1441 | const size_t src_origin[3] = { src_x, src_y, src_z }; |
1436 | const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; |
1442 | const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; |
1437 | const size_t region[3] = { width, height, depth }; |
1443 | const size_t region[3] = { width, height, depth }; |
… | |
… | |
1441 | |
1447 | |
1442 | if (ev) |
1448 | if (ev) |
1443 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1449 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1444 | |
1450 | |
1445 | void |
1451 | void |
1446 | enqueue_copy_image_to_buffer (OpenCL::Queue self, 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, ...) |
1452 | copy_image_to_buffer (OpenCL::Queue self, 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, ...) |
|
|
1453 | ALIAS: |
|
|
1454 | enqueue_copy_image_to_buffer = 0 |
1447 | PPCODE: |
1455 | PPCODE: |
1448 | cl_event ev = 0; |
1456 | cl_event ev = 0; |
1449 | const size_t src_origin[3] = { src_x, src_y, src_z }; |
1457 | const size_t src_origin[3] = { src_x, src_y, src_z }; |
1450 | const size_t region[3] = { width, height, depth }; |
1458 | const size_t region[3] = { width, height, depth }; |
1451 | EVENT_LIST (10, items - 10); |
1459 | EVENT_LIST (10, items - 10); |
… | |
… | |
1454 | |
1462 | |
1455 | if (ev) |
1463 | if (ev) |
1456 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1464 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1457 | |
1465 | |
1458 | void |
1466 | void |
1459 | enqueue_copy_buffer_to_image (OpenCL::Queue self, 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, ...) |
1467 | copy_buffer_to_image (OpenCL::Queue self, 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, ...) |
|
|
1468 | ALIAS: |
|
|
1469 | enqueue_copy_buffer_to_image = 0 |
1460 | PPCODE: |
1470 | PPCODE: |
1461 | cl_event ev = 0; |
1471 | cl_event ev = 0; |
1462 | const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; |
1472 | const size_t dst_origin[3] = { dst_x, dst_y, dst_z }; |
1463 | const size_t region[3] = { width, height, depth }; |
1473 | const size_t region[3] = { width, height, depth }; |
1464 | EVENT_LIST (10, items - 10); |
1474 | EVENT_LIST (10, items - 10); |
… | |
… | |
1467 | |
1477 | |
1468 | if (ev) |
1478 | if (ev) |
1469 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1479 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1470 | |
1480 | |
1471 | void |
1481 | void |
1472 | enqueue_task (OpenCL::Queue self, OpenCL::Kernel kernel, ...) |
1482 | task (OpenCL::Queue self, OpenCL::Kernel kernel, ...) |
|
|
1483 | ALIAS: |
|
|
1484 | enqueue_task = 0 |
1473 | PPCODE: |
1485 | PPCODE: |
1474 | cl_event ev = 0; |
1486 | cl_event ev = 0; |
1475 | EVENT_LIST (2, items - 2); |
1487 | EVENT_LIST (2, items - 2); |
1476 | |
1488 | |
1477 | NEED_SUCCESS (EnqueueTask, (self, kernel, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); |
1489 | NEED_SUCCESS (EnqueueTask, (self, kernel, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0)); |
1478 | |
1490 | |
1479 | if (ev) |
1491 | if (ev) |
1480 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1492 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1481 | |
1493 | |
1482 | void |
1494 | void |
1483 | enqueue_nd_range_kernel (OpenCL::Queue self, OpenCL::Kernel kernel, SV *global_work_offset, SV *global_work_size, SV *local_work_size = &PL_sv_undef, ...) |
1495 | nd_range_kernel (OpenCL::Queue self, OpenCL::Kernel kernel, SV *global_work_offset, SV *global_work_size, SV *local_work_size = &PL_sv_undef, ...) |
|
|
1496 | ALIAS: |
|
|
1497 | enqueue_nd_range_kernel = 0 |
1484 | PPCODE: |
1498 | PPCODE: |
1485 | cl_event ev = 0; |
1499 | cl_event ev = 0; |
1486 | size_t *gwo = 0, *gws, *lws = 0; |
1500 | size_t *gwo = 0, *gws, *lws = 0; |
1487 | int gws_len; |
1501 | int gws_len; |
1488 | size_t *lists; |
1502 | size_t *lists; |
… | |
… | |
1532 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1546 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1533 | |
1547 | |
1534 | #if cl_apple_gl_sharing || cl_khr_gl_sharing |
1548 | #if cl_apple_gl_sharing || cl_khr_gl_sharing |
1535 | |
1549 | |
1536 | void |
1550 | void |
1537 | enqueue_acquire_gl_objects (OpenCL::Queue self, SV *objects, ...) |
1551 | acquire_gl_objects (OpenCL::Queue self, SV *objects, ...) |
|
|
1552 | ALIAS: |
|
|
1553 | enqueue_acquire_gl_objects = 0 |
1538 | ALIAS: |
1554 | ALIAS: |
1539 | enqueue_release_gl_objects = 1 |
1555 | enqueue_release_gl_objects = 1 |
1540 | PPCODE: |
1556 | PPCODE: |
1541 | if (!SvROK (objects) || SvTYPE (SvRV (objects)) != SVt_PVAV) |
1557 | if (!SvROK (objects) || SvTYPE (SvRV (objects)) != SVt_PVAV) |
1542 | croak ("OpenCL::Queue::enqueue_acquire/release_gl_objects argument 'objects' must be an arrayref with memory objects, in call"); |
1558 | croak ("OpenCL::Queue::enqueue_acquire/release_gl_objects argument 'objects' must be an arrayref with memory objects, in call"); |
… | |
… | |
1560 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1576 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1561 | |
1577 | |
1562 | #endif |
1578 | #endif |
1563 | |
1579 | |
1564 | void |
1580 | void |
1565 | enqueue_wait_for_events (OpenCL::Queue self, ...) |
1581 | wait_for_events (OpenCL::Queue self, ...) |
|
|
1582 | ALIAS: |
|
|
1583 | enqueue_wait_for_events = 0 |
1566 | CODE: |
1584 | CODE: |
1567 | EVENT_LIST (1, items - 1); |
1585 | EVENT_LIST (1, items - 1); |
1568 | #if PREFER_1_1 |
1586 | #if PREFER_1_1 |
1569 | NEED_SUCCESS (EnqueueWaitForEvents, (self, event_list_count, event_list_ptr)); |
1587 | NEED_SUCCESS (EnqueueWaitForEvents, (self, event_list_count, event_list_ptr)); |
1570 | #else |
1588 | #else |
1571 | NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, 0)); |
1589 | NEED_SUCCESS (EnqueueBarrierWithWaitList, (self, event_list_count, event_list_ptr, 0)); |
1572 | #endif |
1590 | #endif |
1573 | |
1591 | |
1574 | void |
1592 | void |
1575 | enqueue_marker (OpenCL::Queue self, ...) |
1593 | marker (OpenCL::Queue self, ...) |
|
|
1594 | ALIAS: |
|
|
1595 | enqueue_marker = 0 |
1576 | PPCODE: |
1596 | PPCODE: |
1577 | cl_event ev = 0; |
1597 | cl_event ev = 0; |
1578 | EVENT_LIST (1, items - 1); |
1598 | EVENT_LIST (1, items - 1); |
1579 | #if PREFER_1_1 |
1599 | #if PREFER_1_1 |
1580 | if (!event_list_count) |
1600 | if (!event_list_count) |
… | |
… | |
1593 | #endif |
1613 | #endif |
1594 | if (ev) |
1614 | if (ev) |
1595 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1615 | XPUSH_CLOBJ ("OpenCL::Event", ev); |
1596 | |
1616 | |
1597 | void |
1617 | void |
1598 | enqueue_barrier (OpenCL::Queue self, ...) |
1618 | barrier (OpenCL::Queue self, ...) |
|
|
1619 | ALIAS: |
|
|
1620 | enqueue_barrier = 0 |
1599 | PPCODE: |
1621 | PPCODE: |
1600 | cl_event ev = 0; |
1622 | cl_event ev = 0; |
1601 | EVENT_LIST (1, items - 1); |
1623 | EVENT_LIST (1, items - 1); |
1602 | #if PREFER_1_1 |
1624 | #if PREFER_1_1 |
1603 | if (!event_list_count && GIMME_V == G_VOID) |
1625 | if (!event_list_count && GIMME_V == G_VOID) |
… | |
… | |
2197 | set_buffer (OpenCL::Kernel self, cl_uint idx, OpenCL::Buffer_ornull value) |
2219 | set_buffer (OpenCL::Kernel self, cl_uint idx, OpenCL::Buffer_ornull value) |
2198 | CODE: |
2220 | CODE: |
2199 | clSetKernelArg (self, idx, sizeof (value), &value); |
2221 | clSetKernelArg (self, idx, sizeof (value), &value); |
2200 | |
2222 | |
2201 | void |
2223 | void |
2202 | set_image2d (OpenCL::Kernel self, cl_uint idx, OpenCL::Image2D_ornull value) |
2224 | set_image (OpenCL::Kernel self, cl_uint idx, OpenCL::Image_ornull value) |
2203 | CODE: |
2225 | ALIAS: |
2204 | clSetKernelArg (self, idx, sizeof (value), &value); |
2226 | set_image2d = 0 |
2205 | |
2227 | set_image3d = 0 |
2206 | void |
|
|
2207 | set_image3d (OpenCL::Kernel self, cl_uint idx, OpenCL::Image3D_ornull value) |
|
|
2208 | CODE: |
2228 | CODE: |
2209 | clSetKernelArg (self, idx, sizeof (value), &value); |
2229 | clSetKernelArg (self, idx, sizeof (value), &value); |
2210 | |
2230 | |
2211 | void |
2231 | void |
2212 | set_sampler (OpenCL::Kernel self, cl_uint idx, OpenCL::Sampler value) |
2232 | set_sampler (OpenCL::Kernel self, cl_uint idx, OpenCL::Sampler value) |