--- OpenCL/OpenCL.xs 2012/05/05 02:45:38 1.71 +++ OpenCL/OpenCL.xs 2012/05/05 14:57:32 1.77 @@ -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) { @@ -780,6 +804,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 +817,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); @@ -2172,6 +2207,10 @@ PPCODE: INFO (MemObject) +void +destructor_callback (OpenCL::Memory self, SV *notify) + PPCODE: + #BEGIN:mem void @@ -2511,6 +2550,15 @@ const int i = 0; PUSHs (sv_2mortal (newSVpv (value, 0))); +void +binary_type (OpenCL::Program self, OpenCL::Device device) + PPCODE: + cl_program_binary_type 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 @@ -2769,9 +2817,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);