diff --git a/extensions/khr/cl_khr_d3d10_sharing.txt b/extensions/khr/cl_khr_d3d10_sharing.txt
index 0635e72..2e3f289 100644
--- a/extensions/khr/cl_khr_d3d10_sharing.txt
+++ b/extensions/khr/cl_khr_d3d10_sharing.txt
@@ -1,914 +1,12 @@
-Name String
+The normative cl_khr_d3d10_sharing specification is now in the
+OpenCL Extension Specification and is no longer authored in
+plain text.
 
-    cl_khr_d3d10_sharing
+Please refer to the OpenCL Extension Specification on the
+OpenCL Registry:
 
-Contact
+https://www.khronos.org/registry/OpenCL/
 
-   Mike Houston, Advanced Micro Devices, Inc. ( michael.houston 'at' amd.com )
-   Christopher Cameron, NVIDIA Corporation ( chcameron 'at' nvidia.com )
+The Asciidoc source for this extension may be found here:
 
-Contributors
-
-   Christopher Cameron   (Nvidia)
-   Ben Gaster            (AMD)
-   Michael Gold          (Nvidia)
-   Mike Houston          (AMD)
-   John Kessenich        (Intel)
-   Christopher Lamb      (Nvidia)
-   Victor Odintsov       (AMD)
-   Ofer Rosenberg        (Intel)
-
-Version
-
-    Version 9, March 31, 2010
-
-Number
-
-    OpenCL Extension #6
-
-Status
-
-    Complete. Version 7 approved by the OpenCL Working Group.
-    Ratified by the Khronos Promoters, February 26, 2010.
-
-Extension Type
-
-    OpenCL platform extension
-
-Dependencies
-
-    OpenCL 1.0 is required. This extension is written against the OpenCL
-    1.0-rev48 Specification.
-
-    A Direct3D 10 implementation supporting sharing of buffer and
-    texture objects with OpenCL is required.
-
-Overview
-
-    The goal of this extension is to provide interoperability between
-    OpenCL and Direct3D 10.  This is designed to function analogously to
-    the OpenGL interoperability as defined in the OpenCL 1.0
-    specification and accompanying extensions.
-
-Header File
-
-    Interfaces for this extension are provided in cl_d3d10.h .
-
-New Procedures and Functions
-
-    cl_int clGetDeviceIDsFromD3D10KHR(
-        cl_platform_id platform,
-        cl_d3d10_device_source_khr d3d_device_source,
-        void *d3d_object,
-        cl_d3d10_device_set_khr d3d_device_set,
-        cl_uint num_entries, 
-        cl_device_id *devices, 
-        cl_uint *num_devices)
-
-    cl_mem  clCreateFromD3D10BufferKHR(
-        cl_context context,
-        cl_mem_flags flags,
-        ID3D10Buffer *resource,
-        cl_int *errcode_ret)
-
-    cl_mem  clCreateFromD3D10Texture2DKHR(
-        cl_context context,
-        cl_mem_flags flags,
-        ID3D10Texture2D *resource,
-        UINT subresource,
-        cl_int *errcode_ret)
-
-    cl_mem  clCreateFromD3D10Texture3DKHR(
-        cl_context context,
-        cl_mem_flags flags,
-        ID3D10Texture3D *resource,
-        UINT subresource,
-        cl_int *errcode_ret)
-
-    cl_int  clEnqueueAcquireD3D10ObjectsKHR(
-        cl_command_queue command_queue,
-        cl_uint num_objects,
-        const cl_mem *mem_objects,
-        cl_uint num_events_in_wait_list,
-        const cl_event *event_wait_list,
-        cl_event *event)
-
-    cl_int clEnqueueReleaseD3D10ObjectsKHR(
-        cl_command_queue command_queue,
-        cl_uint num_objects,
-        cl_mem *mem_objects,
-        cl_uint num_events_in_wait_list,
-        const cl_event *event_wait_list,
-        cl_event *event)
-
-New Tokens
-
-    Accepted as a Direct3D 10 device source in the <d3d_device_source> 
-    parameter of clGetDeviceIDsFromD3D10KHR:
-
-        CL_D3D10_DEVICE_KHR                            0x4010
-        CL_D3D10_DXGI_ADAPTER_KHR                      0x4011
-
-    Accepted as a set of Direct3D 10 devices in the <d3d_device_set> parameter
-    of clGetDeviceIDsFromD3D10KHR:
-
-        CL_PREFERRED_DEVICES_FOR_D3D10_KHR             0x4012
-        CL_ALL_DEVICES_FOR_D3D10_KHR                   0x4013
-
-    Accepted as a property name in the <properties> parameter of
-    clCreateContext and clCreateContextFromType:
-
-        CL_CONTEXT_D3D10_DEVICE_KHR                    0x4014
-
-    Accepted as a property name in the <param_name> parameter of
-    clGetContextInfo:
-
-        CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR   0x402C
-
-    Accepted as the property being queried in the <param_name> 
-    parameter of clGetMemObjectInfo:
-
-        CL_MEM_D3D10_RESOURCE_KHR                      0x4015
-
-    Accepted as the property being queried in the <param_name> 
-    parameter of clGetImageInfo:
-
-        CL_IMAGE_D3D10_SUBRESOURCE_KHR                 0x4016
-
-    Returned in the <param_value> parameter of clGetEventInfo when
-    <param_name> is CL_EVENT_COMMAND_TYPE:
-
-        CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR           0x4017
-        CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR           0x4018
-
-    Returned by clCreateContext and clCreateContextFromType if the Direct3D 10
-    device specified for interoperability is not compatible with the devices
-    against which the context is to be created:
-
-        CL_INVALID_D3D10_DEVICE_KHR                    -1002
-
-    Returned by clCreateFromD3D10BufferKHR when <resource> is not a Direct3D 10
-    buffer object, and by clCreateFromD3D10Texture2DKHR and
-    clCreateFromD3D10Texture3DKHR when <resource> is not a Direct3D 10 texture
-    object.
-
-        CL_INVALID_D3D10_RESOURCE_KHR                  -1003
-
-    Returned by clEnqueueAcquireD3D10ObjectsKHR when any of <mem_objects> are
-    currently acquired by OpenCL
-
-        CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR         -1004
-
-    Returned by clEnqueueReleaseD3D10ObjectsKHR when any of <mem_objects> are
-    not currently acquired by OpenCL
-
-        CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR             -1005
-
-Additions to Chapter 4 of the OpenCL 1.0 Specification
-
-    In section 4.3, replace the description of <properties> under
-    clCreateContext with:
-
-   "<properties> specifies a list of context property names and their
-    corresponding values.  Each property is followed immediately by the
-    corresponding desired value.  The list is terminated with zero.  
-    If a property 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."
-
-    Replace existing table 4.4 with:
-
-   "--------------------------------------------------------------------------------------
-    cl_context_properties       Value type     Default value  Description
-    ---------------------       ----------     -------------  -----------
-    CL_CONTEXT_PLATFORM         cl_platform_id          NULL  Specifies the cl_platform_id 
-                                                              on whic to create the OpenCL
-                                                              context.
-    CL_CONTEXT_D3D10_DEVICE_KHR ID3D10Device*           NULL  Specifies the ID3D10Device*
-                                                              to use for Direct3D 10 
-                                                              interoperabilty."
-    --------------------------------------------------------------------------------------"
-
-    Add to the list of errors for clCreateContext:
-
-   "* CL_INVALID_D3D10_DEVICE_KHR if the value of the property 
-      CL_CONTEXT_D3D10_DEVICE_KHR is non-NULL and does not specify a valid
-      Direct3D 10 device with which the cl_device_ids against which this context 
-      is to be created may interoperate.
-
-    * CL_INVALID_OPERATION if Direct3D 10 interoperability is specified by 
-      setting CL_INVALID_D3D10_DEVICE_KHR to a non-NULL value, and 
-      interoperability with another graphics API is also specified."
-
-    Add to the list of errors for clCreateContextFromType the same new
-    errors described above for clCreateContext.
-
-    Add the following row to table 4.5:
-
-   "--------------------------------------------------------------------------------------
-    cl_context_info         Return Type   Information returned in param_value
-    ---------------------   -----------   -----------------------------------
-    CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 
-                            cl_bool       Returns CL_TRUE if Direct3D 10 resources
-                                          created as shared by setting MiscFlags to 
-                                          include D3D10_RESOURCE_MISC_SHARED will perform
-                                          faster when shared with OpenCL, compared with 
-                                          resources which have not set this flag.  
-                                          Otherwise returns CL_FALSE."
-    --------------------------------------------------------------------------------------"
-
-Additions to Chapter 5 of the OpenCL 1.0 Specification
-
-    5.2.9 Memory Object Queries
-
-    Change the last paragraph before table 5.8 to read
-
-   "clGetMemObjectInfo returns CL_SUCCESS if the function is executed successfully.  
-    Otherwise it returns one of the following errors:
-
-      * CL_INVALID_VALUE if <param_name> is not valid, or if the size in bytes 
-        specified by <param_value_size> is less than the size of the return type as 
-        described in table 5.8 and <param_value> is not NULL.
-
-      * CL_INVALID_MEM_OBJECT if <memobj> is a not a valid memory object.
-
-      * CL_INVALID_D3D10_RESOURCE_KHR if <param_name> is CL_MEM_D3D10_RESOURCE_KHR
-        and  <memobj> was not created by the function clCreateFromD3D10BufferKHR, 
-        clCreateFromD3D10Texture2DKHR, or
-        clCreateFromD3D10Texture3DKHR."
-
-    Extend table 5.8 to include the following entry.
-
-    cl_mem_info                Return type      Info. returned in param_value
-    -----------                ---------------  -----------------------------
-    CL_MEM_D3D10_RESOURCE_KHR  ID3D10Resource*  If <memobj> was created using 
-                                                clCreateFromD3D10BufferKHR, 
-                                                clCreateFromD3D10Texture2DKHR, or
-                                                clCreateFromD3D10Texture3DKHR, 
-                                                returns the <resource> argument
-                                                specified when <memobj> was 
-                                                created.
-
-    Change the last paragraph before table 5.9 to read
-
-   "clGetImageInfo returns CL_SUCCESS if the function is executed successfully.  
-    Otherwise it returns one of the following errors:
-
-      * CL_INVALID_VALUE if <param_name> is not valid, or if the size in bytes 
-        specified by <param_value_size> is less than the size of the return type as 
-        described in table 5.9 and <param_value> is not NULL.
-
-      * CL_INVALID_MEM_OBJECT if <image> is a not a valid image object. 
-
-      * CL_INVALID_D3D10_RESOURCE_KHR if <param_name> is CL_MEM_D3D10_SUBRESOURCE_KHR
-        and  <image> was not created by the function clCreateFromD3D10Texture2DKHR or
-        clCreateFromD3D10Texture3DKHR."
-
-    Extend table 5.9 to include the following entry.
-
-    cl_image_info                   Return type      Info. returned in param_value
-    -------------                   ---------------  -----------------------------
-    CL_IMAGE_D3D10_SUBRESOURCE_KHR  ID3D10Resource*  If <image> was created using 
-                                                     clCreateFromD3D10Texture2DKHR, or
-                                                     clCreateFromD3D10Texture3DKHR, 
-                                                     returns the <subresource> argument
-                                                     specified when <image> was 
-                                                     created.
-
-    5.7 Event Objects
-
-    Add to Table 5.15 in the "Info returned in <param_value>" column
-    for cl_event_info CL_EVENT_COMMAND_TYPE:
-
-      CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR
-      CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR
-
-Add new section 9.13
-
-    9.13 Sharing Memory Objects with Direct3D 10 Resources
-
-    This section discusses OpenCL functions that allow applications to use
-    Direct3D 10 resources as OpenCL memory objects. This allows efficient 
-    sharing of data between OpenCL and Direct3D 10. The OpenCL API may be 
-    used to execute kernels that read and/or write memory objects that are 
-    also Direct3D 10 resources.  An OpenCL image object may be created from 
-    a Direct3D 10 texture resource.  An OpenCL buffer object may 
-    be created from a Direct3D 10 buffer resource.  OpenCL memory objects 
-    may be created from Direct3D 10 objects if and only if the OpenCL context 
-    has been created from a Direct3D 10 device.
-
-    9.13.1 Querying OpenCL Devices Corresponding to Direct3D 10 Devices
-
-    The OpenCL devices corresponding to a Direct3D 10 device may be queried.  
-    The OpenCL devices corresponding to a DXGI adapter may also be 
-    queried.  The OpenCL devices corresponding to a Direct3D 10 device will
-    be a subset of the OpenCL devices corresponding to the DXGI adapter
-    against which the Direct3D 10 device was created.
-
-    The OpenCL devices corresponding to a Direct3D 10 device or a DXGI device 
-    may be queried using the function
-
-        cl_int clGetDeviceIDsFromD3D10KHR(
-            cl_platform_id platform,
-            cl_d3d10_device_source_khr d3d_device_source,
-            void *d3d_object,
-            cl_d3d10_device_set_khr d3d_device_set,
-            cl_uint num_entries, 
-            cl_device_id *devices, 
-            cl_uint *num_devices)
-
-    <platform> refers to the platform ID returned by clGetPlatformIDs.
-
-    <d3d_device_source> specifies the type of <d3d_object>, and must be 
-    one of the values shown in table 9.13.1.1.
-
-    <d3d_object> specifies the object whose corresponding OpenCL devices
-    are being queried.  The type of <d3d_object> must be as specified in
-    table 9.13.1.1.
-
-    <cl_device_set> specifies the set of devices to return, and must be
-    one of the values shown in table 9.13.1.2.
-
-    <num_entries> is the number of cl_device_id entries that can be added to 
-    <devices>. If <devices> is not NULL then <num_entries> must be greater than 
-    zero.
-
-    <devices> returns a list of OpenCL devices found. The cl_device_id values 
-    returned in <devices> can be used to identify a specific OpenCL device. 
-    If <devices> is NULL, this argument is ignored. The number of 
-    OpenCL devices returned is the mininum of the value specified by 
-    <num_entries> and the number of OpenCL devices corresponding to 
-    <d3d_object>.
-
-    <num_devices> returns the number of OpenCL devices available that 
-    correspond to <d3d_object>.  If <num_devices> is NULL, this argument 
-    is ignored.
-
-    clGetDeviceIDsFromD3D10KHR returns CL_SUCCESS if the function is executed 
-    successfully.  Otherwise it may return
-
-      * CL_INVALID_PLATFORM if <platform> is not a valid platform, 
-
-      * CL_INVALID_VALUE if <d3d_device_source> is not a valid value, 
-        <d3d_device_set> is not a valid value,  <num_entries> is equal 
-        to zero and <devices> is not NULL, or if both <num_devices> 
-        and <devices> are NULL.
-
-      * CL_DEVICE_NOT_FOUND if no OpenCL devices that correspond to  
-        <d3d_object> were found.
-
-    --------------------------------------------------------------------
-    cl_d3d_device_source_khr         Type of <d3d_object> 
-    ------------------------         --------------------
-    CL_D3D10_DEVICE_KHR              ID3D10Device *
-    CL_D3D10_DXGI_ADAPTER_KHR        IDXGIAdapter *
-    --------------------------------------------------------------------
-    Table 9.13.1.1: Types used to specify the object whose corresponding 
-    OpenCL devices are being queried by clGetDeviceIDsFromD3D10KHR.
-
-    --------------------------------------------------------------------
-    cl_d3d_device_set_khr                Devices returned in <devices>
-    ------------------------             -----------------------------
-    CL_PREFERRED_DEVICES_FOR_D3D10_KHR   The OpenCL devices associated with
-                                         the specified Direct3D object.
-
-    CL_ALL_DEVICES_FOR_D3D10_KHR         All OpenCL devices which may 
-                                         interoperate with the specified
-                                         Direct3D object.  Performance of
-                                         sharing data on these devices may 
-                                         be considerably less than on the 
-                                         preferred devices.
-    --------------------------------------------------------------------
-    Table 9.13.1.2: Sets of devices queriable using 
-    clGetDeviceIDsFromD3D10KHR.
-
-    9.13.2 Lifetime of Shared Objects
-
-    An OpenCL memory object created from a Direct3D 10 resource remains 
-    valid as long as the corresponding Direct3D 10 resource has not been 
-    deleted.  If the Direct3D 10 resource is deleted through the Direct3D 
-    10 API, subsequent use of the OpenCL memory object will result 
-    in undefined behavior, including but not limited to possible OpenCL 
-    errors, data corruption, and program termination.
-
-    The successful creation of a cl_context against a Direct3D 10 device 
-    specified via the context create parameter CL_CONTEXT_D3D10_DEVICE_KHR
-    will increment the internal Direct3D reference count on the specified
-    Direct3D 10 device.  The internal Direct3D reference count on that
-    Direct3D 10 device will be decremented when the OpenCL reference 
-    count on the returned OpenCL context drops to zero.
-
-    The OpenCL context and corresponding command-queues are dependent on 
-    the existence of the Direct3D 10 device from which the OpenCL context 
-    was created.  If the Direct3D 10 device is deleted through the Direct3D 10 
-    API, subsequent use of the OpenCL context will result in undefined 
-    behavior, including but not limited to possible OpenCL errors, data 
-    corruption, and program termination.
-
-    9.13.3 Sharing Direct3D 10 Buffer Resources as OpenCL Buffer Objects
-
-    The function
-
-        cl_mem  clCreateFromD3D10BufferKHR(
-            cl_context context,
-            cl_mem_flags flags,
-            ID3D10Buffer *resource,
-            int *errcode_ret)
-
-    creates an OpenCL buffer object from a Direct3D 10 buffer.
-
-    <context> is a valid OpenCL context created from a Direct3D 10 device.
-
-    <flags> is a bit-field that is used to specify usage information.
-    Refer to table 5.3 for a description of <flags>. Only
-    CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
-    specified in table 5.3 can be used.
-
-    <resource> is a pointer to the Direct3D 10 buffer to share.
-
-    <errcode_ret> will return an appropriate error code. If
-    <errcode_ret> is NULL, no error code is returned.
-
-    clCreateFromD3D10BufferKHR returns a valid non-zero OpenCL buffer object
-    and <errcode_ret> is set to CL_SUCCESS if the buffer object is
-    created successfully.  Otherwise, it returns a NULL value with one of
-    the following error values returned in <errcode_ret>:
-
-      * CL_INVALID_CONTEXT if <context> is not a valid context.
-
-      * CL_INVALID_VALUE if values specified in <flags> are not valid.
-
-      * CL_INVALID_D3D10_RESOURCE_KHR if <resource> is not a Direct3D 10 
-        buffer resource, if <resource> was created with the D3D10_USAGE 
-        flag D3D10_USAGE_IMMUTABLE, if a cl_mem from <resource> has already 
-        been created using clCreateFromD3D10BufferKHR, or if <context> 
-        was not created against the same Direct3D 10 device from which 
-        <resource> was created.
-
-      * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
-        required by the OpenCL implementation on the host.
-
-    The size of the returned OpenCL buffer object is the same as the 
-    size of <resource>.
-    
-    This call will increment the internal Direct3D reference count on 
-    <resource>.  The internal Direct3D reference count on <resource> 
-    will be decremented when the OpenCL reference count on the returned 
-    OpenCL memory object drops to zero.
-
-    9.13.4 Sharing Direct3D 10 Texture and Resources as OpenCL Image
-           Objects
-
-    The function
-
-        cl_mem  clCreateFromD3D10Texture2DKHR(
-            cl_context context,
-            cl_mem_flags flags,
-            ID3D10Texture2D *resource,
-            UINT subresource,
-            int *errcode_ret)
-
-    creates an OpenCL 2D image object from a subresource of a Direct3D 
-    10 2D texture.
-
-    <context> is a valid OpenCL context created from a Direct3D 10 device.
-
-    <flags> is a bit-field that is used to specify usage information.
-    Refer to table 5.3 for a description of <flags>. Only
-    CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
-    specified in table 5.3 can be used.
-
-    <resource> is a pointer to the Direct3D 10 2D texture to share.
-
-    <subresource> is the subresource of <resource> to share.    
-
-    <errcode_ret> will return an appropriate error code. If
-    <errcode_ret> is NULL, no error code is returned.
-
-    clCreateFromD3D10Texture2DKHR returns a valid non-zero OpenCL image
-    object and <errcode_ret> is set to CL_SUCCESS if the image object is
-    created successfully.  Otherwise, it returns a NULL value with one 
-    of the following error values returned in <errcode_ret>:
-
-      * CL_INVALID_CONTEXT if <context> is not a valid context.
-
-      * CL_INVALID_VALUE if values specified in <flags> are not valid or if
-        <subresource> is not a valid subresource index for <resource>.
-
-      * CL_INVALID_D3D10_RESOURCE_KHR if <resource> is not a Direct3D 10 
-        texture resource, if <resource> was created with the D3D10_USAGE flag
-        D3D10_USAGE_IMMUTABLE, if <resource> is a multisampled 
-        texture, if a cl_mem from subresource <subresource> of <resource> has 
-        already been created using clCreateFromD3D10Texture2DKHR, 
-        or if <context> was not created against the same Direct3D 10 device 
-        from which <resource> was created.
-
-      * CL_INVALID_IMAGE_FORMAT_DESCRIPTOR if the Direct3D 10 texture
-        format of <resource> is not listed in table 9.13.4.1.
-
-      * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
-        required by the OpenCL implementation on the host.
-
-    The width and height of the returned OpenCL 2D image object are 
-    determined by the width and height of subresource <subresource> 
-    of <resource>.  The channel type and order of the returned 
-    OpenCL 2D image object is determined by the format of <resource>
-    by table 9.13.4.1.
-
-    This call will increment the internal Direct3D reference count on 
-    <resource>.  The internal Direct3D reference count on <resource> 
-    will be decremented when the OpenCL reference count on the returned 
-    OpenCL memory object drops to zero.
-
-    The function
-
-        cl_mem  clCreateFromD3D10Texture3DKHR(
-            cl_context context,
-            cl_mem_flags flags,
-            ID3D10Texture3D *resource,
-            UINT subresource,
-            int *errcode_ret)
-
-    creates an OpenCL 3D image object from a subresource of a Direct3D 
-    10 3D texture.
-
-    <context> is a valid OpenCL context created from a Direct3D 10 device.
-
-    <flags> is a bit-field that is used to specify usage information.
-    Refer to table 5.3 for a description of <flags>. Only 
-    CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
-    specified in table 5.3 can be used.
-
-    <resource> is a pointer to the Direct3D 10 3D texture to share.
-
-    <subresource> is the subresource of <resource> to share.    
-
-    <errcode_ret> will return an appropriate error code. If
-    <errcode_ret> is NULL, no error code is returned.
-
-    clCreateFromD3D10Texture3DKHR returns a valid non-zero OpenCL image
-    object and <errcode_ret> is set to CL_SUCCESS if the image object is
-    created successfully.  Otherwise, it returns a NULL value with one 
-    of the following error values returned in <errcode_ret>:
-
-      * CL_INVALID_CONTEXT if <context> is not a valid context.
-
-      * CL_INVALID_VALUE if values specified in <flags> are not valid or if
-        <subresource> is not a valid subresource index for <resource>.
-
-      * CL_INVALID_D3D10_RESOURCE_KHR if <resource> is not a Direct3D 10 
-        texture resource, if <resource> was created with the D3D10_USAGE flag 
-        D3D10_USAGE_IMMUTABLE, if a cl_mem from subresource <subresource> of 
-        <resource> has already been created using clCreateFromD3D10Texture3DKHR, 
-        or if <context> was not created against the same Direct3D 10 device 
-        from which <resource> was created.
-
-      * CL_INVALID_IMAGE_FORMAT_DESCRIPTOR if the Direct3D 10 texture 
-        format of <resource> is not listed in table 9.13.4.1.
-
-      * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
-        required by the OpenCL implementation on the host.
-
-    The width, height, and depth of the return OpenCL 3D image object 
-    are determined by the width, height, and depth of subresource 
-    <subresource> of <resource>.  The channel type and order of the 
-    returned OpenCL 3D image object is determined by the format of <resource>
-    by table 9.13.4.1.
-
-    This call will increment the internal Direct3D reference count on 
-    <resource>.  The internal Direct3D reference count on <resource> 
-    will be decremented when the OpenCL reference count on the returned 
-    OpenCL memory object drops to zero.
-
-    ------------------------------------------------------------------
-    DXGI Format                      cl_channel_order  cl_channel_type    
-    ------------------------------   ----------------  ---------------
-    DXGI_FORMAT_R32G32B32A32_FLOAT   CL_RGBA           CL_FLOAT
-    DXGI_FORMAT_R32G32B32A32_UINT    CL_RGBA           CL_UNSIGNED_INT32
-    DXGI_FORMAT_R32G32B32A32_SINT    CL_RGBA           CL_SIGNED_INT32
-    DXGI_FORMAT_R16G16B16A16_FLOAT   CL_RGBA           CL_HALF_FLOAT
-    DXGI_FORMAT_R16G16B16A16_UNORM   CL_RGBA           CL_UNORM_INT16
-    DXGI_FORMAT_R16G16B16A16_UINT    CL_RGBA           CL_UNSIGNED_INT16
-    DXGI_FORMAT_R16G16B16A16_SNORM   CL_RGBA           CL_SNORM_INT16
-    DXGI_FORMAT_R16G16B16A16_SINT    CL_RGBA           CL_SIGNED_INT16
-    DXGI_FORMAT_R8G8B8A8_UNORM       CL_RGBA           CL_UNORM_INT8
-    DXGI_FORMAT_R8G8B8A8_UINT        CL_RGBA           CL_UNSIGNED_INT8
-    DXGI_FORMAT_R8G8B8A8_SNORM       CL_RGBA           CL_SNORM_INT8
-    DXGI_FORMAT_R8G8B8A8_SINT        CL_RGBA           CL_SIGNED_INT8
-    DXGI_FORMAT_R32G32_FLOAT         CL_RG             CL_FLOAT
-    DXGI_FORMAT_R32G32_UINT          CL_RG             CL_UNSIGNED_INT32
-    DXGI_FORMAT_R32G32_SINT          CL_RG             CL_SIGNED_INT32
-    DXGI_FORMAT_R16G16_FLOAT         CL_RG             CL_HALF_FLOAT
-    DXGI_FORMAT_R16G16_UNORM         CL_RG             CL_UNORM_INT16
-    DXGI_FORMAT_R16G16_UINT          CL_RG             CL_UNSIGNED_INT16
-    DXGI_FORMAT_R16G16_SNORM         CL_RG             CL_SNORM_INT16
-    DXGI_FORMAT_R16G16_SINT          CL_RG             CL_SIGNED_INT16
-    DXGI_FORMAT_R8G8_UNORM           CL_RG             CL_UNORM_INT8
-    DXGI_FORMAT_R8G8_UINT            CL_RG             CL_UNSIGNED_INT8
-    DXGI_FORMAT_R8G8_SNORM           CL_RG             CL_SNORM_INT8
-    DXGI_FORMAT_R8G8_SINT            CL_RG             CL_SIGNED_INT8
-    DXGI_FORMAT_R32_FLOAT            CL_R              CL_FLOAT
-    DXGI_FORMAT_R32_UINT             CL_R              CL_UNSIGNED_INT32
-    DXGI_FORMAT_R32_SINT             CL_R              CL_SIGNED_INT32
-    DXGI_FORMAT_R16_FLOAT            CL_R              CL_HALF_FLOAT
-    DXGI_FORMAT_R16_UNORM            CL_R              CL_UNORM_INT16
-    DXGI_FORMAT_R16_UINT             CL_R              CL_UNSIGNED_INT16
-    DXGI_FORMAT_R16_SNORM            CL_R              CL_SNORM_INT16
-    DXGI_FORMAT_R16_SINT             CL_R              CL_SIGNED_INT16
-    DXGI_FORMAT_R8_UNORM             CL_R              CL_UNORM_INT8
-    DXGI_FORMAT_R8_UINT              CL_R              CL_UNSIGNED_INT8
-    DXGI_FORMAT_R8_SNORM             CL_R              CL_SNORM_INT8
-    DXGI_FORMAT_R8_SINT              CL_R              CL_SIGNED_INT8
-    ------------------------------------------------------------------
-    Table 9.13.4.1: List of Direct3D 10 and corresponding OpenCL Image 
-    Formats
-
-    9.13.5 Querying Direct3D properties of memory objects created from
-           Direct3D 10 resources.
-
-    Properties of Direct3D 10 objects may be queried using clGetMemObjectInfo
-    and clGetImageInfo with <param_name> CL_MEM_D3D10_RESOURCE_KHR and
-    CL_IMAGE_D3D10_SUBRESOURCE_KHR as described in section 5.2.9.
-
-    9.13.6 Sharing memory objects created from Direct3D 10 resources between
-           Direct3D 10 and OpenCL contexts
-
-    The function
-
-        cl_int  clEnqueueAcquireD3D10ObjectsKHR(
-            cl_command_queue command_queue,
-            cl_uint num_objects,
-            const cl_mem *mem_objects,
-            cl_uint num_events_in_wait_list,
-            const cl_event *event_wait_list,
-            cl_event *event)
-
-    is used to acquire OpenCL memory objects that have been created from
-    Direct3D 10 resources.  The Direct3D 10 objects are acquired by the 
-    OpenCL context associated with <command_queue> and can therefore be 
-    used by all command-queues associated with the OpenCL context.
-
-    OpenCL memory objects created from Direct3D 10 resources must be 
-    acquired before they can be used by any OpenCL commands queued to 
-    a command-queue.  If an OpenCL memory object created from a Direct3D 10 
-    resource is used while it is not currently acquired by OpenCL, the call 
-    attempting to use that OpenCL memory object will return
-    CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR.
-
-    clEnqueueAcquireD3D10ObjectsKHR provides the synchronization guarantee 
-    that any Direct3D 10 calls made before clEnqueueAcquireD3D10ObjectsKHR is 
-    called will complete executing before <event> reports completion
-    and before the execution of any subsequent OpenCL work issued in 
-    <command_queue> begins.
-
-    <command_queue> is a valid command-queue.
-
-    <num_objects> is the number of memory objects to be acquired in
-    <mem_objects>.
-
-    <mem_objects> is a pointer to a list of OpenCL memory objects that 
-    were created from Direct3D 10 resources.
-
-    <event_wait_list> and <num_events_in_wait_list> specify events that
-    need to complete before this particular command can be executed. If
-    <event_wait_list> is NULL, then this particular command does not
-    wait on any event to complete. If <event_wait_list> is NULL,
-    <num_events_in_wait_list> must be 0. If <event_wait_list> is not
-    NULL, the list of events pointed to by <event_wait_list> must be
-    valid and <num_events_in_wait_list> must be greater than 0. The
-    events specified in <event_wait_list> act as synchronization points.
-
-    <event> returns an event object that identifies this particular 
-    command and can be used to query or queue a wait for this
-    particular command to complete. <event> can be NULL in which case it
-    will not be possible for the application to query the status of this
-    command or queue a wait for this command to complete.
-
-    clEnqueueAcquireD3D10ObjectsKHR returns CL_SUCCESS if the function is
-    executed successfully. If <num_objects> is 0 and <mem_objects> is
-    NULL then the function does nothing and returns CL_SUCCESS. Otherwise it
-    returns one of the following errors:
-
-      * CL_INVALID_VALUE if <num_objects> is zero and <mem_objects> is
-        not a NULL value or if <num_objects> > 0 and <mem_objects> is
-        NULL.
-
-      * CL_INVALID_MEM_OBJECT if memory objects in <mem_objects> are not
-        valid OpenCL memory objects or if memory objects in <mem_objects> 
-        have not been created from Direct3D 10 resources.
-
-      * CL_INVALID_COMMAND_QUEUE if <command_queue> is not a valid
-        command-queue.
-
-      * CL_INVALID_CONTEXT if context associated with <command_queue> was
-        not created from an Direct3D 10 context.
-
-      * CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR if memory objects in
-        <mem_objects> have previously been acquired using 
-        clEnqueueAcquireD3D10ObjectsKHR but have not been released 
-        using clEnqueueReleaseD3D10ObjectsKHR.
-
-      * CL_INVALID_EVENT_WAIT_LIST if <event_wait_list> is NULL and
-        <num_events_in_wait_list> > 0, or <event_wait_list> is not NULL
-        and <num_events_in_wait_list> is 0, or if event objects in
-        <event_wait_list> are not valid events.
-
-      * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
-        required by the OpenCL implementation on the host.
-
-    The function
-
-        cl_int clEnqueueReleaseD3D10ObjectsKHR(
-            cl_command_queue command_queue,
-            cl_uint num_objects,
-            const cl_mem *mem_objects,
-            cl_uint num_events_in_wait_list,
-            const cl_event *event_wait_list,
-            cl_event *event)
-
-    is used to release OpenCL memory objects that have been created from
-    Direct3D 10 resources. The Direct3D 10 objects are released by the 
-    OpenCL context associated with <command_queue>.
-
-    OpenCL memory objects created from Direct3D 10 resources which have
-    been acquired by OpenCL must be released by OpenCL before they may be 
-    accessed by Direct3D 10.  Accessing a Direct3D 10 resource while its 
-    corresponding OpenCL memory object is acquired is in error and will 
-    result in undefined behavior, including but not limited to possible 
-    OpenCL errors, data corruption, and program termination.
-
-    clEnqueueReleaseD3D10ObjectsKHR provides the synchronization guarantee
-    that any calls to Direct3D 10 made after the call to 
-    clEnqueueReleaseD3D10ObjectsKHR will not start executing until after
-    all events in <event_wait_list> are complete and all work already
-    submitted to <command_queue> completes execution.
-
-    <num_objects> is the number of memory objects to be released in
-    <mem_objects>.
-
-    <mem_objects> is a pointer to a list of OpenCL memory objects that 
-    were created from Direct3D 10 resources.
-
-    <event_wait_list> and <num_events_in_wait_list> specify events that
-    need to complete before this particular command can be executed. If
-    <event_wait_list> is NULL, then this particular command does not
-    wait on any event to complete. If <event_wait_list> is NULL,
-    <num_events_in_wait_list> must be 0. If <event_wait_list> is not
-    NULL, the list of events pointed to by <event_wait_list> must be
-    valid and <num_events_in_wait_list> must be greater than 0. The
-    events specified in
-
-    <event> returns an event object that identifies this particular 
-    command and can be used to query or queue a wait for this
-    particular command to complete. <event> can be NULL in which case it
-    will not be possible for the application to query the status of this
-    command or queue a wait for this command to complete.
-
-    clEnqueueReleaseD3D10ObjectsKHR returns CL_SUCCESS if the function
-    is executed successfully. If <num_objects> is 0 and <mem_objects> is
-    NULL the function does nothing and returns CL_SUCCESS. Otherwise it
-    returns one of the following errors:
-
-      * CL_INVALID_VALUE if <num_objects> is zero and <mem_objects> is
-        not a NULL value or if <num_objects> > 0 and <mem_objects> is
-        NULL.
-
-      * CL_INVALID_MEM_OBJECT if memory objects in <mem_objects> are not
-        valid OpenCL memory objects or if memory objects in <mem_objects> 
-        have not been created from Direct3D 10 resources.
-
-      * CL_INVALID_COMMAND_QUEUE if <command_queue> is not a valid
-        command-queue.
-
-      * CL_INVALID_CONTEXT if context associated with <command_queue> was
-        not created from a Direct3D 10 device.
-
-      * CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR if memory objects in
-        <mem_objects> have not previously 
-        clEnqueueAcquireD3D10ObjectsKHR, or have been released using
-        clEnqueueReleaseD3D10ObjectsKHR since the last time that they 
-        were acquired.
-
-      * CL_INVALID_EVENT_WAIT_LIST if <event_wait_list> is NULL and
-        <num_events_in_wait_list> > 0, or <event_wait_list> is not NULL
-        and <num_events_in_wait_list> is 0, or if event objects in
-        <event_wait_list> are not valid events.
-
-      * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
-        required by the OpenCL implementation on the host.
-
-Issues
-
- 1) Should this extension be KHR or EXT?
-
-    PROPOSED: KHR. If this extension is to be approved by Khronos then
-    it should be KHR, otherwise EXT. Not all platforms can support this
-    extension, but that is also true of OpenGL interop.
-
-    RESOLVED: KHR.
-
- 2) Requiring SharedHandle on ID3D10Resource
-
-    Requiring this can largely simplify things at the DDI level and make
-    some implementations faster. However, the DirectX spec only defines
-    the shared handle for a subset of the resources we would like to
-    support:
-
-        D3D10_RESOURCE_MISC_SHARED
-
-        Enables the sharing of resource data between two or more Direct3D
-        devices. The only resources that can be shared are 2D
-        non-mipmapped textures.
-
-    PROPOSED A: add wording to the spec about some implementations needing
-    the resource setup as shared:
-
-    "Some implementations may require the resource to be shared on the
-    D3D10 side of the API"
-
-    If we do that, do we need another enum to describe this failure case?
-
-    PROPOSED B: required that all implementations support both shared
-    and non-shared resources.  The restrictions prohibiting multisample
-    textures and the flag D3D10_USAGE_IMMUTABLE guarantee software
-    access to all shareable resources.
-
-    RESOLVED: Require that implementations support both 
-    D3D10_RESOURCE_MISC_SHARED being set and not set.  Add the query
-    for CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR to determine on a 
-    per-context basis which method will be faster.
-
- 3) Texture1D support
-
-    There is not a matching CL type, so do we want to
-    support this and map to buffer or Texture2D? If so the command might
-    correspond to the 2D / 3D versions:
-
-        cl_mem  clCreateFromD3D10Texture1D(cl_context context,
-                                           cl_mem_flags flags,
-                                           ID3D10Texture2D *resource,
-                                           UINT subresource,
-                                           int *errcode_ret)
-
-    RESOLVED: We will not add support for ID3D10Texture1D objects unless
-    a corresponding OpenCL 1D Image type is created.
-
- 4) CL/D3D10 queries
-
-    The GL interop has clGetGLObjectInfo and clGetGLTextureInfo. It is  
-    unclear if these are needed on the D3D10 interop side since the 
-    D3D10 spec makes these queries trivial on the D3D10 object itself. 
-    Also, not all of the sematics of the GL call map across.
-
-    PROPOSED: Add the clGetMemObjectInfo and clGetImageInfo parameter
-    names CL_MEM_D3D10_RESOURCE_KHR and CL_IMAGE_D3D10_SUBRESOURCE_KHR to 
-    query the D3D10 resource from which a cl_mem was created.  From this
-    data, any D3D10 side information may be queried using the D3D10 API.  
-
-    RESOLVED: We will use clGetMemObjectInfo and clGetImageInfo to 
-    access this information.
-
-Revision History
-
-    Version 9, 2010/03/31 (Jon Leech) - cleanup for publication. Update
-    Status and Header File fields with final approved information. Fix
-    clEnqueueReleaseExternalObjectsKHR->clEnqueueReleaseD3D10ObjectsKHR
-    typo.
-
-    Version 8, 2010/02/08 (Christopher Cameron) - fix typos and add
-    enumerant values.
-
-    Version 7, 2009/12/14 (Christopher Cameron) - resolve issue 2 by 
-    adding CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR query.
-
-    Version 6, 2009/12/01 (Christopher Cameron) - clarify error
-    codes and behavior of clContextCreate with CL_CONTEXT_D3D10_DEVICE.
-
-    Version 5, 2009/11/30 (Christopher Cameron) - clarify object 
-    lifetime, add KHR decoration to symbols, clarify size and format of 
-    shared objects, clarify acquire/release semantics mark issues as 
-    resolved.
-
-    Version 4, 2009/11/23 (Christopher Cameron) - add synchronization 
-    guarantees for clEnqueueAcquireD3D10Objects and 
-    clEnqueueReleaseD3D10Objects.
-
-    Version 3, 2009/11/20 (Christopher Cameron) - add device/adapter
-    query function clGetDeviceIDsFromD3D10KHR.  Add prohibition on 
-    D3D10_USAGE_IMMUTABLE and multisample textures to guarantee a 
-    consistent image format (e.g, how should a 2x multisampled texture
-    appear to OpenCL), add support for querying 
-    CL_MEM_D3D10_RESOURCE_KHR and CL_IMAGE_D3D10_SUBRESOURCE_KHR.  Add
-    image format conversion table.  Minor tweaks of names, formatting.
-    Change extension name to cl_khr_d3d10_sharing to match OpenGL.
-
-    Version 2, 2009/09/08 (Jon Leech) - tweak spec to match CL extension
-    template structurally, some minor reformatting and reflowing of
-    text. Move clCreateFromD3D10Texture1D from the New Functions section
-    into issue 3. Update section numbering to be against OpenCL 1.0 rev
-    47.
-
-    Version 1, 2009/08/31 (Michael Houston) - initial extension
-    specification based on discussion in bug 3663.
+https://github.com/KhronosGroup/OpenCL-Docs/blob/master/ext/cl_khr_d3d10_sharing.txt
diff --git a/extensions/khr/cl_khr_gl_sharing.txt b/extensions/khr/cl_khr_gl_sharing.txt
index 89b7718..893e460 100644
--- a/extensions/khr/cl_khr_gl_sharing.txt
+++ b/extensions/khr/cl_khr_gl_sharing.txt
@@ -1,543 +1,14 @@
-Name Strings
+The normative cl_khr_gl_sharing specification is now in the
+OpenCL Extension Specification and is no longer authored in
+plain text.
 
-    cl_khr_gl_sharing
+Please refer to the OpenCL Extension Specification on the
+OpenCL Registry:
 
-Version
+https://www.khronos.org/registry/OpenCL/
 
-    Version 15, March 10, 2010
+The Asciidoc source for this extension may be found here:
 
-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.
+https://github.com/KhronosGroup/OpenCL-Docs/blob/master/ext/cl_khr_gl_sharing__context.txt
+https://github.com/KhronosGroup/OpenCL-Docs/blob/master/ext/cl_khr_gl_sharing__memobjs.txt
 
-    Version 1, 2009/01/29 (Jon Leech) - initial extension specification
-    based on discussion in bug 4340.
diff --git a/extensions/khr/cl_khr_icd.txt b/extensions/khr/cl_khr_icd.txt
index 5ee8cc8..6dda605 100644
--- a/extensions/khr/cl_khr_icd.txt
+++ b/extensions/khr/cl_khr_icd.txt
@@ -1,381 +1,12 @@
-Name Strings
+The normative cl_khr_icd specification is now in the OpenCL
+Extension Specification and is no longer authored in plain
+text.
 
-    cl_khr_icd
+Please refer to the OpenCL Extension Specification on the
+OpenCL Registry:
 
-Contributors
+https://www.khronos.org/registry/OpenCL/
 
-    Ben Ashbaugh
-    Christopher Cameron
-    Benedict Gaster
-    Michael Houston
-    John Kessenich
-    Christopher Lamb
-    Laurent Morichetti
-    Aftab Munshi
-    Ofer Rosenberg
+The Asciidoc source for this extension may be found here:
 
-IP Status
-
-    No known claims.
-
-Version
-
-    Version 8, August 8, 2017
-
-Number
-
-    OpenCL Extension #5
-
-Status
-
-    Ratified by the Khronos Promoters, January 29, 2010
-
-Extension Type
-
-    OpenCL platform extension
-
-Dependencies
-
-    OpenCL 1.0 is required.
-
-Overview
-
-    This extension defines a simple mechanism through which the Khronos
-    installable client driver loader (ICD Loader) may expose multiple 
-    separate vendor installable client drivers (Vendor ICDs) for
-    OpenCL.  An application written against the ICD Loader will be able to 
-    access all cl_platform_ids exposed by all vendor implementations 
-    with the ICD Loader acting as a demultiplexor.
-
-Inferring Vendors From Function Calls from Arguments
-
-    At every OpenCL function call, the ICD Loader infers the Vendor ICD 
-    function to call from the arguments to the function.  An object is 
-    said to be ICD compatible if it is of the following structure:
-
-    struct _cl_<object>
-    {
-        struct _cl_icd_dispatch *dispatch;
-        // ... remainder of internal data
-    };
-
-    <object> is one of platform_id, device_id, context, command_queue,
-    mem, program, kernel, event, or sampler.
-
-    The structure _cl_icd_dispatch is a function pointer dispatch 
-    table which is used to direct calls to a particular vendor 
-    implementation.  All objects created from ICD compatible objects
-    must be ICD compatible.
-
-    A link to source code which defines the entries in the function
-    table structure _cl_icd_dispatch is available in the Sample 
-    Code section of this document.  The order of the functions in
-    _cl_icd_dispatch is determined by the ICD Loader's source.  The ICD
-    Loader's source's _cl_icd_dispatch table is to be appended to only.
-
-    Functions which do not have an argument from which the vendor
-    implementation may be inferred are ignored, with the exception
-    of clGetExtensionFunctionAddress which is described below.
-
-ICD Data
-
-    A Vendor ICD is defined by two pieces of data.
-    
-    The Vendor ICD library specifies a library which contains the 
-    OpenCL entrypoints for the vendor's OpenCL implementation.  The 
-    vendor ICD's library file name should include the vendor name, or 
-    a vendor-specific implementation identifier.
-    
-    The Vendor ICD extension suffix is a short string which specifies 
-    the default suffix for extensions implemented only by that vendor.  
-    See Additions to Chapter 9 for details on the mechanism through 
-    which this is accomplished.  The vendor suffix string is optional.
-
-ICD Loader Vendor Enumeration on Windows
-
-    To enumerate Vendor ICDs on Windows, the ICD Loader will first
-    scan for REG_SZ string values in the "Display Adapter" and
-    "Software Components" HKR registry keys.  The exact registry
-    keys to scan should be obtained via PnP Configuration Manager
-    APIs, but will look like:
-
-    For 64-bit ICDs:
-
-        HKLM\SYSTEM\CurrentControlSet\Control\Class\
-        {Display Adapter GUID}\{Instance ID}\OpenCLDriverName, or
-
-        HKLM\SYSTEM\CurrentControlSet\Control\Class\
-        {Software Component GUID}\{Instance ID}\OpenCLDriverName
-
-    For 32-bit ICDs:
-
-        HKLM\SYSTEM\CurrentControlSet\Control\Class\
-        {Display Adapter GUID}\{Instance ID}\OpenCLDriverNameWoW, or
-
-        HKLM\SYSTEM\CurrentControlSet\Control\Class\
-        {Software Component GUID}\{Instance ID}\OpenCLDriverNameWoW
-
-    These registry values contain the path to the Vendor ICD library.
-    For example, if the registry contains the value:
-
-        [HKLM\SYSTEM\CurrentControlSet\Control\Class\{GUID}\{Instance}]
-        "OpenCLDriverName"="c:\\vendor a\\vndra_ocl.dll"
-
-    Then the ICD loader will open the Vendor ICD library:
-
-        "c:\vendor a\vndra_ocl.dll"
-
-    The ICD Loader will also scan for REG_DWORD values in the registry
-    key:
-
-        HKLM\SOFTWARE\Khronos\OpenCL\Vendors
-
-    For each registry value in this key which has data set to 0, the
-    ICD Loader will open the Vendor ICD library specified by the name
-    of the registry value.
-
-    For example, if the registry contains the value:
-
-      [HKLM\SOFTWARE\Khronos\OpenCL\Vendors]
-      "c:\\vendor a\\vndra_ocl.dll"=dword:00000000
-
-    Then the ICD will open the Vendor ICD library:
-
-        "c:\vendor a\vndra_ocl.dll"
-
-ICD Loader Vendor Enumeration on Linux
-
-    To enumerate vendor ICDs on Linux, the ICD Loader scans
-    the files the path /etc/OpenCL/vendors.  For each
-    file in this path, the ICD Loader opens the file as a text
-    file.  The expected format for the file is a single line of
-    text which specifies the Vendor ICD's library.  The ICD 
-    Loader will attempt to open that file as a shared object
-    using dlopen().   Note that the library specified may be an
-    absolute path or just a file name.
-
-    For example, if the following file exists
-        /etc/OpenCL/vendors/VendorA.icd
-    and contains the text
-        libVendorAOpenCL.so
-    then the ICD Loader will load the library "libVendorAOpenCL.so"
-
-Adding a Vendor Library
-
-    Upon successfully loading a Vendor ICD's library, the 
-    ICD Loader queries the following functions from the library:
-    clIcdGetPlatformIDsKHR, clGetPlatformInfo, and 
-    clGetExtensionFunctionAddress.  If any of these functions
-    are not present then the ICD Loader will close and ignore 
-    the library.
-
-    Next the ICD Loader queries available ICD-enabled 
-    platforms in the library using clIcdGetPlatformIDsKHR.
-    For each of these platforms, the ICD Loader queries the
-    platform's extension string to verify that cl_khr_icd is
-    supported, then queries the platform's Vendor ICD extension
-    suffix using clGetPlatformInfo with the value 
-    CL_PLATFORM_ICD_SUFFIX_KHR.
-
-    If any of these steps fail, the ICD Loader will ignore the 
-    Vendor ICD and continue on to the next.
-
-New Procedures and Functions
-
-    cl_int clIcdGetPlatformIDsKHR(
-        cl_uint num_entries,
-        cl_platform_id *platforms,
-        cl_uint *num_platforms);
-
-New Tokens
-
-    Accepted as <param_name> to the function clGetPlatformInfo
-
-        CL_PLATFORM_ICD_SUFFIX_KHR          0x0920
-
-    Returned by clGetPlatformIDs when no platforms are found
-
-        CL_PLATFORM_NOT_FOUND_KHR            -1001
-
-
-Additions to Chapter 4 of the OpenCL 1.0.48 Specification
-
-    In section 4.1, replace the description of the return values of
-    clGetPlatformIDs with:
-
-   "clGetPlatformIDs returns CL_SUCCESS if the function is executed
-    successfully and there are a non zero number of platforms available.
-    It returns CL_PLATFORM_NOT_FOUND_KHR if zero platforms are 
-    available.  It returns CL_INVALID_VALUE if <num_entries> is 
-    equal to zero and <platforms> is not NULL or if both <num_platforms>
-    and <platforms> are NULL."
-
-    In section 4.1, add the following after the description of
-    clGetPlatforms:
-
-   "The list of platforms accessible through the Khronos ICD Loader
-    can be obtained using the following function
-
-    cl_int clIcdGetPlatformIDsKHR(
-        cl_uint num_entries,
-        cl_platform_id *platforms,
-        cl_uint *num_platforms);
-
-    <num_entries> is the number of cl_platform_id entries that can be
-    added to <platforms>.  If <platforms> is not NULL, then 
-    <num_entries> must be greater than zero.
-
-    <platforms> returns a list of OpenCL platforms available for access
-    through the Khronos ICD Loader.  The cl_platform_id values returned in
-    <platform> are ICD compatible and can be used to identify a 
-    specific OpenCL platform.  If the <platforms> argument is NULL,
-    then this argument is ignored.  The number of OpenCL platforms 
-    returned is the minimum of the value specified by num_entries or
-    the number of OpenCL platforms available.
-
-    <num_platforms> returns the number of OpenCL platforms available.
-    If <num_platforms> is NULL, then this argument is ignored.
-
-    clIcdGetPlatformIDsKHR returns CL_SUCCESS if the function is executed
-    successfully and there are a non zero number of platforms available.
-    It returns CL_PLATFORM_NOT_FOUND_KHR if zero platforms are 
-    available.  It returns CL_INVALID_VALUE if <num_entries> is 
-    equal to zero and <platforms> is not NULL or if both <num_platforms>
-    and <platforms> are NULL."
-
-    Add the following to table 4.1:
-
-   "--------------------------------------------------------------------
-    cl_platform_info            Return Type Description
-    ----------------            ----------- ----------------------------
-    CL_PLATFORM_ICD_SUFFIX_KHR  char[]      Then function name suffix 
-                                            used to identify extension 
-                                            functions to be directed to
-                                            this platform by the ICD
-                                            Loader."
-
-Additions to Chapter 9 of the OpenCL 1.0.48 Specification
-
-    Add the following paragraph to the end of Section 9.2:
-
-   "For functions supported by the ICD Loader,
-    clGetExtensionFunctionAddress will return the function pointer of
-    the ICD Loader implementation. For extension functions which the ICD
-    Loader is unaware of, the function clGetExtensionFunctionAddress
-    will determine the vendor implementation to return based on the
-    string passed in. The ICD Loader will return the result from
-    querying clGetExtensionFunctionAddress on the vendor ICD enumerated
-    by the ICD Loader whose ICD suffix is a suffix of the function name
-    being queried. If no such vendor exists or the suffix of the
-    function is KHR or EXT then clGetExtensionFunctionAddress will
-    return NULL."
-
-Interactions with other extensions
-
-    None.
-
-Issues
-
-    1. Some OpenCL functions do not take an object argument from which 
-    their vendor library may be identified (e.g, clUnloadCompiler), 
-    how will they be handled?
-
-    RESOLVED: Such functions will be a NOOP for all calls through the
-    ICD.
-
-    2. How are OpenCL extension to be handled?
-
-    RESOLVED: OpenCL extension functions may be added to the ICD as 
-    soon as they are implemented by any vendor.  The suffix mechanism 
-    provides access for vendor extensions which are not yet added to 
-    the ICD.
-
-    3: How will the ICD handle a NULL cl_platform_id?
-
-    RESOLVED: The NULL platform is not supported by the ICD.
-
-    4. There exists no mechanism to unload the ICD, should there be
-    one?
-
-    RESOLVED: As there is no standard mechanism for unloading a vendor
-    implementation, do not add one for the ICD.
-
-Sample Code
-    
-    The official source for the ICD loader is available on github, here:
-        https://github.com/KhronosGroup/OpenCL-ICD-Loader
-
-    An abbreviated version of the _cl_icd_dispatch structure is
-    as follows.
-
-    struct _cl_icd_dispatch
-    {
-        CL_API_ENTRY cl_int (CL_API_CALL *clGetPlatformIDs)(
-            cl_uint          num_entries,
-            cl_platform_id * platforms,
-            cl_uint *        num_platforms) CL_API_SUFFIX__VERSION_1_0;
-
-        CL_API_ENTRY cl_int (CL_API_CALL *clGetPlatformInfo)(
-            cl_platform_id   platform, 
-            cl_platform_info param_name,
-            size_t           param_value_size, 
-            void *           param_value,
-            size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-        /* ...continues... */
-    }
-
-    As an example of this mechanism in action, consider the function
-    clCreateCommandQueue.  The implementation of this function in the
-    ICD Loader is as follows
-
-    cl_command_queue clCreateCommandQueue(
-        cl_context                     context, 
-        cl_device_id                   device, 
-        cl_command_queue_properties    properties,
-        cl_int *                       errcode_ret) 
-    {
-        return context->dispatch->clCreateCommandQueue(
-            context, 
-            device, 
-            properties,
-            errcode_ret);
-    }
-
-Conformance Tests
-
-    A vendor supports cl_khr_icd if conformance may be run successfully
-    on their platform through the ICD Loader.
-
-Revision History
-
-    Version 8, 2017/08/08 (Ben Ashbaugh) - updated to include HKR
-    as a scanned registry key for Windows, added github link for ICD
-    loader source code.
-
-    Version 7, 2010/03/02 (Jon Leech) - fix typos for
-    clGetExtensionFunctionAddress (public bug 258), reflow a paragraph
-    with very long lines.
-
-    Version 6, 2010/02/17 (Jon Leech) - remove URLs pointing to
-    resources available only to Khronos members, since this
-    was causing confusion to outside readers of the extension
-    spec.
-
-    Version 5, 2009/12/08 (Christopher Cameron) - Clarify language
-    of ICD Loader versus Vendor ICD, update Linux enumeration to
-    reflect bug and email discussion.
-
-    Version 4, 2009/11/10 (Christopher Cameron) - Fix typos.
-
-    Version 3, 2009/11/05 (Christopher Cameron) - update Linux and
-    Windows enumeration to use directories and registry values.
-    Change suffix information to come from platform query.  Add 
-    error code for clGetPlatformIDs when there are no platforms.
-
-    Version 2, 2009/11/02 (Christopher Cameron) - update Linux 
-    enumeration to use INI file format.  Some cleanup of sections.
-    Update on ICD unload function.
-
-    Version 1, 2009/09/20 (Christopher Cameron) - initial extension
-    specification (see also Khronos bug 5391)
+https://github.com/KhronosGroup/OpenCL-Docs/blob/master/ext/cl_khr_icd.txt
\ No newline at end of file
