--- OpenCL/OpenCL.xs 2012/05/05 02:45:38 1.71 +++ OpenCL/OpenCL.xs 2012/05/05 15:43:02 1.79 @@ -30,9 +30,23 @@ #endif #ifdef __APPLE__ - #include + #define CLHDR(name) #else - #include + #define CLHDR(name) +#endif + +#include CLHDR(opencl.h) + +#ifndef CL_VERSION_1_2 + #include CLHDR(cl_d3d9.h) +#endif + +#if _WIN32 + #include CLHDR(cl_d3d10.h) + #if CL_VERSION_1_2 + #include CLHDR + #endif + #include CLHDR #endif #ifndef CL_VERSION_1_2 @@ -40,6 +54,9 @@ #define PREFER_1_1 1 #endif +// make sure all constants we might use are actually defined +#include "default.h" + typedef cl_platform_id OpenCL__Platform; typedef cl_device_id OpenCL__Device; typedef cl_device_id OpenCL__SubDevice; @@ -177,6 +194,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) { @@ -596,6 +620,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 @@ -780,6 +820,7 @@ BOOT: { HV *stash = gv_stashpv ("OpenCL", 1); + static const ivstr *civ, const_iv[] = { { sizeof (cl_char ), "SIZEOF_CHAR" }, { sizeof (cl_uchar ), "SIZEOF_UCHAR" }, @@ -792,12 +833,22 @@ { sizeof (cl_half ), "SIZEOF_HALF" }, { sizeof (cl_float ), "SIZEOF_FLOAT" }, { sizeof (cl_double), "SIZEOF_DOUBLE" }, + { PREFER_1_1 , "PREFER_1_1" }, #include "constiv.h" }; 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); @@ -992,9 +1043,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]))); @@ -1018,8 +1082,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 @@ -1067,61 +1133,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 @@ -1130,40 +1141,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) @@ -1190,9 +1181,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) @@ -1522,9 +1511,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) @@ -2124,10 +2111,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) @@ -2136,9 +2121,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) @@ -2152,7 +2135,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; @@ -2172,13 +2155,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]))); @@ -2186,7 +2178,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; @@ -2214,28 +2206,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) @@ -2244,10 +2222,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 @@ -2356,9 +2332,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]))); @@ -2370,33 +2350,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; @@ -2491,7 +2451,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; @@ -2511,6 +2471,15 @@ const int i = 0; PUSHs (sv_2mortal (newSVpv (value, 0))); +void +binary_type (OpenCL::Program self, OpenCL::Device device) + PPCODE: + cl_uint value [1]; + NEED_SUCCESS (GetProgramBuildInfo, (self, device, CL_PROGRAM_BINARY_TYPE, sizeof (value), value, 0)); + EXTEND (SP, 1); + const int i = 0; + PUSHs (sv_2mortal (newSVuv ((UV)value [i]))); + #END:program_build void @@ -2586,10 +2555,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) @@ -2601,9 +2568,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) @@ -2769,9 +2734,6 @@ void set_image (OpenCL::Kernel self, cl_uint idx, OpenCL::Image_ornull value) - ALIAS: - set_image2d = 0 - set_image3d = 0 CODE: clSetKernelArg (self, idx, sizeof (value), value ? &value : 0); @@ -2827,10 +2789,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) @@ -2839,10 +2799,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 @@ -2916,18 +2874,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]))); @@ -2949,7 +2901,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; @@ -2990,23 +2942,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: @@ -3023,10 +2965,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