diff --git a/doc/runtime.rst b/doc/runtime.rst index bf639e26aaa2a0d1c7ad8bb6fe0f5ef69fbc2f91..fd17da8bc5371f4cbbfdf8f5993a118216007fd5 100644 --- a/doc/runtime.rst +++ b/doc/runtime.rst @@ -978,8 +978,8 @@ with GL support. See :func:`have_gl`. .. class:: GLTexture(context, flags, texture_target, miplevel, texture, dims) - *dims* is either 2 or 3. - :class:`GLTexture` inherits from :class:`Image`. + :class:`GLTexture` inherits from :class:`Image`. Only available in OpenCL 1.2 + and newer. .. attribute:: gl_object diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index 7cb3acf26bed2265a52ec0edea891b2a4358dde0..fe46f507c295bf9570a8c38de8bf3a8cfc6831bd 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -1956,12 +1956,10 @@ class Sampler(_Common, _CLKernelArg): class GLTexture(Image, _GLObject): _id = 'gl_texture' - def __init__(self, context, flags, texture_target, miplevel, texture, dims): - raise NotImplementedError("GLTexture") - + def __init__(self, context, flags, texture_target, miplevel, texture, dims=None): ptr = _ffi.new('clobj_t*') _handle_error(_lib._create_from_gl_texture( - ptr, context.ptr, flags, texture_target, miplevel, texture, dims)) + ptr, context.ptr, flags, texture_target, miplevel, texture)) self.ptr = ptr[0] # }}} diff --git a/src/c_wrapper/gl_obj.cpp b/src/c_wrapper/gl_obj.cpp index 139bb030697e8305cec2dceed009805b402e6f69..6dfbec8c5ea11b78072964fb088d83849aa04763 100644 --- a/src/c_wrapper/gl_obj.cpp +++ b/src/c_wrapper/gl_obj.cpp @@ -23,28 +23,6 @@ gl_texture::get_gl_texture_info(cl_gl_texture_info param_name) const } } -#if 0 -PYOPENCL_USE_RESULT static gl_texture* -create_from_gl_texture(const context *ctx, cl_mem_flags flags, - GLenum texture_target, GLint miplevel, - GLuint texture, unsigned dims) -{ - if (dims == 2) { - cl_mem mem = pyopencl_call_guarded(clCreateFromGLTexture2D, - ctx, flags, texture_target, - miplevel, texture); - return pyopencl_convert_obj(gl_texture, clReleaseMemObject, mem); - } else if (dims == 3) { - cl_mem mem = pyopencl_call_guarded(clCreateFromGLTexture3D, - ctx, flags, texture_target, - miplevel, texture); - return pyopencl_convert_obj(gl_texture, clReleaseMemObject, mem); - } else { - throw clerror("Image", CL_INVALID_VALUE, "invalid dimension"); - } -} -#endif - typedef cl_int (CL_API_CALL *clEnqueueGLObjectFunc)(cl_command_queue, cl_uint, const cl_mem*, cl_uint, const cl_event*, cl_event*); @@ -66,6 +44,23 @@ enqueue_gl_objects(clEnqueueGLObjectFunc func, const char *name, // c wrapper +error* +create_from_gl_texture(clobj_t *ptr, clobj_t _ctx, cl_mem_flags flags, + GLenum texture_target, GLint miplevel, + GLuint texture) +{ +#if PYOPENCL_CL_VERSION >= 0x1020 + auto ctx = static_cast<context*>(_ctx); + return c_handle_error([&] { + cl_mem mem = pyopencl_call_guarded(clCreateFromGLTexture, + ctx, flags, texture_target, miplevel, texture); + *ptr = pyopencl_convert_obj(gl_texture, clReleaseMemObject, mem); + }); +#else + PYOPENCL_UNSUPPORTED(clCreateFromGLTexture, "CL 1.1") +#endif +} + error* create_from_gl_buffer(clobj_t *ptr, clobj_t _ctx, cl_mem_flags flags, GLuint bufobj) diff --git a/src/c_wrapper/wrap_cl_gl_core.h b/src/c_wrapper/wrap_cl_gl_core.h index 8f326b372633b63dee059c6bdd2534e545f61a53..00911c9b1faead17dcf2caaaacdc7dca2defa095 100644 --- a/src/c_wrapper/wrap_cl_gl_core.h +++ b/src/c_wrapper/wrap_cl_gl_core.h @@ -1,5 +1,8 @@ // Interface between C and Python for GL related functions +error* create_from_gl_texture(clobj_t *ptr, cl_mem_flags flags, + GLenum texture_target, GLint miplevel, + GLuint texture); error *create_from_gl_buffer(clobj_t *ptr, clobj_t context, cl_mem_flags flags, GLuint bufobj); error *create_from_gl_renderbuffer(clobj_t *ptr, clobj_t context,