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,