Name Strings

    cl_khr_gl_sharing

Version

    Version 15, March 10, 2010

Number

    OpenCL Extension #1

Status

    Complete. Version 10 approved by the OpenCL Working Group.
    Ratified by the Khronos Promoters, August 28, 2009.

Extension Type

    OpenCL platform extension

Dependencies

    OpenCL 1.0 is required. This extension is written against the OpenCL
    1.0 revision 47 specification draft.

    An OpenGL implementation supporting buffer objects and sharing of
    texture and buffer object images with OpenCL is required.

    This extension is included in the OpenCL 1.0 specification as
    section 9.11 for reference purposes. However, the normative version
    of the extension, as approved by the OpenCL Working Group, will
    always be the separate cl_khr_gl_sharing.txt document in the Khronos
    API Registry.

Overview

    OpenCL defines how to share image data with texture and buffer
    objects in a parallel OpenGL implementation, but does not define how
    the association between an OpenCL context and an OpenGL context or
    share group is established. This extension defines optional
    attributes to OpenCL context creation routines which associate a GL
    context or share group object with a newly created OpenGL context.

Header File

    This extension's interfaces are defined in cl_gl.h .

New Types

    typedef cl_uint cl_gl_context_info;

New Procedures and Functions

    cl_int clGetGLContextInfoKHR(const cl_context_properties *properties,
				 cl_gl_context_info param_name,
				 size_t param_value_size,
				 void *param_value,
				 size_t *param_value_size_ret);

New Tokens

    Returned by clCreateContext, clCreateContextFromType, and
    clGetGLContextInfoKHR when an invalid OpenGL context or share group
    object handle is specified in <properties>:

	CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR	-1000

    Accepted as the <param_name> argument of clGetGLContextInfoKHR:

	CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR	0x2006
	CL_DEVICES_FOR_GL_CONTEXT_KHR		0x2007

    Accepted as an attribute name in the 'properties' argument of
    clCreateContext and clCreateContextFromType:

	CL_GL_CONTEXT_KHR			0x2008
	CL_EGL_DISPLAY_KHR			0x2009
	CL_GLX_DISPLAY_KHR			0x200A
	CL_WGL_HDC_KHR				0x200B
	CL_CGL_SHAREGROUP_KHR			0x200C

Additions to Chapter 4 of the OpenCL 1.0 Specification

    In section 4.3, replace the description of <properties> under
    clCreateContext on page 38 with:

   "<properties> points to an <attribute list>, which is a array of
    ordered <attribute name, value> pairs terminated with zero. If an
    attribute is not specified in <properties>, then its default value
    (listed in table 4.4) is used (it is said to be specified
    implicitly). If <properties> is NULL or empty (points to a list
    whose first value is zero), all attributes take on their default
    values.

    If the CL_CONTEXT_PLATFORM attribute is not specified, or is
    specified with the default value of NULL, the selected platform is
    implementation-defined.

    Other attributes control sharing of OpenCL memory objects with
    OpenGL buffer, texture, and renderbuffer objects as described in
    section 9.12. Depending on the platform-specific API used to bind
    OpenGL contexts to the window system, the following attributes may
    be set to identify an OpenGL context:

      * When the CGL binding API is supported, the attribute
	CL_CGL_SHAREGROUP_KHR should be set to a CGLShareGroup handle to
	a CGL share group object.

      * When the EGL binding API is supported, the attribute
	CL_GL_CONTEXT_KHR should be set to an EGLContext handle to an
	OpenGL ES or OpenGL context, and the attribute
	CL_EGL_DISPLAY_KHR should be set to the EGLDisplay handle of the
	display used to create the OpenGL ES or OpenGL context.

      * When the GLX binding API is supported, the attribute
	CL_GL_CONTEXT_KHR should be set to a GLXContext handle to an
	OpenGL context, and the attribute CL_GLX_DISPLAY_KHR should be
	set to the Display handle of the X Window System display used to
	create the OpenGL context.

      * When the WGL binding API is supported, the attribute
	CL_GL_CONTEXT_KHR should be set to an HGLRC handle to an OpenGL
	context, and the attribute CL_WGL_HDC_KHR should be set to the
	HDC handle of the display used to create the OpenGL context.

    Memory objects created in the context so specified may be shared
    with the specified OpenGL or OpenGL ES context (as well as with any
    other OpenGL contexts on the share list of that context, according
    to the description of sharing in the GLX 1.4 and EGL 1.4
    Specifications, and the WGL documentation for OpenGL implementations
    on Microsoft Windows), or with the explicitly identified OpenGL
    share group for CGL. If no OpenGL or OpenGL ES context or share
    group is specified in the attribute list, then memory objects may
    not be shared, and calling any of the commands in section 9.12 will
    result in a CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR error."

    Replace existing table 4.4 with:

   "-------------------------------------------------------------------------
    Attribute Name	    Allowed Values	Description
    (cl_context		    (default value
    properties enum)	    is in *bold*)
    ---------------------   ------------------	-----------------------------
    CL_CONTEXT_PLATFORM     *NULL*,		Specifies the platform to
			    cl_platform_id	create the OpenCL context on
			    pointer
    CL_GL_CONTEXT_KHR	    *0*,		OpenGL context to associate
			    OpenGL context	the OpenCL context with
			    handle
    CL_CGL_SHAREGROUP_KHR   *0*,		CGL share group to associate
			    CGL share group	the OpenCL context with
			    handle
    CL_EGL_DISPLAY_KHR	    *EGL_NO_DISPLAY*,	EGLDisplay an OpenGL context
			    EGLDisplay handle	was created with respect to
    CL_GLX_DISPLAY_KHR	    *None*		X Display an OpenGL context
			    X Display handle	was created with respect to
    CL_WGL_HDC_KHR	    *0*,		HDC an OpenGL context
			    HDC handle		was created with respect to
    ------------------------------------------------------------------------
	Table 4.4: Context creation attributes"

    Add to the list of errors for clCreateContext:

   "* CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR if a context was specified
      by any of the following means:

      * A context was specified for an EGL-based OpenGL ES or OpenGL
	implementation by setting the attributes CL_GL_CONTEXT_KHR and
	CL_EGL_DISPLAY_KHR
      * A context was specified for a GLX-based OpenGL implementation by
	setting the attributes CL_GL_CONTEXT_KHR and CL_GLX_DISPLAY_KHR
      * A context was specified for a WGL-based OpenGL implementation by
	setting the attributes CL_GL_CONTEXT_KHR and CL_WGL_HDC_KHR

    and any of the following conditions hold:

      * The specified display and context attributes do not identify a
	valid OpenGL or OpenGL ES context
      * The specified context does not support buffer and renderbuffer
	objects.
      * The specified context is not compatible with the OpenCL context
	being created (for example, it exists in a physically distinct
	address space, such as another hardware device; or it does not
	support sharing data with OpenCL due to implementation
	restrictions).

    * CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR if a share group was
      specified for a CGL-based OpenGL implementation by setting the
      attribute CL_CGL_SHAREGROUP_KHR, and the specified share group
      does not identify a valid CGL share group object.

    * CL_INVALID_OPERATION if a context or share group object was
      specified for one of CGL, EGL, GLX, or WGL and any of the
      following conditions hold:

      * The OpenGL implementation does not support the window-system
	binding API for which a context or share group objects was
	specified.
      * More than one of the attributes CL_CGL_SHAREGROUP_KHR,
	CL_EGL_DISPLAY_KHR, CL_GLX_DISPLAY_KHR, and CL_WGL_HDC_KHR is
	set to a non-default value.
      * Both of the attributes CL_CGL_SHAREGROUP_KHR and
	CL_GL_CONTEXT_KHR are set to non-default values.
      * Any of the devices specified in the <devices> argument cannot
	support OpenCL objects which share the data store of an OpenGL
	object, as described in section 9.12."

    Replace the description of <properties> under
    clCreateContextFromType with:

   "<properties> points to an attribute list whose format and valid
    contents are identical to the <properties> argument of
    clCreateContext."

    Add to the list of errors for clCreateContextFromType the same new
    errors described above for clCreateContext.

Additions to Section 9.12 (Sharing Memory Objects...) of the OpenCL 1.0
Specification

    Add new section 9.12.7:

   "9.12.7 Querying devices corresponding to OpenGL contexts

    OpenCL device(s) corresponding to an OpenGL context may be queried.
    Such a device may not always exist (for example, if an OpenGL
    context is specified on a GPU not supporting OpenCL command queues,
    but which does support shared CL/GL objects), and if it does exist,
    may change over time. When such a device does exist, acquiring and
    releasing shared CL/GL objects may be faster on a command queue
    corresponding to this device than on command queues corresponding to
    other devices available to an OpenCL context. To query the currently
    corresponding device, use the function

	cl_int clGetGLContextInfoKHR(const cl_context_properties *properties,
				     cl_gl_context_info param_name,
				     size_t param_value_size,
				     void *param_value,
				     size_t *param_value_size_ret);

    <properties> points to an attribute list whose format and valid
    contents are identical to the <properties> argument of
    clCreateContext. <properties> must identify a single valid GL
    context or GL share group object.

    <param_name> is a constant that specifies the GL context information
    to query, and must be one of the values shown in table 9.ctxprop.

    <param_value> is a pointer to memory where the result of the query
    is returned as described in table 9.ctxprop. If <param_value> is
    NULL, it is ignored.

    <param_value_size> specifies the size in bytes of memory pointed to
    by <param_value>. This size must be greater than or equal to the
    size of the return type described in table 9.ctxprop.

    <param_value_size_ret> returns the actual size in bytes of data
    being queried by <param_value>. If <param_value_size_ret> is NULL,
    it is ignored.

    --------------------------------------------------------------------
    param_name,
    return type		    info. returned in param_value
    -----------		    --------------------------------------------
    CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR,
    cl_device_id	    CL device currently associated with the
			    specified OpenGL context

    CL_DEVICES_FOR_GL_CONTEXT_KHR,
    cl_device_id[]	    List of all CL devices which may be
			    associated with the specified OpenGL context
    --------------------------------------------------------------------
    Table 9.ctxprop: GL context information that can be queried with
    clGetGLContextInfoKHR

    clGetGLContextInfoKHR returns CL_SUCCESS if the function is executed
    successfully. If no device(s) exist corresponding to <param_name>,
    the call will not fail, but the value of <param_value_size_ret> will
    be zero.

    clGetGLContextInfoKHR returns CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR
    if a context was specified by any of the following means:
      * A context was specified for an EGL-based OpenGL ES or OpenGL
	implementation by setting the attributes CL_GL_CONTEXT_KHR and
	CL_EGL_DISPLAY_KHR
      * A context was specified for a GLX-based OpenGL implementation by
	setting the attributes CL_GL_CONTEXT_KHR and CL_GLX_DISPLAY_KHR
      * A context was specified for a WGL-based OpenGL implementation by
	setting the attributes CL_GL_CONTEXT_KHR and CL_WGL_HDC_KHR
    and any of the following conditions hold:
      * The specified display and context attributes do not identify a
	valid OpenGL or OpenGL ES context
      * The specified context does not support buffer and renderbuffer
	objects.
      * The specified context is not compatible with the OpenCL context
	being created (for example, it exists in a physically distinct
	address space, such as another hardware device; or it does not
	support sharing data with OpenCL due to implementation
	restrictions).

    clGetGLContextInfoKHR returns CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR
    if a share group was specified for a CGL-based OpenGL implementation
    by setting the attribute CL_CGL_SHAREGROUP_KHR, and the specified
    share group does not identify a valid CGL share group object.

    clGetGLContextInfoKHR returns CL_INVALID_OPERATION if a context was
    specified as described above and any of the following conditions
    hold:
      * A context or share group object was specified for one of CGL,
	EGL, GLX, or WGL and the OpenGL implementation does not support
	that window-system binding API.
      * More than one of the attributes CL_CGL_SHAREGROUP_KHR,
	CL_EGL_DISPLAY_KHR, CL_GLX_DISPLAY_KHR, and CL_WGL_HDC_KHR is
	set to a non-default value.
      * Both of the attributes CL_CGL_SHAREGROUP_KHR and
	CL_GL_CONTEXT_KHR are set to non-default values.
      * Any of the devices specified in the <devices> argument cannot
	support OpenCL objects which share the data store of an OpenGL
	object, as described in section 9.12.

    clGetGLContextInfoKHR returns CL_INVALID_VALUE if an attribute name
    other than CL_GL_CONTEXT_KHR, CL_CGL_SHAREGROUP_KHR,
    CL_EGL_DISPLAY_KHR, CL_GLX_DISPLAY_KHR, or CL_WGL_HDC_KHR (as
    described in table 4.4) is specified in <properties>, or if the same
    property name is specified more than once.

    Additionally, clGetGLContextInfoKHR returns CL_INVALID_VALUE if
    <param_name> is not one of the values listed in table 9.ctxprop, or
    if the size in bytes specified by <param_value_size> is less than
    the size of the return type shown in table 9.ctxprop, and
    <param_value> is not a NULL value."

Issues

 1) How should the OpenGL context be identified when creating an
    associated OpenCL context?

    RESOLVED: by using a (display,context handle) attribute pair to
    identify an arbitrary OpenGL or OpenGL ES context with respect to
    one of the window-system binding layers EGL, GLX, or WGL, or a share
    group handle to identify a CGL share group. If a context is
    specified, it need not be current to the thread calling
    clCreateContext*.

    A previously suggested approach would use a single boolean attribute
    CL_USE_GL_CONTEXT_KHR to allow creating a context associated with the
    currently bound OpenGL context. This may still be implemented as a
    separate extension, and might allow more efficient Acquire/Release
    behavior in the special case where they are being executed in the
    same thread as the bound GL context used to create the CL context.

 2) What should the format of an attribute list be?

    After considerable discussion in bug 4340, we think we can live with
    a list of <attribute name,value> pairs terminated by zero. The list
    is passed as 'cl_context_properties *properties', where
    cl_context_properties is typedefed to be 'intptr_t' in cl.h.

    This effectively allows encoding all scalar integer, pointer, and
    handle values in the host API into the argument list and is
    analogous to the structure and type of EGL attribute lists. NULL
    attribute lists are also allowed. Again as for EGL, any attributes
    not explicitly passed in the list will take on a defined default
    value that does something reasonable.

    Experience with EGL, GLX, and WGL has shown attribute lists to be a
    sufficiently flexible and general mechanism to serve the needs of
    management calls such as context creation. It is not completely
    general (encoding floating-point and non-scalar attribute values is
    not straightforward), and other approaches were suggested in bug
    4340 such as opaque attribute lists with getter/setter methods, or
    arrays of varadic structures.

 3) What's the behavior of an associated OpenGL or OpenCL context when
    using resources defined by the other associated context, and that
    context is destroyed?

    RESOLVED: As described in section 9.12, OpenCL objects place a
    reference on the data store underlying the corresponding GL object
    when they're created. The GL name corresponding to that data store
    may be deleted, but the data store itself remains so long as any CL
    object has a reference to it.

    However, destroying all GL contexts in the share group corresponding
    to a CL context results in implementation-dependent behavior when
    using a corresponding CL object, up to and including program
    termination.

 4) How about sharing with D3D?

    Sharing between D3D and OpenCL should use the same attribute list
    mechanism, though obviously with different parameters, and be
    exposed as a similar parallel OpenCL extension. There may be an
    interaction between that extension and this one since it's not yet
    clear if it will be possible to create a CL context simultaneously
    sharing GL and D3D objects.

 5) Under what conditions will context creation fail due to sharing?

    RESOLVED: Several cross-platform failure conditions are described
    (GL context or CGL share group doesn't exist, GL context doesn't
    support types of GL objects required by the section 9.12 interfaces,
    GL context implementation doesn't allow sharing), but additional
    failures may result due to implementation-dependent reasons and
    should be added to this extension as such failures are discovered.
    Sharing between OpenCL and OpenGL requires integration at the driver
    internals level.

 6) What command queues can clEnqueueAcquire/ReleaseGLObjects be placed
    on?

    RESOLVED: All command queues. This restriction is enforced at
    context creation time. If any device passed to context creation
    cannot support shared CL/GL objects, context creation will fail with
    a CL_INVALID_OPERATION error.

 7) How can applications determine which command queue to place an
    Acquire/Release on?

    RESOLVED: The clGetGLContextInfoKHR returns either the CL device
    currently corresponding to a specified GL context (typically the
    display it's running on), or a list of all the CL devices the
    specified context might run on (potentially useful in multiheaded /
    "virtual screen" environments). This command is not simply placed in
    section 9.12 because it relies on the same property-list method of
    specifying a GL context introduced by this extension.

    If no devices are returned, it means that the GL context exists on
    an older GPU not capable of running OpenCL, but still capable of
    sharing objects between GL running on that GPU and CL running
    elsewhere.

 8) What is the meaning of the CL_DEVICES_FOR_GL_CONTEXT_KHR query?

    RESOLVED: the list of all CL devices that may ever be associated
    with a specific GL context. On platforms such as MacOS X,
    the "virtual screen" concept allows multiple GPUs to back a single
    virtual display. Similar functionality might be implemented on other
    windowing systems, such as a transparent heterogenous multiheaded X
    server. Therefore the exact meaning of this query is interpreted
    relative to the binding layer API in use.

 9) Miscellaneous issues during syncing of version 12 with the OpenCL
    1.0 revision 47 spec language and the minor changes Affie made
    including this extension as section 9.11 of that spec:

    - rev47 spec numbers table 9.ctxprop as "9.7" but this may depends
      on the core spec revision.
    - rev47 spec uses 'cl_context' as the return type for
      clGetGLContextInfoKHR param names, but cl_device_id /
      cl_device_id[] are the proper types.
    - rev47 spec omits the paragraph describing CL_SUCCESS return from
      clGetGLContextInfoKHR.

Sample Code

    None yet.

Conformance Tests

    None yet. The conformance suite's GL/CL interop testing will
    probably make use of this extension in time.

Revision History

    Version 15, 2010/03/10 (Jon Leech) - Add missing "Header File"
    section now that the extension headers have been published.

    Version 14, 2009/12/02 (Jon Leech) - Add missing "New Types" section
    with cl_gl_context_info type definition (public bug 239).

    Version 13, 2009/10/02 (Jon Leech) - Fix typo (CL_CONTEXT_PROPERTY
    -> CL_CONTEXT_PLATFORM) and list a default value of NULL for this
    attribute in table 4.4.

    Version 12, 2009/10/01 (Jon Leech) - Change value for
    CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR from -63 to -1000, to be in a
    new range of extension error codes instead of in the core API error
    codes. Sync up spec language with movement of Appendix B to Section
    9.12 of the latest 1.0 specification update and modify existing
    table 4.4 instead of adding a new table. Moved clGetGLContextInfoKHR
    into a new subsection 9.12.7 and added the same INVALID_VALUE error
    for badly formed attribute lists (repeated properties) as
    clCreateContext, to encourage consistent treatment of attribute
    lists everywhere they're used. Reduced number of quote marks around
    new spec language.

    Version 11, 2009/09/02 (Jon Leech) - Fix capitalization of the name
    string. Note that this is not purely a cosmetic change.
    Implementations should not ship with the Version 10 and earlier
    capitalization. Update status to note approval by the Promoters.

    Version 10, 2009/08/27 (Jon Leech) - Add 'const' attribute to
    clGetGLContextInfoKHR <properties> parameter.

    Version 9, 2009/07/06 (Jon Leech) - Fix minor typos. Assign
    enumerant values. Change CL_INVALID_GL_CONTEXT_KHR error to
    CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR so it can apply to either
    contexts or share group objects. Expand full text of error conditions
    for clGetGLContextInfoKHR. Resolve all issues still marked
    UNRESOLVED with the currently defined behaviors. Rename
    CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR and
    CL_DEVICES_FOR_GL_CONTEXT_KHR to drop "DISPLAY" and remove the
    Apple-specific CGL_ prefix.

    Version 8, 2009/06/15 (Jon Leech) - remove unused OpenCL context
    argument from clGetGLContextInfoKHR and fix type of param_name
    argument, based on discussion in bug 4340. Fix minor typos.

    Version 7, 2009/04/27 (Jon Leech) - add "extension type", fill in a
    few more fields from the prototype extension template, and tag this
    as a platform extension.

    Version 6, 2009/04/21 (Jon Leech) - add CGL share group to attribute
    list, expand errors section, rename CL_INVALID_CONTEXT to
    CL_INVALID_GL_CONTEXT_KHR, fix some minor spec language errors.
    Change extension name from use_gl_context to gl_sharing.

    Version 5, 2009/04/20 (Jon Leech) - add new functions & tokens to
    the summary section at the top. Add KHR suffix to tokens for
    specifying WGL/GLX/EGL context attributes. No functionality
    changes relative to version 4.

    Version 4, 2009/04/13 (Jon Leech) - add error on context creation if
    an unrecognized attribute name is specified. Replace
    clGetCurrentGLDevice with clGetGLContextInfoKHR based on equivalent
    Apple functionality. Update issue 7 and add issues 8/9.

    Version 3, 2009/03/24 (Jon Leech) - add error on context creation if
    devices not supporting GL sharing are specified. Resolve issues 3
    and 6 as agreed in discussion last week. Add issue 7 for which
    command queues an Acquire/Release should be placed on and add
    proposed clGetCurrentGLDevice query.

    Version 2, 2009/02/17 (Jon Leech) - revise proposal to identify the
    OpenGL context using an explicit handle, rather than using the
    currently bound context. Revised issues 1 and 3 to match, and added
    issue 6 suggesting changes to the "base" GL interop interace in
    Appendix B.

    Version 1, 2009/01/29 (Jon Leech) - initial extension specification
    based on discussion in bug 4340.
