--- OpenCL/OpenCL.xs 2012/04/21 19:49:40 1.40 +++ OpenCL/OpenCL.xs 2012/04/21 20:48:03 1.42 @@ -504,7 +504,7 @@ native_vector_width_float = CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT native_vector_width_double = CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE native_vector_width_half = CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF - reference_count_ext = CL_DEVICE_REFERENCE_COUNT_EXT + reference_count_ext = CL_DEVICE_REFERENCE_COUNT_EXT PPCODE: cl_uint value [1]; NEED_SUCCESS (GetDeviceInfo, (self, ix, sizeof (value), value, 0)); @@ -731,6 +731,36 @@ NEED_SUCCESS_ARG (cl_mem mem, CreateBuffer, (self, flags, len, ptr, &res)); XPUSH_NEW_OBJ ("OpenCL::BufferObj", mem); +#if CL_VERSION_1_2 + +void +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) + PPCODE: + STRLEN len; + char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; + const cl_image_format format = { channel_order, channel_type }; + const cl_image_desc desc = { + type, + width, height, depth, + array_size, row_pitch, slice_pitch, + num_mip_level, num_samples, + type == CL_MEM_OBJECT_IMAGE1D_BUFFER ? (cl_mem)SvPTROBJ ("OpenCL::Context::Image", "data", data, "OpenCL::Buffer") : 0 + }; + NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res)); + char *klass = "OpenCL::Image"; + switch (type) + { + case CL_MEM_OBJECT_IMAGE1D_BUFFER: klass = "OpenCL::Image1DBuffer"; break; + case CL_MEM_OBJECT_IMAGE1D: klass = "OpenCL::Image1D"; break; + case CL_MEM_OBJECT_IMAGE1D_ARRAY: klass = "OpenCL::Image2DArray"; break; + case CL_MEM_OBJECT_IMAGE2D: klass = "OpenCL::Image2D"; break; + case CL_MEM_OBJECT_IMAGE2D_ARRAY: klass = "OpenCL::Image2DArray"; break; + case CL_MEM_OBJECT_IMAGE3D: klass = "OpenCL::Image3D"; break; + } + XPUSH_NEW_OBJ (klass, mem); + +#endif + #if !CL_VERSION_1_2 || defined CL_USE_DEPRECATED_OPENCL_1_1_APIS void @@ -739,7 +769,12 @@ STRLEN len; char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; const cl_image_format format = { channel_order, channel_type }; +#if CL_VERSION_1_2 + const cl_image_desc desc = { CL_MEM_OBJECT_IMAGE2D, width, height, 0, 0, row_pitch, 0, 0, 0, 0 }; + NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res)); +#else NEED_SUCCESS_ARG (cl_mem mem, CreateImage2D, (self, flags, &format, width, height, row_pitch, ptr, &res)); +#endif XPUSH_NEW_OBJ ("OpenCL::Image2D", mem); void @@ -748,7 +783,12 @@ STRLEN len; char *ptr = SvOK (data) ? SvPVbyte (data, len) : 0; const cl_image_format format = { channel_order, channel_type }; +#if CL_VERSION_1_2 + const cl_image_desc desc = { CL_MEM_OBJECT_IMAGE3D, width, height, depth, 0, row_pitch, slice_pitch, 0, 0, 0 }; + NEED_SUCCESS_ARG (cl_mem mem, CreateImage, (self, flags, &format, &desc, ptr, &res)); +#else NEED_SUCCESS_ARG (cl_mem mem, CreateImage3D, (self, flags, &format, width, height, depth, row_pitch, slice_pitch, ptr, &res)); +#endif XPUSH_NEW_OBJ ("OpenCL::Image3D", mem); #endif @@ -773,10 +813,10 @@ gl_texture (OpenCL::Context self, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture) PPCODE: char *klass = "OpenCL::Memory"; - cl_gl_object_type t; + cl_gl_object_type type; NEED_SUCCESS_ARG (cl_mem mem, CreateFromGLTexture2D, (self, flags, target, miplevel, texture, &res)); - NEED_SUCCESS (GetGLObjectInfo, (mem, &t, 0)); - switch (t) + NEED_SUCCESS (GetGLObjectInfo, (mem, &type, 0)); + switch (type) { case CL_GL_OBJECT_TEXTURE_BUFFER: klass = "OpenCL::Image1DBuffer"; break; case CL_GL_OBJECT_TEXTURE1D: klass = "OpenCL::Image1D"; break;