--- OpenCL/OpenCL.xs 2011/11/20 10:21:27 1.14 +++ OpenCL/OpenCL.xs 2011/11/20 22:29:36 1.15 @@ -404,7 +404,7 @@ NEED_SUCCESS (GetDeviceInfo, (this, CL_DEVICE_MAX_WORK_ITEM_SIZES, 0, 0, &size)); size_t *value = tmpbuf (size); NEED_SUCCESS (GetDeviceInfo, (this, CL_DEVICE_MAX_WORK_ITEM_SIZES, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -942,7 +942,7 @@ NEED_SUCCESS (GetDeviceInfo, (this, CL_DEVICE_PARTITION_TYPES_EXT, 0, 0, &size)); cl_device_partition_property_ext *value = tmpbuf (size); NEED_SUCCESS (GetDeviceInfo, (this, CL_DEVICE_PARTITION_TYPES_EXT, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -954,7 +954,7 @@ NEED_SUCCESS (GetDeviceInfo, (this, CL_DEVICE_AFFINITY_DOMAINS_EXT, 0, 0, &size)); cl_device_partition_property_ext *value = tmpbuf (size); NEED_SUCCESS (GetDeviceInfo, (this, CL_DEVICE_AFFINITY_DOMAINS_EXT, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -975,7 +975,7 @@ NEED_SUCCESS (GetDeviceInfo, (this, CL_DEVICE_PARTITION_STYLE_EXT, 0, 0, &size)); cl_device_partition_property_ext *value = tmpbuf (size); NEED_SUCCESS (GetDeviceInfo, (this, CL_DEVICE_PARTITION_STYLE_EXT, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -1102,7 +1102,7 @@ NEED_SUCCESS (GetContextInfo, (this, CL_CONTEXT_DEVICES, 0, 0, &size)); cl_device_id *value = tmpbuf (size); NEED_SUCCESS (GetContextInfo, (this, CL_CONTEXT_DEVICES, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) { @@ -1116,7 +1116,7 @@ NEED_SUCCESS (GetContextInfo, (this, CL_CONTEXT_PROPERTIES, 0, 0, &size)); cl_context_properties *value = tmpbuf (size); NEED_SUCCESS (GetContextInfo, (this, CL_CONTEXT_PROPERTIES, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) PUSHs (sv_2mortal (newSVuv ((UV)value [i]))); @@ -1728,6 +1728,34 @@ PPCODE: INFO (Program) +void +binaries (OpenCL::Program this) + PPCODE: + cl_uint n, i; + size_t size; + + NEED_SUCCESS (GetProgramInfo, (this, CL_PROGRAM_NUM_DEVICES , sizeof (n) , &n , 0)); + if (!n) XSRETURN_EMPTY; + + size_t *sizes = tmpbuf (sizeof (*sizes) * n); + NEED_SUCCESS (GetProgramInfo, (this, CL_PROGRAM_BINARY_SIZES, sizeof (*sizes) * n, sizes, &size)); + if (size != sizeof (*sizes) * n) XSRETURN_EMPTY; + unsigned char **ptrs = tmpbuf (sizeof (*ptrs) * n); + + EXTEND (SP, n); + for (i = 0; i < n; ++i) + { + SV *sv = sv_2mortal (newSV (sizes [i])); + SvUPGRADE (sv, SVt_PV); + SvPOK_only (sv); + SvCUR_set (sv, sizes [i]); + ptrs [i] = SvPVX (sv); + PUSHs (sv); + } + + NEED_SUCCESS (GetProgramInfo, (this, CL_PROGRAM_BINARIES , sizeof (*ptrs ) * n, ptrs , &size)); + if (size != sizeof (*ptrs) * n) XSRETURN_EMPTY; + #BEGIN:program void @@ -1767,7 +1795,7 @@ NEED_SUCCESS (GetProgramInfo, (this, CL_PROGRAM_DEVICES, 0, 0, &size)); cl_device_id *value = tmpbuf (size); NEED_SUCCESS (GetProgramInfo, (this, CL_PROGRAM_DEVICES, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) { @@ -1793,7 +1821,7 @@ NEED_SUCCESS (GetProgramInfo, (this, CL_PROGRAM_BINARY_SIZES, 0, 0, &size)); size_t *value = tmpbuf (size); NEED_SUCCESS (GetProgramInfo, (this, CL_PROGRAM_BINARY_SIZES, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) PUSHs (sv_2mortal (newSVuv (value [i]))); @@ -1985,7 +2013,7 @@ NEED_SUCCESS (GetKernelWorkGroupInfo, (this, device, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, 0, 0, &size)); size_t *value = tmpbuf (size); NEED_SUCCESS (GetKernelWorkGroupInfo, (this, device, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, size, value, 0)); - int i, n = size / sizeof (value [0]); + int i, n = size / sizeof (*value); EXTEND (SP, n); for (i = 0; i < n; ++i) PUSHs (sv_2mortal (newSVuv (value [i])));