--- OpenCL/OpenCL.xs 2012/05/05 14:18:35 1.75 +++ OpenCL/OpenCL.xs 2012/05/05 17:09:19 1.81 @@ -1,3 +1,5 @@ +#include + #include "EXTERN.h" #include "perl.h" #include "XSUB.h" @@ -37,9 +39,11 @@ #include CLHDR(opencl.h) +#if 0 #ifndef CL_VERSION_1_2 #include CLHDR(cl_d3d9.h) #endif +#endif #if _WIN32 #include CLHDR(cl_d3d10.h) @@ -194,6 +198,13 @@ #define const_iv(name) { (IV)CL_ ## name, # name }, } ivstr; +typedef struct +{ + NV nv; + const char *name; + #define const_nv(name) { (NV)CL_ ## name, # name }, +} nvstr; + static const char * iv2str (IV value, const ivstr *base, int count, const char *fallback) { @@ -613,6 +624,22 @@ } /*****************************************************************************/ +/* mem object destructor notify */ + +static void ecb_noinline +eq_destructor_push (void *data1, void *data2, void *data3) +{ +} + +static eq_vtbl eq_destructor_vtbl = { 0, eq_destructor_push }; + +static void CL_CALLBACK +eq_destructor_notify (cl_mem memobj, void *user_data) +{ + eq_enq (&eq_destructor_vtbl, (SV *)user_data, (void *)memobj, 0, 0); +} + +/*****************************************************************************/ /* event objects */ static void @@ -705,10 +732,18 @@ cl_event event; size_t row_pitch; size_t slice_pitch; + + size_t element_size; + size_t width, height, depth; }; static SV * -mapped_new (HV *stash, cl_command_queue queue, cl_mem memobj, cl_map_flags flags, void *ptr, size_t cb, cl_event ev, size_t row_pitch, size_t slice_pitch) +mapped_new ( + HV *stash, cl_command_queue queue, cl_mem memobj, cl_map_flags flags, + void *ptr, size_t cb, cl_event ev, + size_t row_pitch, size_t slice_pitch, size_t element_size, + size_t width, size_t height, size_t depth +) { SV *data = newSV (0); SvUPGRADE (data, SVt_PVMG); @@ -718,13 +753,18 @@ clRetainCommandQueue (queue); - mapped->queue = queue; - mapped->memobj = memobj; - mapped->ptr = ptr; - mapped->cb = cb; - mapped->event = ev; - mapped->row_pitch = row_pitch; - mapped->slice_pitch = slice_pitch; + mapped->queue = queue; + mapped->memobj = memobj; + mapped->ptr = ptr; + mapped->cb = cb; + mapped->event = ev; + mapped->row_pitch = row_pitch; + mapped->slice_pitch = slice_pitch; + + mapped->element_size = element_size; + mapped->width = width; + mapped->height = height; + mapped->depth = depth; sv_magicext (data, 0, PERL_MAGIC_ext, 0, (char *)mapped, 0); @@ -777,6 +817,15 @@ mapped_detach (self, mapped); } +static size_t +mapped_element_size (OpenCL__Mapped self) +{ + if (!self->element_size) + clGetImageInfo (self->memobj, CL_IMAGE_ELEMENT_SIZE, sizeof (self->element_size), &self->element_size, 0); + + return self->element_size; +} + /*****************************************************************************/ MODULE = OpenCL PACKAGE = OpenCL @@ -797,6 +846,7 @@ BOOT: { HV *stash = gv_stashpv ("OpenCL", 1); + static const ivstr *civ, const_iv[] = { { sizeof (cl_char ), "SIZEOF_CHAR" }, { sizeof (cl_uchar ), "SIZEOF_UCHAR" }, @@ -816,6 +866,15 @@ for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--) newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv)); + static const nvstr *cnv, const_nv[] = { +#include "constnv.h" + }; + + for (cnv = const_nv + sizeof (const_nv) / sizeof (const_nv [0]); cnv > const_nv; cnv--) + newCONSTSUB (stash, (char *)cnv[-1].name, newSVnv (cnv[-1].nv)); + + newCONSTSUB (stash, "NAN", newSVnv (CL_NAN)); // CL_NAN might be a function call + stash_platform = gv_stashpv ("OpenCL::Platform", GV_ADD); stash_device = gv_stashpv ("OpenCL::Device", GV_ADD); stash_subdevice = gv_stashpv ("OpenCL::SubDevice", GV_ADD); @@ -1010,9 +1069,22 @@ void type (OpenCL::Device self) + ALIAS: + type = CL_DEVICE_TYPE + address_bits = CL_DEVICE_ADDRESS_BITS + max_mem_alloc_size = CL_DEVICE_MAX_MEM_ALLOC_SIZE + single_fp_config = CL_DEVICE_SINGLE_FP_CONFIG + global_mem_cache_size = CL_DEVICE_GLOBAL_MEM_CACHE_SIZE + global_mem_size = CL_DEVICE_GLOBAL_MEM_SIZE + max_constant_buffer_size = CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE + local_mem_size = CL_DEVICE_LOCAL_MEM_SIZE + execution_capabilities = CL_DEVICE_EXECUTION_CAPABILITIES + properties = CL_DEVICE_QUEUE_PROPERTIES + double_fp_config = CL_DEVICE_DOUBLE_FP_CONFIG + half_fp_config = CL_DEVICE_HALF_FP_CONFIG PPCODE: - cl_device_type value [1]; - NEED_SUCCESS (GetDeviceInfo, (self, CL_DEVICE_TYPE, sizeof (value), value, 0)); + cl_ulong value [1]; + NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -1036,8 +1108,10 @@ max_samplers = CL_DEVICE_MAX_SAMPLERS mem_base_addr_align = CL_DEVICE_MEM_BASE_ADDR_ALIGN min_data_type_align_size = CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE + global_mem_cache_type = CL_DEVICE_GLOBAL_MEM_CACHE_TYPE global_mem_cacheline_size = CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE max_constant_args = CL_DEVICE_MAX_CONSTANT_ARGS + local_mem_type = CL_DEVICE_LOCAL_MEM_TYPE preferred_vector_width_half = CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF native_vector_width_char = CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR native_vector_width_short = CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT @@ -1085,61 +1159,6 @@ PUSHs (sv_2mortal (newSVuv (value [i]))); void -address_bits (OpenCL::Device self) - PPCODE: - cl_bitfield value [1]; - NEED_SUCCESS (GetDeviceInfo, (self, CL_DEVICE_ADDRESS_BITS, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void -max_mem_alloc_size (OpenCL::Device self) - ALIAS: - max_mem_alloc_size = CL_DEVICE_MAX_MEM_ALLOC_SIZE - global_mem_cache_size = CL_DEVICE_GLOBAL_MEM_CACHE_SIZE - global_mem_size = CL_DEVICE_GLOBAL_MEM_SIZE - max_constant_buffer_size = CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE - local_mem_size = CL_DEVICE_LOCAL_MEM_SIZE - PPCODE: - cl_ulong value [1]; - NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void -single_fp_config (OpenCL::Device self) - ALIAS: - single_fp_config = CL_DEVICE_SINGLE_FP_CONFIG - double_fp_config = CL_DEVICE_DOUBLE_FP_CONFIG - half_fp_config = CL_DEVICE_HALF_FP_CONFIG - PPCODE: - cl_device_fp_config value [1]; - NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void -global_mem_cache_type (OpenCL::Device self) - PPCODE: - cl_device_mem_cache_type value [1]; - NEED_SUCCESS (GetDeviceInfo, (self, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void -local_mem_type (OpenCL::Device self) - PPCODE: - cl_device_local_mem_type value [1]; - NEED_SUCCESS (GetDeviceInfo, (self, CL_DEVICE_LOCAL_MEM_TYPE, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void error_correction_support (OpenCL::Device self) ALIAS: error_correction_support = CL_DEVICE_ERROR_CORRECTION_SUPPORT @@ -1148,40 +1167,20 @@ compiler_available = CL_DEVICE_COMPILER_AVAILABLE host_unified_memory = CL_DEVICE_HOST_UNIFIED_MEMORY PPCODE: - cl_bool value [1]; + cl_uint value [1]; NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; PUSHs (sv_2mortal (value [i] ? &PL_sv_yes : &PL_sv_no)); void -execution_capabilities (OpenCL::Device self) - PPCODE: - cl_device_exec_capabilities value [1]; - NEED_SUCCESS (GetDeviceInfo, (self, CL_DEVICE_EXECUTION_CAPABILITIES, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void -properties (OpenCL::Device self) - PPCODE: - cl_command_queue_properties value [1]; - NEED_SUCCESS (GetDeviceInfo, (self, CL_DEVICE_QUEUE_PROPERTIES, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void platform (OpenCL::Device self) PPCODE: cl_platform_id value [1]; NEED_SUCCESS (GetDeviceInfo, (self, CL_DEVICE_PLATFORM, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - PUSH_CLOBJ (stash_platform, value [i]); - } + PUSH_CLOBJ (stash_platform, value [i]); void name (OpenCL::Device self) @@ -1208,9 +1207,7 @@ NEED_SUCCESS (GetDeviceInfo, (self, CL_DEVICE_PARENT_DEVICE_EXT, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - PUSH_CLOBJ (stash_device, value [i]); - } + PUSH_CLOBJ (stash_device, value [i]); void partition_types_ext (OpenCL::Device self) @@ -1540,9 +1537,7 @@ int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) - { - PUSH_CLOBJ (stash_device, value [i]); - } + PUSH_CLOBJ (stash_device, value [i]); void properties (OpenCL::Context self) @@ -1873,7 +1868,7 @@ cl_event ev; NEED_SUCCESS_ARG (void *ptr, EnqueueMapBuffer, (self, buf, blocking, map_flags, offset, cb, event_list_count, event_list_ptr, &ev, &res)); - XPUSHs (mapped_new (stash_mappedbuffer, self, buf, map_flags, ptr, cb, ev, 0, 0)); + XPUSHs (mapped_new (stash_mappedbuffer, self, buf, map_flags, ptr, cb, ev, 0, 0, 1, cb, 1, 1)); void map_image (OpenCL::Queue self, OpenCL::Image img, cl_bool blocking = 1, cl_map_flags map_flags = CL_MAP_READ | CL_MAP_WRITE, size_t x = 0, size_t y = 0, size_t z = 0, SV *width_ = &PL_sv_undef, SV *height_ = &PL_sv_undef, SV *depth_ = &PL_sv_undef, ...) @@ -1892,6 +1887,10 @@ { NEED_SUCCESS (GetImageInfo, (img, CL_IMAGE_HEIGHT, sizeof (height), &height, 0)); height -= y; + + // stupid opencl returns 0 for depth, but requires 1 for 2d images + if (!height) + height = 1; } size_t depth = SvIV (width_); @@ -1917,7 +1916,7 @@ : row_pitch ? row_pitch * region [1] : region [0]; - XPUSHs (mapped_new (stash_mappedimage, self, img, map_flags, ptr, cb, ev, row_pitch, slice_pitch)); + XPUSHs (mapped_new (stash_mappedimage, self, img, map_flags, ptr, cb, ev, row_pitch, slice_pitch, 0, width, height, depth)); void unmap (OpenCL::Queue self, OpenCL::Mapped mapped, ...) @@ -2142,10 +2141,8 @@ NEED_SUCCESS (GetCommandQueueInfo, (self, CL_QUEUE_CONTEXT, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainContext, (value [i])); - PUSH_CLOBJ (stash_context, value [i]); - } + NEED_SUCCESS (RetainContext, (value [i])); + PUSH_CLOBJ (stash_context, value [i]); void device (OpenCL::Queue self) @@ -2154,9 +2151,7 @@ NEED_SUCCESS (GetCommandQueueInfo, (self, CL_QUEUE_DEVICE, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - PUSH_CLOBJ (stash_device, value [i]); - } + PUSH_CLOBJ (stash_device, value [i]); void reference_count (OpenCL::Queue self) @@ -2170,7 +2165,7 @@ void properties (OpenCL::Queue self) PPCODE: - cl_command_queue_properties value [1]; + cl_ulong value [1]; NEED_SUCCESS (GetCommandQueueInfo, (self, CL_QUEUE_PROPERTIES, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; @@ -2190,13 +2185,22 @@ PPCODE: INFO (MemObject) +void +destructor_callback (OpenCL::Memory self, SV *notify) + PPCODE: + clSetMemObjectDestructorCallback (self, eq_destructor_notify, SvREFCNT_inc (s_get_cv (notify))); + #BEGIN:mem void type (OpenCL::Memory self) + ALIAS: + type = CL_MEM_TYPE + map_count = CL_MEM_MAP_COUNT + reference_count = CL_MEM_REFERENCE_COUNT PPCODE: - cl_mem_object_type value [1]; - NEED_SUCCESS (GetMemObjectInfo, (self, CL_MEM_TYPE, sizeof (value), value, 0)); + cl_uint value [1]; + NEED_SUCCESS (GetMemObjectInfo, (self, ix, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -2204,7 +2208,7 @@ void flags (OpenCL::Memory self) PPCODE: - cl_mem_flags value [1]; + cl_ulong value [1]; NEED_SUCCESS (GetMemObjectInfo, (self, CL_MEM_FLAGS, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; @@ -2232,28 +2236,14 @@ PUSHs (sv_2mortal (newSVuv ((IV)(intptr_t)value [i]))); void -map_count (OpenCL::Memory self) - ALIAS: - map_count = CL_MEM_MAP_COUNT - reference_count = CL_MEM_REFERENCE_COUNT - PPCODE: - cl_uint value [1]; - NEED_SUCCESS (GetMemObjectInfo, (self, ix, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void context (OpenCL::Memory self) PPCODE: cl_context value [1]; NEED_SUCCESS (GetMemObjectInfo, (self, CL_MEM_CONTEXT, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainContext, (value [i])); - PUSH_CLOBJ (stash_context, value [i]); - } + NEED_SUCCESS (RetainContext, (value [i])); + PUSH_CLOBJ (stash_context, value [i]); void associated_memobject (OpenCL::Memory self) @@ -2262,10 +2252,8 @@ NEED_SUCCESS (GetMemObjectInfo, (self, CL_MEM_ASSOCIATED_MEMOBJECT, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainMemObject, (value [i])); - PUSH_CLOBJ (stash_memory, value [i]); - } + NEED_SUCCESS (RetainMemObject, (value [i])); + PUSH_CLOBJ (stash_memory, value [i]); #END:mem @@ -2374,9 +2362,13 @@ void reference_count (OpenCL::Sampler self) + ALIAS: + reference_count = CL_SAMPLER_REFERENCE_COUNT + normalized_coords = CL_SAMPLER_NORMALIZED_COORDS + addressing_mode = CL_SAMPLER_ADDRESSING_MODE PPCODE: cl_uint value [1]; - NEED_SUCCESS (GetSamplerInfo, (self, CL_SAMPLER_REFERENCE_COUNT, sizeof (value), value, 0)); + NEED_SUCCESS (GetSamplerInfo, (self, ix, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -2388,33 +2380,13 @@ NEED_SUCCESS (GetSamplerInfo, (self, CL_SAMPLER_CONTEXT, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainContext, (value [i])); - PUSH_CLOBJ (stash_context, value [i]); - } - -void -normalized_coords (OpenCL::Sampler self) - PPCODE: - cl_addressing_mode value [1]; - NEED_SUCCESS (GetSamplerInfo, (self, CL_SAMPLER_NORMALIZED_COORDS, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void -addressing_mode (OpenCL::Sampler self) - PPCODE: - cl_filter_mode value [1]; - NEED_SUCCESS (GetSamplerInfo, (self, CL_SAMPLER_ADDRESSING_MODE, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); + NEED_SUCCESS (RetainContext, (value [i])); + PUSH_CLOBJ (stash_context, value [i]); void filter_mode (OpenCL::Sampler self) PPCODE: - cl_bool value [1]; + cl_uint value [1]; NEED_SUCCESS (GetSamplerInfo, (self, CL_SAMPLER_FILTER_MODE, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; @@ -2509,7 +2481,7 @@ void build_status (OpenCL::Program self, OpenCL::Device device) PPCODE: - cl_build_status value [1]; + cl_int value [1]; NEED_SUCCESS (GetProgramBuildInfo, (self, device, CL_PROGRAM_BUILD_STATUS, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; @@ -2532,7 +2504,7 @@ void binary_type (OpenCL::Program self, OpenCL::Device device) PPCODE: - cl_program_binary_type value [1]; + cl_uint value [1]; NEED_SUCCESS (GetProgramBuildInfo, (self, device, CL_PROGRAM_BINARY_TYPE, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; @@ -2613,10 +2585,8 @@ NEED_SUCCESS (GetProgramInfo, (self, CL_PROGRAM_CONTEXT, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainContext, (value [i])); - PUSH_CLOBJ (stash_context, value [i]); - } + NEED_SUCCESS (RetainContext, (value [i])); + PUSH_CLOBJ (stash_context, value [i]); void devices (OpenCL::Program self) @@ -2628,9 +2598,7 @@ int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) - { - PUSH_CLOBJ (stash_device, value [i]); - } + PUSH_CLOBJ (stash_device, value [i]); void source (OpenCL::Program self) @@ -2851,10 +2819,8 @@ NEED_SUCCESS (GetKernelInfo, (self, CL_KERNEL_CONTEXT, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainContext, (value [i])); - PUSH_CLOBJ (stash_context, value [i]); - } + NEED_SUCCESS (RetainContext, (value [i])); + PUSH_CLOBJ (stash_context, value [i]); void program (OpenCL::Kernel self) @@ -2863,10 +2829,8 @@ NEED_SUCCESS (GetKernelInfo, (self, CL_KERNEL_PROGRAM, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainProgram, (value [i])); - PUSH_CLOBJ (stash_program, value [i]); - } + NEED_SUCCESS (RetainProgram, (value [i])); + PUSH_CLOBJ (stash_program, value [i]); #END:kernel @@ -2940,18 +2904,12 @@ void arg_address_qualifier (OpenCL::Kernel self, cl_uint idx) + ALIAS: + arg_address_qualifier = CL_KERNEL_ARG_ADDRESS_QUALIFIER + arg_access_qualifier = CL_KERNEL_ARG_ACCESS_QUALIFIER PPCODE: - cl_kernel_arg_address_qualifier value [1]; - NEED_SUCCESS (GetKernelArgInfo, (self, idx, CL_KERNEL_ARG_ADDRESS_QUALIFIER, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void -arg_access_qualifier (OpenCL::Kernel self, cl_uint idx) - PPCODE: - cl_kernel_arg_access_qualifier value [1]; - NEED_SUCCESS (GetKernelArgInfo, (self, idx, CL_KERNEL_ARG_ACCESS_QUALIFIER, sizeof (value), value, 0)); + cl_uint value [1]; + NEED_SUCCESS (GetKernelArgInfo, (self, idx, ix, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -2973,7 +2931,7 @@ void arg_type_qualifier (OpenCL::Kernel self, cl_uint idx) PPCODE: - cl_kernel_arg_type_qualifier value [1]; + cl_ulong value [1]; NEED_SUCCESS (GetKernelArgInfo, (self, idx, CL_KERNEL_ARG_TYPE_QUALIFIER, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; @@ -3014,23 +2972,13 @@ NEED_SUCCESS (GetEventInfo, (self, CL_EVENT_COMMAND_QUEUE, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainCommandQueue, (value [i])); - PUSH_CLOBJ (stash_queue, value [i]); - } + NEED_SUCCESS (RetainCommandQueue, (value [i])); + PUSH_CLOBJ (stash_queue, value [i]); void command_type (OpenCL::Event self) - PPCODE: - cl_command_type value [1]; - NEED_SUCCESS (GetEventInfo, (self, CL_EVENT_COMMAND_TYPE, sizeof (value), value, 0)); - EXTEND (SP, 1); - const int i = 0; - PUSHs (sv_2mortal (newSVuv (value [i]))); - -void -reference_count (OpenCL::Event self) ALIAS: + command_type = CL_EVENT_COMMAND_TYPE reference_count = CL_EVENT_REFERENCE_COUNT command_execution_status = CL_EVENT_COMMAND_EXECUTION_STATUS PPCODE: @@ -3047,10 +2995,8 @@ NEED_SUCCESS (GetEventInfo, (self, CL_EVENT_CONTEXT, sizeof (value), value, 0)); EXTEND (SP, 1); const int i = 0; - { - NEED_SUCCESS (RetainContext, (value [i])); - PUSH_CLOBJ (stash_context, value [i]); - } + NEED_SUCCESS (RetainContext, (value [i])); + PUSH_CLOBJ (stash_context, value [i]); #END:event @@ -3125,10 +3071,24 @@ clRetainEvent (self->event); XPUSH_CLOBJ (stash_event, self->event); -size_t +#define MAPPED_OFFSET_CB offsetof (struct mapped, cb) +#define MAPPED_OFFSET_ROW_PITCH offsetof (struct mapped, row_pitch) +#define MAPPED_OFFSET_SLICE_PITCH offsetof (struct mapped, slice_pitch) +#define MAPPED_OFFSET_WIDTH offsetof (struct mapped, width) +#define MAPPED_OFFSET_HEIGHT offsetof (struct mapped, height) +#define MAPPED_OFFSET_DEPTH offsetof (struct mapped, depth) + +IV size (OpenCL::Mapped self) + ALIAS: + size = MAPPED_OFFSET_CB + row_pitch = MAPPED_OFFSET_ROW_PITCH + slice_pitch = MAPPED_OFFSET_SLICE_PITCH + width = MAPPED_OFFSET_WIDTH + height = MAPPED_OFFSET_HEIGHT + depth = MAPPED_OFFSET_DEPTH CODE: - RETVAL = self->cb; + RETVAL = *(size_t *)((char *)self + ix); OUTPUT: RETVAL @@ -3150,18 +3110,58 @@ memcpy (offset + (char *)self->ptr, ptr, len); +void +get_row (OpenCL::Mapped self, size_t count, size_t x = 0, size_t y = 0, size_t z = 0) + PPCODE: + if (!SvOK (ST (1))) + count = self->width - x; + + if (x + count > self->width) + croak ("OpenCL::Mapped::get: x + count crosses a row boundary"); + + if (y >= self->height) + croak ("OpenCL::Mapped::get: y coordinate out of bounds"); + + if (z >= self->depth) + croak ("OpenCL::Mapped::get: z coordinate out of bounds"); + + size_t element = mapped_element_size (self); + + count *= element; + x *= element; + + char *ptr = (char *)self->ptr + x + y * self->row_pitch + z * self->slice_pitch; + XPUSHs (sv_2mortal (newSVpvn (ptr, count))); + +void +set_row (OpenCL::Mapped self, SV *data, size_t x = 0, size_t y = 0, size_t z = 0) + PPCODE: + STRLEN count; + char *dataptr = SvPVbyte (data, count); + size_t element = mapped_element_size (self); + + x *= element; + + if (x + count > self->width * element) + croak ("OpenCL::Mapped::set: x + data size crosses a row boundary"); + + if (y >= self->height) + croak ("OpenCL::Mapped::set: y coordinate out of bounds"); + + if (z >= self->depth) + croak ("OpenCL::Mapped::set: z coordinate out of bounds"); + + char *ptr = (char *)self->ptr + x + y * self->row_pitch + z * self->slice_pitch; + memcpy (ptr, dataptr, count); + MODULE = OpenCL PACKAGE = OpenCL::MappedBuffer MODULE = OpenCL PACKAGE = OpenCL::MappedImage IV -row_pitch (OpenCL::Mapped self) - ALIAS: - slice_pitch = 1 +element_size (OpenCL::Mapped self) CODE: - RETVAL = ix ? self->slice_pitch : self->row_pitch; + RETVAL = mapped_element_size (self); OUTPUT: RETVAL - -