Merge branch 'master' into master
diff --git a/.appveyor.yml b/.appveyor.yml
index 6b4f86a..39121a2 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -15,6 +15,6 @@
   - cmake -DOPENCL_ICD_LOADER_HEADERS_DIR=inc/OpenCL-Headers -H. -Bbuild -A%PLATFORM%
 
 build:
-  project: build\OPENCL_ICD_LOADER.sln
+  project: build\OpenCL-ICD-Loader.sln
   parallel: true
   verbosity: normal
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 66a5269..1cf4013 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
-cmake_minimum_required (VERSION 2.8.11)
+cmake_minimum_required (VERSION 3.1)
 
-project (OPENCL_ICD_LOADER)
+project (OpenCL-ICD-Loader VERSION 1.2)
 include (GNUInstallDirs)
 find_package (Threads REQUIRED)
 
@@ -34,6 +34,11 @@
 # advance. Use it with discretion.
 option (BUILD_SHARED_LIBS "Build shared libs" ON)
 
+# This option enables support for OpenCL 3.0 Provisional in the ICD loader.  It
+# is currently off by default while the specification is provisional, as it may
+# change.
+option (ENABLE_OPENCL30_PROVISIONAL "Enable 3.0 provisional entry points" OFF)
+
 include(CheckFunctionExists)
 check_function_exists(secure_getenv HAVE_SECURE_GETENV)
 check_function_exists(__secure_getenv HAVE___SECURE_GETENV)
@@ -45,11 +50,24 @@
     loader/icd.h
     loader/icd_dispatch.c
     loader/icd_dispatch.h
+    loader/icd_dispatch_generated.c
     loader/icd_envvars.h
     loader/icd_platform.h)
 
 if (WIN32)
+    # By default don't include OpenCL 3.0 symbol definitions (i.e. comment them
+    # out), but include them for OpenCL 3.0 builds.  Once the symbols are no
+    # longer provisional then they may be included unconditionally.
+    set(ENABLE_OPENCL30_SYMBOLS ";")
+    if (ENABLE_OPENCL30_PROVISIONAL)
+      set(ENABLE_OPENCL30_SYMBOLS "")
+    endif ()
+    configure_file(
+        ${CMAKE_CURRENT_SOURCE_DIR}/loader/windows/OpenCL.def.in
+        ${CMAKE_CURRENT_BINARY_DIR}/loader/windows/OpenCL.def)
+
     list (APPEND OPENCL_ICD_LOADER_SOURCES 
+        loader/windows/adapter.h
         loader/windows/icd_windows.c
         loader/windows/icd_windows.h
         loader/windows/icd_windows_dxgk.c
@@ -57,7 +75,9 @@
         loader/windows/icd_windows_envvars.c
         loader/windows/icd_windows_hkr.c
         loader/windows/icd_windows_hkr.h
-        loader/windows/OpenCL.def
+        loader/windows/icd_windows_apppackage.cpp
+        loader/windows/icd_windows_apppackage.h
+        ${CMAKE_CURRENT_BINARY_DIR}/loader/windows/OpenCL.def
         loader/windows/OpenCL.rc)
     # Only add the DXSDK include directory if the environment variable is
     # defined.  Since the DXSDK has merged into the Windows SDK, this is
@@ -67,37 +87,38 @@
         include_directories ($ENV{WDK}/km)
     endif ()
 else ()
+    # By default don't include OpenCL 3.0 symbol definitions (i.e. comment them
+    # out), but include them for OpenCL 3.0 builds.  Once the symbols are no
+    # longer provisional then they may be included unconditionally.
+    set(ENABLE_OPENCL30_SYMBOLS_START "/*")
+    set(ENABLE_OPENCL30_SYMBOLS_END "*/")
+    if (ENABLE_OPENCL30_PROVISIONAL)
+      set(ENABLE_OPENCL30_SYMBOLS_START "")
+      set(ENABLE_OPENCL30_SYMBOLS_END "")
+    endif ()
+    configure_file(
+        ${CMAKE_CURRENT_SOURCE_DIR}/loader/linux/icd_exports.map.in
+        ${CMAKE_CURRENT_BINARY_DIR}/loader/linux/icd_exports.map)
+
     list (APPEND OPENCL_ICD_LOADER_SOURCES
         loader/linux/icd_linux.c
         loader/linux/icd_linux_envvars.c
-        loader/linux/icd_exports.map)
+        ${CMAKE_CURRENT_BINARY_DIR}/loader/linux/icd_exports.map)
 endif ()
 
 set (OPENCL_ICD_LOADER_HEADERS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/inc CACHE PATH "Path to OpenCL Headers")
 
 add_library (OpenCL ${OPENCL_ICD_LOADER_SOURCES})
 set_target_properties (OpenCL PROPERTIES VERSION "1.2" SOVERSION "1")
+target_include_directories(OpenCL SYSTEM PUBLIC ${OPENCL_ICD_LOADER_HEADERS_DIR})
 
 if (WIN32)
-    target_link_libraries (OpenCL cfgmgr32.lib)
 
-    if(DEFINED ENV{WDKContentRoot})
-    	file(GLOB D3DKMT_HEADER "$ENV{WDKContentRoot}/Include/*/km/d3dkmthk.h")
-    else()
-        file(GLOB D3DKMT_HEADER "$ENV{HOMEDRIVE}/Program Files */Windows Kits/10/Include/*/km/d3dkmthk.h")
-    endif()
+    target_link_libraries (OpenCL cfgmgr32.lib runtimeobject.lib)
 
-    if(D3DKMT_HEADER)
-    	list(GET D3DKMT_HEADER -1 LATEST_D3DKMT_HEADER)
-        get_filename_component(WDK_DIRECTORY ${LATEST_D3DKMT_HEADER} DIRECTORY)
-        get_filename_component(WDK_DIRECTORY ${WDK_DIRECTORY} DIRECTORY)
-        message(STATUS "Found the Windows WDK in: ${WDK_DIRECTORY}")
-        target_compile_definitions(OpenCL PRIVATE OPENCL_ICD_LOADER_REQUIRE_WDK)
-        target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/um)
-        target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/km)
-        target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/shared)
-    else()
-        message(FATAL_ERROR "The Windows WDK was not found. Consider disabling OPENCL_ICD_LOADER_REQUIRE_WDK. Aborting.")
+    option (OPENCL_ICD_LOADER_DISABLE_OPENCLON12 "Disable support for OpenCLOn12. Support for OpenCLOn12 should only be disabled when building an import lib to link with, and must be enabled when building an ICD loader for distribution!" OFF)
+    if (OPENCL_ICD_LOADER_DISABLE_OPENCLON12)
+        target_compile_definitions(OpenCL PRIVATE OPENCL_ICD_LOADER_DISABLE_OPENCLON12)
     endif()
 
     if(NOT USE_DYNAMIC_VCXX_RUNTIME)
@@ -114,19 +135,27 @@
     if (APPLE)
         target_link_libraries (OpenCL ${CMAKE_THREAD_LIBS_INIT})
     else ()
-        set_target_properties (OpenCL PROPERTIES LINK_FLAGS "-Wl,--version-script -Wl,${CMAKE_CURRENT_SOURCE_DIR}/loader/linux/icd_exports.map")
+        set_target_properties (OpenCL PROPERTIES LINK_FLAGS "-Wl,--version-script -Wl,${CMAKE_CURRENT_BINARY_DIR}/loader/linux/icd_exports.map")
         target_link_libraries (OpenCL ${CMAKE_THREAD_LIBS_INIT})
     endif ()
 endif ()
 
 include_directories (${OPENCL_ICD_LOADER_HEADERS_DIR})
-add_definitions (-DCL_TARGET_OPENCL_VERSION=220)
+if (ENABLE_OPENCL30_PROVISIONAL)
+  add_definitions (-DCL_TARGET_OPENCL_VERSION=300)
+else()
+  add_definitions (-DCL_TARGET_OPENCL_VERSION=220)
+endif()
 
 target_include_directories (OpenCL PRIVATE ${CMAKE_CURRENT_BINARY_DIR} loader)
 target_link_libraries (OpenCL ${CMAKE_DL_LIBS})
 
-include (CTest)
-if (BUILD_TESTING)
+option (OPENCL_ICD_LOADER_BUILD_TESTING "Enable support for OpenCL ICD Loader testing." OFF)
+
+if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_ICD_LOADER_BUILD_TESTING)
+    include(CTest)
+endif()
+if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_ICD_LOADER_BUILD_TESTING) AND BUILD_TESTING)
     add_subdirectory (test)
 endif()
 
diff --git a/README.md b/README.md
index 827f07c..9721bbc 100644
--- a/README.md
+++ b/README.md
@@ -30,15 +30,13 @@
 To use system OpenCL Headers, please specify the OpenCL Header location using the CMake variable `OPENCL_ICD_LOADER_HEADERS_DIR`.
 By default, the OpenCL ICD Loader will look for OpenCL Headers in the `inc` directory.
 
-OpenCL ICD Loader on Windows now requires the Windows Driver Kit (WDK). 
-While WDK headers are sufficient to be able to build OpenCL ICD Loader, you will need WDK libraries for it to function correctly. 
-Not having WDK installed may prevent the OpenCL ICD Loader from enumerating some OpenCL implementations on latest Windows versions.
-So, we advise that you install recent Windows WDK currently available at -
-* https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
-
 The OpenCL ICD Loader uses CMake for its build system.
 If CMake is not provided by your build system or OS package manager, please consult the [CMake website](https://cmake.org).
 
+The Windows OpenCL ICD Loader requires the Windows SDK to check for and enumerate the OpenCLOn12 ICD.
+An OpenCL ICD Loader can be built without a dependency on the Windows SDK using the CMake variable `OPENCL_ICD_LOADER_DISABLE_OPENCLON12`.
+This variable should only be used when building an import lib to link with, and must be enabled when building an OpenCL ICD Loader for distribution!
+
 ### Build and Install Directories
 
 A common convention is to place the `build` directory in the top directory of the repository and to place the `install` directory as a child of the `build` directory.
diff --git a/loader/icd_dispatch.c b/loader/icd_dispatch.c
index df967cb..878f6e0 100644
--- a/loader/icd_dispatch.c
+++ b/loader/icd_dispatch.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2019 The Khronos Group Inc.
+ * Copyright (c) 2012-2020 The Khronos Group Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,11 +21,90 @@
 #include <stdlib.h>
 #include <string.h>
 
-// Platform APIs
-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
+static void* khrIcdGetExtensionFunctionAddress(const char* function_name)
+{
+// Most extensions, including multi-vendor KHR and EXT extensions,
+// do not need to be ICD-aware and do not require any ICD loader
+// modifications.  The KHR and EXT extensions below were added for
+// backwards compatibility only.
+#define KHR_ICD_CHECK_EXTENSION_FUNCTION(name)                                 \
+    do                                                                         \
+    {                                                                          \
+        if (!strcmp(function_name, #name))                                     \
+        {                                                                      \
+            return (void*)(size_t)&name;                                       \
+        }                                                                      \
+    } while (0)
+
+    // Functions supporting the creation of OpenCL Memory Objects
+    // from OpenGL Objects (cl_apple_gl_sharing, cl_khr_gl_sharing)
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLBuffer);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLTexture);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLTexture2D);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLTexture3D);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromGLRenderbuffer);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetGLObjectInfo);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetGLTextureInfo);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireGLObjects);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseGLObjects);
+
+    // cl_khr_gl_sharing
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetGLContextInfoKHR);
+
+    // cl_khr_gl_event
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateEventFromGLsyncKHR);
+
+#if defined(_WIN32)
+    // cl_khr_d3d10_sharing
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetDeviceIDsFromD3D10KHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D10BufferKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D10Texture2DKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D10Texture3DKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireD3D10ObjectsKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseD3D10ObjectsKHR);
+    // cl_khr_d3d11_sharing
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetDeviceIDsFromD3D11KHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D11BufferKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D11Texture2DKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromD3D11Texture3DKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireD3D11ObjectsKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseD3D11ObjectsKHR);
+    // cl_khr_dx9_media_sharing
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetDeviceIDsFromDX9MediaAdapterKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromDX9MediaSurfaceKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireDX9MediaSurfacesKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseDX9MediaSurfacesKHR);
+#endif
+
+    // cl_ext_device_fission
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateSubDevicesEXT);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clRetainDeviceEXT);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clReleaseDeviceEXT);
+
+    // cl_khr_egl_image
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateFromEGLImageKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueAcquireEGLObjectsKHR);
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clEnqueueReleaseEGLObjectsKHR);
+
+    // cl_khr_egl_event
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clCreateEventFromEGLSyncKHR);
+
+    // cl_khr_sub_groups
+    KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetKernelSubGroupInfoKHR);
+
+#undef KHR_ICD_CHECK_EXTENSION_FUNCTION
+
+    return NULL;
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+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
 {
     KHRicdVendor* vendor = NULL;
     cl_uint i;
@@ -42,11 +121,11 @@
         return CL_INVALID_VALUE;
     }
     // set num_platforms to 0 and set all platform pointers to NULL
-    if (num_platforms) 
+    if (num_platforms)
     {
         *num_platforms = 0;
     }
-    for (i = 0; i < num_entries && platforms; ++i) 
+    for (i = 0; i < num_entries && platforms; ++i)
     {
         platforms[i] = NULL;
     }
@@ -71,1364 +150,62 @@
     return CL_SUCCESS;
 }
 
-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
+CL_API_ENTRY void* CL_API_CALL clGetExtensionFunctionAddress(
+    const char* function_name) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
 {
-    // initialize the platforms (in case they have not been already)
-    khrIcdInitialize();
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);    
-    return platform->dispatch->clGetPlatformInfo(
-        platform,
-        param_name, 
-        param_value_size, 
-        param_value, 
-        param_value_size_ret);
-}
-
-// Device APIs
-CL_API_ENTRY cl_int CL_API_CALL
-clGetDeviceIDs(cl_platform_id   platform,
-               cl_device_type   device_type, 
-               cl_uint          num_entries, 
-               cl_device_id *   devices, 
-               cl_uint *        num_devices) CL_API_SUFFIX__VERSION_1_0
-{
-    // initialize the platforms (in case they have not been already)
-    khrIcdInitialize();
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);   
-    return platform->dispatch->clGetDeviceIDs(
-        platform,
-        device_type, 
-        num_entries, 
-        devices, 
-        num_devices);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetDeviceInfo(
-    cl_device_id    device,
-    cl_device_info  param_name, 
-    size_t          param_value_size, 
-    void *          param_value,
-    size_t *        param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return device->dispatch->clGetDeviceInfo(
-        device,
-        param_name, 
-        param_value_size, 
-        param_value,
-        param_value_size_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clCreateSubDevices(cl_device_id                         in_device,
-                   const cl_device_partition_property * properties,
-                   cl_uint                              num_entries,
-                   cl_device_id *                       out_devices,
-                   cl_uint *                            num_devices) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(in_device, CL_INVALID_DEVICE);
-    return in_device->dispatch->clCreateSubDevices(
-        in_device,
-        properties,
-        num_entries,
-        out_devices,
-        num_devices);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainDevice(cl_device_id device) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return device->dispatch->clRetainDevice(device);
-}
-    
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseDevice(cl_device_id device) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return device->dispatch->clReleaseDevice(device);
-}
-
-// Context APIs  
-CL_API_ENTRY cl_context CL_API_CALL
-clCreateContext(const cl_context_properties * properties,
-                cl_uint                 num_devices,
-                const cl_device_id *    devices,
-                void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *),
-                void *                  user_data,
-                cl_int *                errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    // initialize the platforms (in case they have not been already)
-    khrIcdInitialize();
-    if (!num_devices || !devices) 
-    {
-        if (errcode_ret) 
-        {
-            *errcode_ret = CL_INVALID_VALUE;
-        }
-        return NULL;
-    }
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(devices[0], CL_INVALID_DEVICE);
-    return devices[0]->dispatch->clCreateContext(
-        properties,
-        num_devices,
-        devices,
-        pfn_notify,
-        user_data,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_context CL_API_CALL
-clCreateContextFromType(const cl_context_properties * properties,
-                        cl_device_type          device_type,
-                        void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *),
-                        void *                  user_data,
-                        cl_int *                errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    cl_platform_id platform = NULL;
-
-    // initialize the platforms (in case they have not been already)
-    khrIcdInitialize();
-
-    // determine the platform to use from the properties specified
-    khrIcdContextPropertiesGetPlatform(properties, &platform);
-
-    // validate the platform handle and dispatch
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(platform, CL_INVALID_PLATFORM);
-    return platform->dispatch->clCreateContextFromType(
-        properties,
-        device_type,
-        pfn_notify,
-        user_data,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainContext(cl_context context) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clRetainContext(context);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseContext(cl_context context) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clReleaseContext(context);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetContextInfo(cl_context         context, 
-                 cl_context_info    param_name, 
-                 size_t             param_value_size, 
-                 void *             param_value, 
-                 size_t *           param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clGetContextInfo(
-        context, 
-        param_name, 
-        param_value_size, 
-        param_value, 
-        param_value_size_ret);
-}
-
-// Command Queue APIs
-CL_API_ENTRY cl_command_queue CL_API_CALL
-clCreateCommandQueue(cl_context                     context, 
-                     cl_device_id                   device, 
-                     cl_command_queue_properties    properties,
-                     cl_int *                       errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateCommandQueue(
-        context, 
-        device, 
-        properties,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainCommandQueue(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clRetainCommandQueue(command_queue);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseCommandQueue(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clReleaseCommandQueue(command_queue);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetCommandQueueInfo(cl_command_queue      command_queue,
-                      cl_command_queue_info param_name,
-                      size_t                param_value_size,
-                      void *                param_value,
-                      size_t *              param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clGetCommandQueueInfo(
-        command_queue,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-// Memory Object APIs
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateBuffer(cl_context   context,
-               cl_mem_flags flags,
-               size_t       size,
-               void *       host_ptr,
-               cl_int *     errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateBuffer(
-        context,
-        flags,
-        size,
-        host_ptr,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateImage(cl_context              context,
-                            cl_mem_flags            flags,
-                            const cl_image_format * image_format,
-                            const cl_image_desc *   image_desc,
-                            void *                  host_ptr,
-                            cl_int *                errcode_ret) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateImage(
-        context,
-        flags,
-        image_format,
-        image_desc,
-        host_ptr,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainMemObject(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
-    return memobj->dispatch->clRetainMemObject(memobj);
-}
-
-
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseMemObject(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
-    return memobj->dispatch->clReleaseMemObject(memobj);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetSupportedImageFormats(cl_context           context,
-                           cl_mem_flags         flags,
-                           cl_mem_object_type   image_type,
-                           cl_uint              num_entries,
-                           cl_image_format *    image_formats,
-                           cl_uint *            num_image_formats) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clGetSupportedImageFormats(
-        context,
-        flags,
-        image_type,
-        num_entries,
-        image_formats,
-        num_image_formats);
-}
-                                    
-CL_API_ENTRY cl_int CL_API_CALL
-clGetMemObjectInfo(cl_mem           memobj,
-                   cl_mem_info      param_name, 
-                   size_t           param_value_size,
-                   void *           param_value,
-                   size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
-    return memobj->dispatch->clGetMemObjectInfo(
-        memobj,
-        param_name, 
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetImageInfo(cl_mem           image,
-               cl_image_info    param_name, 
-               size_t           param_value_size,
-               void *           param_value,
-               size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(image, CL_INVALID_MEM_OBJECT);
-    return image->dispatch->clGetImageInfo(
-        image,
-        param_name, 
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-// Sampler APIs
-CL_API_ENTRY cl_sampler CL_API_CALL
-clCreateSampler(cl_context          context,
-                cl_bool             normalized_coords, 
-                cl_addressing_mode  addressing_mode, 
-                cl_filter_mode      filter_mode,
-                cl_int *            errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateSampler(
-        context,
-        normalized_coords, 
-        addressing_mode, 
-        filter_mode,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainSampler(cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(sampler, CL_INVALID_SAMPLER);
-    return sampler->dispatch->clRetainSampler(sampler);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseSampler(cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(sampler, CL_INVALID_SAMPLER);
-    return sampler->dispatch->clReleaseSampler(sampler);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetSamplerInfo(cl_sampler         sampler,
-                 cl_sampler_info    param_name,
-                 size_t             param_value_size,
-                 void *             param_value,
-                 size_t *           param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(sampler, CL_INVALID_SAMPLER);
-    return sampler->dispatch->clGetSamplerInfo(
-        sampler,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-                            
-// Program Object APIs
-CL_API_ENTRY cl_program CL_API_CALL
-clCreateProgramWithSource(cl_context        context,
-                          cl_uint           count,
-                          const char **     strings,
-                          const size_t *    lengths,
-                          cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateProgramWithSource(
-        context,
-        count,
-        strings,
-        lengths,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_program CL_API_CALL
-clCreateProgramWithBinary(cl_context                     context,
-                          cl_uint                        num_devices,
-                          const cl_device_id *           device_list,
-                          const size_t *                 lengths,
-                          const unsigned char **         binaries,
-                          cl_int *                       binary_status,
-                          cl_int *                       errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateProgramWithBinary(
-        context,
-        num_devices,
-        device_list,
-        lengths,
-        binaries,
-        binary_status,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_program CL_API_CALL
-clCreateProgramWithBuiltInKernels(cl_context            context,
-                                  cl_uint               num_devices,
-                                  const cl_device_id *  device_list,
-                                  const char *          kernel_names,
-                                  cl_int *              errcode_ret) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateProgramWithBuiltInKernels(
-        context,
-        num_devices,
-        device_list,
-        kernel_names,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainProgram(cl_program program) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clRetainProgram(program);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseProgram(cl_program program) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clReleaseProgram(program);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clBuildProgram(cl_program           program,
-               cl_uint              num_devices,
-               const cl_device_id * device_list,
-               const char *         options, 
-               void (CL_CALLBACK *pfn_notify)(cl_program program, void * user_data),
-               void *               user_data) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clBuildProgram(
-        program,
-        num_devices,
-        device_list,
-        options, 
-        pfn_notify,
-        user_data); 
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clCompileProgram(cl_program           program,
-                 cl_uint              num_devices,
-                 const cl_device_id * device_list,
-                 const char *         options, 
-                 cl_uint              num_input_headers,
-                 const cl_program *   input_headers,
-                 const char **        header_include_names,
-                 void (CL_CALLBACK *  pfn_notify)(cl_program program, void * user_data),
-                 void *               user_data) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clCompileProgram(
-        program,
-        num_devices,
-        device_list,
-        options, 
-        num_input_headers,
-        input_headers,
-        header_include_names,
-        pfn_notify,
-        user_data); 
-}
-
-CL_API_ENTRY cl_program CL_API_CALL
-clLinkProgram(cl_context           context,
-              cl_uint              num_devices,
-              const cl_device_id * device_list,
-              const char *         options,
-              cl_uint              num_input_programs,
-              const cl_program *   input_programs,
-              void (CL_CALLBACK *  pfn_notify)(cl_program program, void * user_data),
-              void *               user_data,
-              cl_int *             errcode_ret) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clLinkProgram(
-        context,
-        num_devices,
-        device_list,
-        options, 
-        num_input_programs,
-        input_programs,
-        pfn_notify,
-        user_data,
-        errcode_ret); 
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clSetProgramSpecializationConstant(cl_program  program,
-                                   cl_uint     spec_id,
-                                   size_t      spec_size,
-                                   const void* spec_value) CL_API_SUFFIX__VERSION_2_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clSetProgramSpecializationConstant(
-        program,
-        spec_id,
-        spec_size,
-        spec_value); 
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clSetProgramReleaseCallback(cl_program  program,
-                            void (CL_CALLBACK * pfn_notify)(cl_program program, void * user_data),
-                            void *              user_data) CL_API_SUFFIX__VERSION_2_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clSetProgramReleaseCallback(
-        program,
-        pfn_notify,
-        user_data); 
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clUnloadPlatformCompiler(cl_platform_id platform) CL_API_SUFFIX__VERSION_1_2
-{
-    // initialize the platforms (in case they have not been already)
-    khrIcdInitialize();
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);    
-    return platform->dispatch->clUnloadPlatformCompiler(platform);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetProgramInfo(cl_program         program,
-                 cl_program_info    param_name,
-                 size_t             param_value_size,
-                 void *             param_value,
-                 size_t *           param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clGetProgramInfo(
-        program,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetProgramBuildInfo(cl_program            program,
-                      cl_device_id          device,
-                      cl_program_build_info param_name,
-                      size_t                param_value_size,
-                      void *                param_value,
-                      size_t *              param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clGetProgramBuildInfo(
-        program,
-        device,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-                            
-// Kernel Object APIs
-CL_API_ENTRY cl_kernel CL_API_CALL
-clCreateKernel(cl_program      program,
-               const char *    kernel_name,
-               cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clCreateKernel(
-        program,
-        kernel_name,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clCreateKernelsInProgram(cl_program     program,
-                         cl_uint        num_kernels,
-                         cl_kernel *    kernels,
-                         cl_uint *      num_kernels_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
-    return program->dispatch->clCreateKernelsInProgram(
-        program,
-        num_kernels,
-        kernels,
-        num_kernels_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainKernel(cl_kernel    kernel) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    return kernel->dispatch->clRetainKernel(kernel);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseKernel(cl_kernel   kernel) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    return kernel->dispatch->clReleaseKernel(kernel);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clSetKernelArg(cl_kernel    kernel,
-               cl_uint      arg_index,
-               size_t       arg_size,
-               const void * arg_value) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    return kernel->dispatch->clSetKernelArg(
-        kernel,
-        arg_index,
-        arg_size,
-        arg_value);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetKernelInfo(cl_kernel       kernel,
-                cl_kernel_info  param_name,
-                size_t          param_value_size,
-                void *          param_value,
-                size_t *        param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    return kernel->dispatch->clGetKernelInfo(
-        kernel,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetKernelArgInfo(cl_kernel       kernel,
-                   cl_uint         arg_indx,
-                   cl_kernel_arg_info  param_name,
-                   size_t          param_value_size,
-                   void *          param_value,
-                   size_t *        param_value_size_ret) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    return kernel->dispatch->clGetKernelArgInfo(
-        kernel,
-        arg_indx,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetKernelWorkGroupInfo(cl_kernel                  kernel,
-                         cl_device_id               device,
-                         cl_kernel_work_group_info  param_name,
-                         size_t                     param_value_size,
-                         void *                     param_value,
-                         size_t *                   param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    return kernel->dispatch->clGetKernelWorkGroupInfo(
-        kernel,
-        device,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-// Event Object APIs
-CL_API_ENTRY cl_int CL_API_CALL
-clWaitForEvents(cl_uint             num_events,
-                const cl_event *    event_list) CL_API_SUFFIX__VERSION_1_0
-{
-    if (!num_events || !event_list) 
-    {
-        return CL_INVALID_VALUE;        
-    }
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event_list[0], CL_INVALID_EVENT);
-    return event_list[0]->dispatch->clWaitForEvents(
-        num_events,
-        event_list);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetEventInfo(cl_event         event,
-               cl_event_info    param_name,
-               size_t           param_value_size,
-               void *           param_value,
-               size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
-    return event->dispatch->clGetEventInfo(
-        event,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-                            
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainEvent(cl_event event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
-    return event->dispatch->clRetainEvent(event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseEvent(cl_event event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
-    return event->dispatch->clReleaseEvent(event);
-}
-
-// Profiling APIs
-CL_API_ENTRY cl_int CL_API_CALL
-clGetEventProfilingInfo(cl_event            event,
-                        cl_profiling_info   param_name,
-                        size_t              param_value_size,
-                        void *              param_value,
-                        size_t *            param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
-    return event->dispatch->clGetEventProfilingInfo(
-        event,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-                                
-// Flush and Finish APIs
-CL_API_ENTRY cl_int CL_API_CALL
-clFlush(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clFlush(command_queue);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clFinish(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clFinish(command_queue);
-}
-
-// Enqueued Commands APIs
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueReadBuffer(cl_command_queue    command_queue,
-                    cl_mem              buffer,
-                    cl_bool             blocking_read,
-                    size_t              offset,
-                    size_t              cb, 
-                    void *              ptr,
-                    cl_uint             num_events_in_wait_list,
-                    const cl_event *    event_wait_list,
-                    cl_event *          event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueReadBuffer(
-        command_queue,
-        buffer,
-        blocking_read,
-        offset,
-        cb, 
-        ptr,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-                            
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueReadBufferRect(
-    cl_command_queue command_queue,
-    cl_mem buffer,
-    cl_bool blocking_read,
-    const size_t * buffer_origin,
-    const size_t * host_origin, 
-    const size_t * region,
-    size_t buffer_row_pitch,
-    size_t buffer_slice_pitch,
-    size_t host_row_pitch,
-    size_t host_slice_pitch,                        
-    void * ptr,
-    cl_uint num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event * event) CL_API_SUFFIX__VERSION_1_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueReadBufferRect(
-        command_queue,
-        buffer,
-        blocking_read,
-        buffer_origin,
-        host_origin, 
-        region,
-        buffer_row_pitch,
-        buffer_slice_pitch,
-        host_row_pitch,
-        host_slice_pitch,                        
-        ptr,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueWriteBuffer(cl_command_queue   command_queue, 
-                     cl_mem             buffer, 
-                     cl_bool            blocking_write, 
-                     size_t             offset, 
-                     size_t             cb, 
-                     const void *       ptr, 
-                     cl_uint            num_events_in_wait_list, 
-                     const cl_event *   event_wait_list, 
-                     cl_event *         event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueWriteBuffer(
-        command_queue, 
-        buffer, 
-        blocking_write, 
-        offset, 
-        cb, 
-        ptr, 
-        num_events_in_wait_list, 
-        event_wait_list, 
-        event);
-}
-                            
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueWriteBufferRect(
-    cl_command_queue command_queue,
-    cl_mem buffer,
-    cl_bool blocking_read,
-    const size_t * buffer_origin,
-    const size_t * host_origin, 
-    const size_t * region,
-    size_t buffer_row_pitch,
-    size_t buffer_slice_pitch,
-    size_t host_row_pitch,
-    size_t host_slice_pitch,                        
-    const void * ptr,
-    cl_uint num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event * event) CL_API_SUFFIX__VERSION_1_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueWriteBufferRect(
-        command_queue,
-        buffer,
-        blocking_read,
-        buffer_origin,
-        host_origin, 
-        region,
-        buffer_row_pitch,
-        buffer_slice_pitch,
-        host_row_pitch,
-        host_slice_pitch,                        
-        ptr,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueFillBuffer(cl_command_queue   command_queue,
-                    cl_mem             buffer, 
-                    const void *       pattern, 
-                    size_t             pattern_size, 
-                    size_t             offset, 
-                    size_t             cb, 
-                    cl_uint            num_events_in_wait_list, 
-                    const cl_event *   event_wait_list, 
-                    cl_event *         event) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueFillBuffer(
-        command_queue, 
-        buffer,
-        pattern, 
-        pattern_size,
-        offset,
-        cb, 
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueCopyBuffer(cl_command_queue    command_queue, 
-                    cl_mem              src_buffer,
-                    cl_mem              dst_buffer, 
-                    size_t              src_offset,
-                    size_t              dst_offset,
-                    size_t              cb, 
-                    cl_uint             num_events_in_wait_list,
-                    const cl_event *    event_wait_list,
-                    cl_event *          event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueCopyBuffer(
-        command_queue, 
-        src_buffer,
-        dst_buffer, 
-        src_offset,
-        dst_offset,
-        cb, 
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueCopyBufferRect(
-    cl_command_queue command_queue, 
-    cl_mem src_buffer,
-    cl_mem dst_buffer, 
-    const size_t * src_origin,
-    const size_t * dst_origin,
-    const size_t * region, 
-    size_t src_row_pitch,
-    size_t src_slice_pitch,
-    size_t dst_row_pitch,
-    size_t dst_slice_pitch,
-    cl_uint num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event * event) CL_API_SUFFIX__VERSION_1_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueCopyBufferRect(
-        command_queue, 
-        src_buffer,
-        dst_buffer, 
-        src_origin,
-        dst_origin,
-        region, 
-        src_row_pitch,
-        src_slice_pitch,
-        dst_row_pitch,
-        dst_slice_pitch,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueReadImage(cl_command_queue     command_queue,
-                   cl_mem               image,
-                   cl_bool              blocking_read, 
-                   const size_t *       origin,
-                   const size_t *       region,
-                   size_t               row_pitch,
-                   size_t               slice_pitch, 
-                   void *               ptr,
-                   cl_uint              num_events_in_wait_list,
-                   const cl_event *     event_wait_list,
-                   cl_event *           event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueReadImage(
-        command_queue,
-        image,
-        blocking_read, 
-        origin,
-        region,
-        row_pitch,
-        slice_pitch, 
-        ptr,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueWriteImage(cl_command_queue    command_queue,
-                    cl_mem              image,
-                    cl_bool             blocking_write, 
-                    const size_t *      origin,
-                    const size_t *      region,
-                    size_t              input_row_pitch,
-                    size_t              input_slice_pitch, 
-                    const void *        ptr,
-                    cl_uint             num_events_in_wait_list,
-                    const cl_event *    event_wait_list,
-                    cl_event *          event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueWriteImage(
-        command_queue,
-        image,
-        blocking_write, 
-        origin,
-        region,
-        input_row_pitch,
-        input_slice_pitch, 
-        ptr,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueFillImage(cl_command_queue   command_queue,
-                   cl_mem             image,
-                   const void *       fill_color,
-                   const size_t       origin[3], 
-                   const size_t       region[3],
-                   cl_uint            num_events_in_wait_list,
-                   const cl_event *   event_wait_list, 
-                   cl_event *         event) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueFillImage(
-        command_queue,
-        image,
-        fill_color, 
-        origin,
-        region, 
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueCopyImage(cl_command_queue     command_queue,
-                   cl_mem               src_image,
-                   cl_mem               dst_image, 
-                   const size_t *       src_origin,
-                   const size_t *       dst_origin,
-                   const size_t *       region, 
-                   cl_uint              num_events_in_wait_list,
-                   const cl_event *     event_wait_list,
-                   cl_event *           event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueCopyImage(
-        command_queue,
-        src_image,
-        dst_image, 
-        src_origin,
-        dst_origin,
-        region, 
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueCopyImageToBuffer(cl_command_queue command_queue,
-                           cl_mem           src_image,
-                           cl_mem           dst_buffer, 
-                           const size_t *   src_origin,
-                           const size_t *   region, 
-                           size_t           dst_offset,
-                           cl_uint          num_events_in_wait_list,
-                           const cl_event * event_wait_list,
-                           cl_event *       event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueCopyImageToBuffer(
-        command_queue,
-        src_image,
-        dst_buffer, 
-        src_origin,
-        region, 
-        dst_offset,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueCopyBufferToImage(cl_command_queue command_queue,
-                           cl_mem           src_buffer,
-                           cl_mem           dst_image, 
-                           size_t           src_offset,
-                           const size_t *   dst_origin,
-                           const size_t *   region, 
-                           cl_uint          num_events_in_wait_list,
-                           const cl_event * event_wait_list,
-                           cl_event *       event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueCopyBufferToImage(
-        command_queue,
-        src_buffer,
-        dst_image, 
-        src_offset,
-        dst_origin,
-        region, 
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY void * CL_API_CALL
-clEnqueueMapBuffer(cl_command_queue command_queue,
-                   cl_mem           buffer,
-                   cl_bool          blocking_map, 
-                   cl_map_flags     map_flags,
-                   size_t           offset,
-                   size_t           cb,
-                   cl_uint          num_events_in_wait_list,
-                   const cl_event * event_wait_list,
-                   cl_event *       event,
-                   cl_int *         errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueMapBuffer(
-        command_queue,
-        buffer,
-        blocking_map, 
-        map_flags,
-        offset,
-        cb,
-        num_events_in_wait_list,
-        event_wait_list,
-        event,
-        errcode_ret);
-}
-
-CL_API_ENTRY void * CL_API_CALL
-clEnqueueMapImage(cl_command_queue  command_queue,
-                  cl_mem            image, 
-                  cl_bool           blocking_map, 
-                  cl_map_flags      map_flags, 
-                  const size_t *    origin,
-                  const size_t *    region,
-                  size_t *          image_row_pitch,
-                  size_t *          image_slice_pitch,
-                  cl_uint           num_events_in_wait_list,
-                  const cl_event *  event_wait_list,
-                  cl_event *        event,
-                  cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueMapImage(
-        command_queue,
-        image, 
-        blocking_map, 
-        map_flags, 
-        origin,
-        region,
-        image_row_pitch,
-        image_slice_pitch,
-        num_events_in_wait_list,
-        event_wait_list,
-        event,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueUnmapMemObject(cl_command_queue command_queue,
-                        cl_mem           memobj,
-                        void *           mapped_ptr,
-                        cl_uint          num_events_in_wait_list,
-                        const cl_event *  event_wait_list,
-                        cl_event *        event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueUnmapMemObject(
-        command_queue,
-        memobj,
-        mapped_ptr,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueMigrateMemObjects(cl_command_queue       command_queue,
-                           cl_uint                num_mem_objects,
-                           const cl_mem *         mem_objects,
-                           cl_mem_migration_flags flags,
-                           cl_uint                num_events_in_wait_list,
-                           const cl_event *       event_wait_list,
-                           cl_event *             event) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueMigrateMemObjects(
-        command_queue,
-        num_mem_objects,
-        mem_objects,
-        flags,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueNDRangeKernel(cl_command_queue command_queue,
-                       cl_kernel        kernel,
-                       cl_uint          work_dim,
-                       const size_t *   global_work_offset,
-                       const size_t *   global_work_size,
-                       const size_t *   local_work_size,
-                       cl_uint          num_events_in_wait_list,
-                       const cl_event * event_wait_list,
-                       cl_event *       event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueNDRangeKernel(
-        command_queue,
-        kernel,
-        work_dim,
-        global_work_offset,
-        global_work_size,
-        local_work_size,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueTask(cl_command_queue  command_queue,
-              cl_kernel         kernel,
-              cl_uint           num_events_in_wait_list,
-              const cl_event *  event_wait_list,
-              cl_event *        event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueTask(
-        command_queue,
-        kernel,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueNativeKernel(cl_command_queue  command_queue,
-                      void (CL_CALLBACK * user_func)(void *), 
-                      void *            args,
-                      size_t            cb_args, 
-                      cl_uint           num_mem_objects,
-                      const cl_mem *    mem_list,
-                      const void **     args_mem_loc,
-                      cl_uint           num_events_in_wait_list,
-                      const cl_event *  event_wait_list,
-                      cl_event *        event) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueNativeKernel(
-        command_queue,
-        user_func, 
-        args,
-        cb_args, 
-        num_mem_objects,
-        mem_list,
-        args_mem_loc,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueMarkerWithWaitList(cl_command_queue  command_queue,
-                            cl_uint           num_events_in_wait_list,
-                            const cl_event *  event_wait_list,
-                            cl_event *        event) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueMarkerWithWaitList(
-        command_queue,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueBarrierWithWaitList(cl_command_queue  command_queue,
-                             cl_uint           num_events_in_wait_list,
-                             const cl_event *  event_wait_list,
-                             cl_event *        event) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueBarrierWithWaitList(
-        command_queue,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
+    void* function_address = NULL;
+    size_t function_name_length = 0;
+    KHRicdVendor* vendor = NULL;
 
-CL_API_ENTRY void * CL_API_CALL
-clGetExtensionFunctionAddressForPlatform(cl_platform_id platform,
-                                         const char *   function_name) CL_API_SUFFIX__VERSION_1_2
-{
     KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(function_name, NULL);
 
     // make sure the ICD is initialized
-    khrIcdInitialize();    
+    khrIcdInitialize();
 
-    // return any ICD-aware extensions
+    // check if this is an ICD-aware extension
+    function_address = khrIcdGetExtensionFunctionAddress(function_name);
+    if (function_address)
+    {
+        return function_address;
+    }
 
-    // Most extensions, including multi-vendor KHR and EXT extensions,
-    // do not need to be ICD-aware and do not require any ICD loader
-    // modifications.  The KHR and EXT extensions below were added for
-    // backwards compatibility only.
-    #define CL_COMMON_EXTENSION_ENTRYPOINT_ADD(name) if (!strcmp(function_name, #name) ) return (void *)(size_t)&name
+    // fall back to vendor extension detection
+    function_name_length = strlen(function_name);
+    for (vendor = khrIcdVendors; vendor; vendor = vendor->next)
+    {
+        size_t vendor_suffix_length = strlen(vendor->suffix);
+        if (vendor_suffix_length <= function_name_length &&
+            vendor_suffix_length > 0)
+        {
+            const char* function_suffix =
+                function_name + function_name_length - vendor_suffix_length;
+            if (!strcmp(function_suffix, vendor->suffix))
+            {
+                return vendor->clGetExtensionFunctionAddress(function_name);
+            }
+        }
+    }
 
-    // Functions supporting the creation of OpenCL Memory Objects
-    // from OpenGL Objects (cl_apple_gl_sharing, cl_khr_gl_sharing)
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLBuffer);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLTexture);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLTexture2D);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLTexture3D);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLRenderbuffer);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetGLObjectInfo);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetGLTextureInfo);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireGLObjects);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseGLObjects);
+    return NULL;
+}
 
-    // cl_khr_gl_sharing
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetGLContextInfoKHR);
+CL_API_ENTRY void* CL_API_CALL clGetExtensionFunctionAddressForPlatform(
+    cl_platform_id platform,
+    const char* function_name) CL_API_SUFFIX__VERSION_1_2
+{
+    void* function_address = NULL;
 
-    // cl_khr_gl_event
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateEventFromGLsyncKHR);
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(function_name, NULL);
 
-#if defined(_WIN32)
-    // cl_khr_d3d10_sharing
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetDeviceIDsFromD3D10KHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D10BufferKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D10Texture2DKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D10Texture3DKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireD3D10ObjectsKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseD3D10ObjectsKHR);
-    // cl_khr_d3d11_sharing
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetDeviceIDsFromD3D11KHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D11BufferKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D11Texture2DKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D11Texture3DKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireD3D11ObjectsKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseD3D11ObjectsKHR);
-    // cl_khr_dx9_media_sharing
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetDeviceIDsFromDX9MediaAdapterKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromDX9MediaSurfaceKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireDX9MediaSurfacesKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseDX9MediaSurfacesKHR);
-#endif
+    // make sure the ICD is initialized
+    khrIcdInitialize();
 
-    // cl_ext_device_fission
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateSubDevicesEXT);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clRetainDeviceEXT);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clReleaseDeviceEXT);
-
-    /* cl_khr_egl_image */
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromEGLImageKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireEGLObjectsKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseEGLObjectsKHR);
-
-    /* cl_khr_egl_event */
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateEventFromEGLSyncKHR);
-
-    /* cl_khr_sub_groups */
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetKernelSubGroupInfoKHR);
-
-    #undef CL_COMMON_EXTENSION_ENTRYPOINT_ADD
+    // check if this is an ICD-aware extension
+    function_address = khrIcdGetExtensionFunctionAddress(function_name);
+    if (function_address)
+    {
+        return function_address;
+    }
 
     // This is not an ICD-aware extension, so call into the implementation
     // to get the extension function address.
@@ -1439,1236 +216,63 @@
         function_name);
 }
 
-// Deprecated APIs
-CL_API_ENTRY cl_int CL_API_CALL
-clSetCommandQueueProperty(cl_command_queue              command_queue,
-                          cl_command_queue_properties   properties, 
-                          cl_bool                       enable,
-                          cl_command_queue_properties * old_properties) CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clSetCommandQueueProperty(
-        command_queue,
-        properties, 
-        enable,
-        old_properties);
-}
-    
-CL_API_ENTRY cl_int CL_API_CALL
-clCreateSubDevicesEXT(
-    cl_device_id in_device,
-    const cl_device_partition_property_ext * partition_properties,
-    cl_uint num_entries,
-    cl_device_id * out_devices,
-    cl_uint * num_devices) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(in_device, CL_INVALID_DEVICE);
-        return in_device->dispatch->clCreateSubDevicesEXT(
-        in_device,
-        partition_properties,
-        num_entries,
-        out_devices,
-        num_devices);
-}
+#ifdef CL_VERSION_3_0
+/* ICD loader entry points should not normally be ifdef'ed, but prevent
+ * OpenCL 3.0 provisional entry points from being in general builds before the
+ * specification is finalized. */
 
-CL_API_ENTRY cl_int CL_API_CALL
-clRetainDeviceEXT(cl_device_id device) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return device->dispatch->clRetainDeviceEXT(device);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clReleaseDeviceEXT(cl_device_id device) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return device->dispatch->clReleaseDeviceEXT(device);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateImage2D(cl_context              context,
-                cl_mem_flags            flags,
-                const cl_image_format * image_format,
-                size_t                  image_width,
-                size_t                  image_height,
-                size_t                  image_row_pitch, 
-                void *                  host_ptr,
-                cl_int *                errcode_ret) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+CL_API_ENTRY cl_mem CL_API_CALL clCreateBufferWithProperties(
+    cl_context context,
+    const cl_mem_properties* properties,
+    cl_mem_flags flags,
+    size_t size,
+    void* host_ptr,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_3_0
 {
     KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateImage2D(
+    return context->dispatch->clCreateBufferWithProperties(
         context,
+        properties,
         flags,
-        image_format,
-        image_width,
-        image_height,
-        image_row_pitch, 
+        size,
         host_ptr,
         errcode_ret);
 }
 
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateImage3D(cl_context              context,
-                cl_mem_flags            flags,
-                const cl_image_format * image_format,
-                size_t                  image_width, 
-                size_t                  image_height,
-                size_t                  image_depth, 
-                size_t                  image_row_pitch, 
-                size_t                  image_slice_pitch, 
-                void *                  host_ptr,
-                cl_int *                errcode_ret) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+CL_API_ENTRY cl_mem CL_API_CALL clCreateImageWithProperties(
+    cl_context context,
+    const cl_mem_properties* properties,
+    cl_mem_flags flags,
+    const cl_image_format* image_format,
+    const cl_image_desc* image_desc,
+    void* host_ptr,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_3_0
 {
     KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateImage3D(
+    return context->dispatch->clCreateImageWithProperties(
         context,
+        properties,
         flags,
         image_format,
-        image_width, 
-        image_height,
-        image_depth, 
-        image_row_pitch, 
-        image_slice_pitch, 
+        image_desc,
         host_ptr,
         errcode_ret);
 }
 
-CL_API_ENTRY cl_int CL_API_CALL
-clUnloadCompiler(void) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-    return CL_SUCCESS;
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueMarker(cl_command_queue    command_queue,
-                cl_event *          event) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueMarker(
-        command_queue,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueWaitForEvents(cl_command_queue command_queue,
-                       cl_uint          num_events,
-                       const cl_event * event_list) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueWaitForEvents(
-        command_queue,
-        num_events,
-        event_list);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueBarrier(cl_command_queue command_queue) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueBarrier(command_queue);
-}
-
-CL_API_ENTRY void * CL_API_CALL
-clGetExtensionFunctionAddress(const char *function_name) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
-{
-    size_t function_name_length = 0;
-    KHRicdVendor* vendor = NULL;
-
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(function_name, NULL);
-
-    // make sure the ICD is initialized
-    khrIcdInitialize();    
-    function_name_length = strlen(function_name);
-
-    // return any ICD-aware extensions
-
-    // Most extensions, including multi-vendor KHR and EXT extensions,
-    // do not need to be ICD-aware and do not require any ICD loader
-    // modifications.  The KHR and EXT extensions below were added for
-    // backwards compatibility only.
-    #define CL_COMMON_EXTENSION_ENTRYPOINT_ADD(name) if (!strcmp(function_name, #name) ) return (void *)(size_t)&name
-
-    // Functions supporting the creation of OpenCL Memory Objects
-    // from OpenGL Objects (cl_apple_gl_sharing, cl_khr_gl_sharing)
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLBuffer);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLTexture);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLTexture2D);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLTexture3D);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromGLRenderbuffer);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetGLObjectInfo);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetGLTextureInfo);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireGLObjects);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseGLObjects);
-
-    // cl_khr_gl_sharing
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetGLContextInfoKHR);
-
-    // cl_khr_gl_event
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateEventFromGLsyncKHR);
-
-#if defined(_WIN32)
-    // cl_khr_d3d10_sharing
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetDeviceIDsFromD3D10KHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D10BufferKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D10Texture2DKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D10Texture3DKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireD3D10ObjectsKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseD3D10ObjectsKHR);
-    // cl_khr_d3d11_sharing
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetDeviceIDsFromD3D11KHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D11BufferKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D11Texture2DKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromD3D11Texture3DKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireD3D11ObjectsKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseD3D11ObjectsKHR);
-    // cl_khr_dx9_media_sharing
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetDeviceIDsFromDX9MediaAdapterKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromDX9MediaSurfaceKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireDX9MediaSurfacesKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseDX9MediaSurfacesKHR);
-#endif
-
-    // cl_ext_device_fission
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateSubDevicesEXT);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clRetainDeviceEXT);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clReleaseDeviceEXT);
-
-    /* cl_khr_egl_image */
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateFromEGLImageKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueAcquireEGLObjectsKHR);
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clEnqueueReleaseEGLObjectsKHR);
-
-    /* cl_khr_egl_event */
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clCreateEventFromEGLSyncKHR);
-
-    /* cl_khr_sub_groups */
-    CL_COMMON_EXTENSION_ENTRYPOINT_ADD(clGetKernelSubGroupInfoKHR);
-
-    #undef CL_COMMON_EXTENSION_ENTRYPOINT_ADD
-
-    // fall back to vendor extension detection
-    for (vendor = khrIcdVendors; vendor; vendor = vendor->next)
-    {
-        size_t vendor_suffix_length = strlen(vendor->suffix);
-        if (vendor_suffix_length <= function_name_length && vendor_suffix_length > 0)
-        {            
-            const char *function_suffix = function_name+function_name_length-vendor_suffix_length;
-            if (!strcmp(function_suffix, vendor->suffix) )
-            {
-                return vendor->clGetExtensionFunctionAddress(function_name);
-            }
-        }
-    }
-    return NULL;
-}
-
-// GL and other APIs
-CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLBuffer(
-    cl_context    context,
-    cl_mem_flags  flags,
-    cl_GLuint     bufobj,
-    int *         errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromGLBuffer(
-        context,
-        flags,
-        bufobj,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture(
-    cl_context      context,
-    cl_mem_flags    flags,
-    cl_GLenum       target,
-    cl_GLint        miplevel,
-    cl_GLuint       texture,
-    cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_2
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromGLTexture(
-        context,
-        flags,
-        target,
-        miplevel,
-        texture,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture2D(
-    cl_context      context,
-    cl_mem_flags    flags,
-    cl_GLenum       target,
-    cl_GLint        miplevel,
-    cl_GLuint       texture,
-    cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromGLTexture2D(
-        context,
-        flags,
-        target,
-        miplevel,
-        texture,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture3D(
-    cl_context      context,
-    cl_mem_flags    flags,
-    cl_GLenum       target,
-    cl_GLint        miplevel,
-    cl_GLuint       texture,
-    cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromGLTexture3D(
-        context,
-        flags,
-        target,
-        miplevel,
-        texture,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLRenderbuffer(
-    cl_context           context,
-    cl_mem_flags         flags,
-    cl_GLuint            renderbuffer,
-    cl_int *             errcode_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromGLRenderbuffer(
-        context,
-        flags,
-        renderbuffer,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL clGetGLObjectInfo(
-    cl_mem               memobj,
-    cl_gl_object_type *  gl_object_type,
-    cl_GLuint *          gl_object_name) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
-    return memobj->dispatch->clGetGLObjectInfo(
-        memobj,
-        gl_object_type,
-        gl_object_name);
-}
-                  
-CL_API_ENTRY cl_int CL_API_CALL clGetGLTextureInfo(
-    cl_mem               memobj,
-    cl_gl_texture_info   param_name,
-    size_t               param_value_size,
-    void *               param_value,
-    size_t *             param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
-    return memobj->dispatch->clGetGLTextureInfo(
-        memobj,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireGLObjects(
-    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_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueAcquireGLObjects(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseGLObjects(
-    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_API_SUFFIX__VERSION_1_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueReleaseGLObjects(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL 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) CL_API_SUFFIX__VERSION_1_0
-{
-    cl_platform_id platform = NULL;
-
-    // initialize the platforms (in case they have not been already)
-    khrIcdInitialize();
-
-    // determine the platform to use from the properties specified
-    khrIcdContextPropertiesGetPlatform(properties, &platform);
-
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);    
-    return platform->dispatch->clGetGLContextInfoKHR(
-        properties,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-CL_API_ENTRY cl_event CL_API_CALL clCreateEventFromGLsyncKHR(
-	cl_context context,
-	cl_GLsync sync,
-	cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1
-{
-	KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-	return context->dispatch->clCreateEventFromGLsyncKHR(
-		context,
-		sync,
-		errcode_ret);
-}
-
-#if defined(_WIN32)
-/*
- *
- * cl_d3d10_sharing_khr
- *
- */
-
-CL_API_ENTRY cl_int CL_API_CALL
-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)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
-    return platform->dispatch->clGetDeviceIDsFromD3D10KHR(
-        platform,
-        d3d_device_source,
-        d3d_object,
-        d3d_device_set,
-        num_entries, 
-        devices, 
-        num_devices);
-}
- 
-CL_API_ENTRY cl_mem CL_API_CALL 
-clCreateFromD3D10BufferKHR(
+CL_API_ENTRY cl_int CL_API_CALL clSetContextDestructorCallback(
     cl_context context,
-    cl_mem_flags flags,
-    ID3D10Buffer *resource,
-    cl_int *errcode_ret) 
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromD3D10BufferKHR(
-        context,
-        flags,
-        resource,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromD3D10Texture2DKHR(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D10Texture2D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromD3D10Texture2DKHR(
-        context,
-        flags,
-        resource,
-        subresource,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL 
-clCreateFromD3D10Texture3DKHR(
-    cl_context context,
-    cl_mem_flags flags,
-    ID3D10Texture3D *resource,
-    UINT subresource,
-    cl_int *errcode_ret)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromD3D10Texture3DKHR(
-        context,
-        flags,
-        resource,
-        subresource,
-        errcode_ret);        
-}
-
-CL_API_ENTRY cl_int CL_API_CALL 
-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) 
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueAcquireD3D10ObjectsKHR(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL 
-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) 
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueReleaseD3D10ObjectsKHR(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);       
-}
-
-/*
- *
- * cl_d3d11_sharing_khr
- *
- */
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetDeviceIDsFromD3D11KHR(
-    cl_platform_id             platform,
-    cl_d3d11_device_source_khr d3d_device_source,
-    void *                     d3d_object,
-    cl_d3d11_device_set_khr    d3d_device_set,
-    cl_uint                    num_entries,
-    cl_device_id *             devices,
-    cl_uint *                  num_devices)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
-    return platform->dispatch->clGetDeviceIDsFromD3D11KHR(
-        platform,
-        d3d_device_source,
-        d3d_object,
-        d3d_device_set,
-        num_entries,
-        devices,
-        num_devices);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromD3D11BufferKHR(
-    cl_context     context,
-    cl_mem_flags   flags,
-    ID3D11Buffer * resource,
-    cl_int *       errcode_ret)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromD3D11BufferKHR(
-        context,
-        flags,
-        resource,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromD3D11Texture2DKHR(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D11Texture2D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromD3D11Texture2DKHR(
-        context,
-        flags,
-        resource,
-        subresource,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromD3D11Texture3DKHR(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D11Texture3D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromD3D11Texture3DKHR(
-        context,
-        flags,
-        resource,
-        subresource,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueAcquireD3D11ObjectsKHR(
-    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)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueAcquireD3D11ObjectsKHR(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueReleaseD3D11ObjectsKHR(
-    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)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueReleaseD3D11ObjectsKHR(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-/*
- *
- * cl_khr_dx9_media_sharing
- *
- */
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetDeviceIDsFromDX9MediaAdapterKHR(
-    cl_platform_id                  platform,
-    cl_uint                         num_media_adapters,
-    cl_dx9_media_adapter_type_khr * media_adapters_type,
-    void *                          media_adapters,
-    cl_dx9_media_adapter_set_khr    media_adapter_set,
-    cl_uint                         num_entries,
-    cl_device_id *                  devices,
-    cl_uint *                       num_devices)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
-    return platform->dispatch->clGetDeviceIDsFromDX9MediaAdapterKHR(
-        platform,
-        num_media_adapters,
-		media_adapters_type,
-        media_adapters,
-        media_adapter_set,
-        num_entries,
-        devices,
-        num_devices);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromDX9MediaSurfaceKHR(
-    cl_context                    context,
-    cl_mem_flags                  flags,
-    cl_dx9_media_adapter_type_khr adapter_type,
-    void *                        surface_info,
-    cl_uint                       plane,                                                                          
-    cl_int *                      errcode_ret)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromDX9MediaSurfaceKHR(
-        context,
-        flags,
-        adapter_type,
-        surface_info,
-        plane,                                                                          
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueAcquireDX9MediaSurfacesKHR(
-    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)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueAcquireDX9MediaSurfacesKHR(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueReleaseDX9MediaSurfacesKHR(
-    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)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueReleaseDX9MediaSurfacesKHR(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-#endif
-
-CL_API_ENTRY cl_int CL_API_CALL 
-clSetEventCallback(
-    cl_event event,
-    cl_int command_exec_callback_type,
-    void (CL_CALLBACK *pfn_notify)(cl_event, cl_int, void *),
-    void *user_data) CL_API_SUFFIX__VERSION_1_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
-    return event->dispatch->clSetEventCallback(
-        event,
-        command_exec_callback_type,
-        pfn_notify,
-        user_data);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateSubBuffer(
-    cl_mem buffer,
-    cl_mem_flags flags,
-    cl_buffer_create_type buffer_create_type,
-    const void * buffer_create_info,
-    cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(buffer, CL_INVALID_MEM_OBJECT);
-    return buffer->dispatch->clCreateSubBuffer(
-        buffer,
-        flags,
-        buffer_create_type,
-        buffer_create_info,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clSetMemObjectDestructorCallback(
-    cl_mem memobj, 
-    void (CL_CALLBACK * pfn_notify)( cl_mem, void*), 
-    void * user_data )             CL_API_SUFFIX__VERSION_1_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
-    return memobj->dispatch->clSetMemObjectDestructorCallback(
-        memobj, 
-        pfn_notify,
-        user_data);
-}
-
-CL_API_ENTRY cl_event CL_API_CALL
-clCreateUserEvent(
-    cl_context context,
-    cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateUserEvent(
-        context,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clSetUserEventStatus(
-    cl_event event,
-    cl_int execution_status) CL_API_SUFFIX__VERSION_1_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
-    return event->dispatch->clSetUserEventStatus(
-        event,
-        execution_status);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromEGLImageKHR(
-    cl_context context,
-    CLeglDisplayKHR display,
-    CLeglImageKHR image,
-    cl_mem_flags flags,
-    const cl_egl_image_properties_khr *properties,
-    cl_int *errcode_ret)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateFromEGLImageKHR(
-        context,
-        display,
-        image,
-        flags,
-        properties,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueAcquireEGLObjectsKHR(
-    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)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueAcquireEGLObjectsKHR(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueReleaseEGLObjectsKHR(
-    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)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueReleaseEGLObjectsKHR(
-        command_queue,
-        num_objects,
-        mem_objects,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-/* cl_khr_egl_event */
-CL_API_ENTRY cl_event CL_API_CALL
-clCreateEventFromEGLSyncKHR(
-    cl_context context,
-    CLeglSyncKHR sync,
-    CLeglDisplayKHR display,
-    cl_int *errcode_ret)
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateEventFromEGLSyncKHR(
-        context,
-        sync,
-        display,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_command_queue CL_API_CALL
-clCreateCommandQueueWithProperties(
-    cl_context                  context,
-    cl_device_id                device,
-    const cl_queue_properties * properties,
-    cl_int *                    errcode_ret) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateCommandQueueWithProperties(
-        context,
-        device,
-        properties,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_mem CL_API_CALL
-clCreatePipe(
-    cl_context                 context,
-    cl_mem_flags               flags,
-    cl_uint                    pipe_packet_size,
-    cl_uint                    pipe_max_packets,
-    const cl_pipe_properties * properties,
-    cl_int *                   errcode_ret) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreatePipe(
-        context,
-        flags,
-        pipe_packet_size,
-        pipe_max_packets,
-        properties,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetPipeInfo(
-    cl_mem       pipe,
-    cl_pipe_info param_name,
-    size_t       param_value_size,
-    void *       param_value,
-    size_t *     param_value_size_ret) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(pipe, CL_INVALID_MEM_OBJECT);
-    return pipe->dispatch->clGetPipeInfo(
-        pipe,
-        param_name,
-        param_value_size,
-        param_value,
-        param_value_size_ret);
-}
-
-CL_API_ENTRY void * CL_API_CALL
-clSVMAlloc(
-    cl_context       context,
-    cl_svm_mem_flags flags,
-    size_t           size,
-    cl_uint          alignment) CL_API_SUFFIX__VERSION_2_0
-{
-    if (!context) {
-        return NULL;
-    }
-    return context->dispatch->clSVMAlloc(
-        context,
-        flags,
-        size,
-        alignment);
-}
-
-CL_API_ENTRY void CL_API_CALL
-clSVMFree(
-    cl_context context,
-    void *     svm_pointer) CL_API_SUFFIX__VERSION_2_0
-{
-    if (!context || !svm_pointer) {
-        return;
-    }
-    context->dispatch->clSVMFree(
-        context,
-        svm_pointer);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueSVMFree(
-    cl_command_queue command_queue,
-    cl_uint num_svm_pointers,
-    void* svm_pointers[],
-    void (CL_CALLBACK* pfn_free_func)(
-        cl_command_queue queue,
-        cl_uint num_svm_pointers,
-        void* svm_pointers[],
-        void* user_data),
-    void* user_data,
-    cl_uint num_events_in_wait_list,
-    const cl_event* event_wait_list,
-    cl_event* event) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueSVMFree(
-        command_queue,
-        num_svm_pointers,
-        svm_pointers,
-        pfn_free_func,
-        user_data,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueSVMMemcpy(
-    cl_command_queue  command_queue,
-    cl_bool           blocking_copy,
-    void *            dst_ptr,
-    const void *      src_ptr,
-    size_t            size,
-    cl_uint           num_events_in_wait_list,
-    const cl_event *  event_wait_list,
-    cl_event *        event) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueSVMMemcpy(
-        command_queue,
-        blocking_copy,
-        dst_ptr,
-        src_ptr,
-        size,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueSVMMemFill(
-    cl_command_queue command_queue,
-    void *           svm_ptr,
-    const void *     pattern,
-    size_t           pattern_size,
-    size_t           size,
-    cl_uint          num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event *       event) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueSVMMemFill(
-        command_queue,
-        svm_ptr,
-        pattern,
-        pattern_size,
-        size,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueSVMMap(
-    cl_command_queue  command_queue,
-    cl_bool           blocking_map,
-    cl_map_flags      flags,
-    void *            svm_ptr,
-    size_t            size,
-    cl_uint           num_events_in_wait_list,
-    const cl_event *  event_wait_list,
-    cl_event *        event) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueSVMMap(
-        command_queue,
-        blocking_map,
-        flags,
-        svm_ptr,
-        size,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueSVMUnmap(
-    cl_command_queue command_queue,
-    void *           svm_ptr,
-    cl_uint          num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event *       event) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueSVMUnmap(
-        command_queue,
-        svm_ptr,
-        num_events_in_wait_list,
-        event_wait_list,
-        event);
-}
-
-CL_API_ENTRY cl_sampler CL_API_CALL
-clCreateSamplerWithProperties(
-    cl_context                     context,
-    const cl_sampler_properties *  sampler_properties,
-    cl_int *                       errcode_ret) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateSamplerWithProperties(
-        context,
-        sampler_properties,
-        errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clSetKernelArgSVMPointer(
-    cl_kernel    kernel,
-    cl_uint      arg_index,
-    const void * arg_value) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    return kernel->dispatch->clSetKernelArgSVMPointer(
-        kernel,
-        arg_index,
-        arg_value);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clSetKernelExecInfo(
-    cl_kernel            kernel,
-    cl_kernel_exec_info  param_name,
-    size_t               param_value_size,
-    const void *         param_value) CL_API_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    return kernel->dispatch->clSetKernelExecInfo(
-        kernel,
-        param_name,
-        param_value_size,
-        param_value);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetKernelSubGroupInfoKHR(
-    cl_kernel                in_kernel,
-    cl_device_id             in_device,
-    cl_kernel_sub_group_info param_name,
-    size_t                   input_value_size,
-    const void *             input_value,
-    size_t                   param_value_size,
-    void *                   param_value,
-    size_t *                 param_value_size_ret) CL_EXT_SUFFIX__VERSION_2_0
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(in_kernel, CL_INVALID_KERNEL);
-    return in_kernel->dispatch->clGetKernelSubGroupInfoKHR(
-            in_kernel,
-            in_device,
-            param_name,
-            input_value_size,
-            input_value,
-            param_value_size,
-            param_value,
-            param_value_size_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clSetDefaultDeviceCommandQueue(
-    cl_context context,
-    cl_device_id device,
-    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_2_1
+    void (CL_CALLBACK* pfn_notify)(cl_context context, void* user_data),
+    void* user_data) CL_API_SUFFIX__VERSION_3_0
 {
     KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return context->dispatch->clSetDefaultDeviceCommandQueue(
-            context,
-            device,
-            command_queue);
+    return context->dispatch->clSetContextDestructorCallback(
+        context,
+        pfn_notify,
+        user_data);
 }
 
-CL_API_ENTRY cl_program CL_API_CALL
-clCreateProgramWithIL(
-    cl_context context,
-    const void * il,
-    size_t length,
-    cl_int * errcode_ret) CL_API_SUFFIX__VERSION_2_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
-    return context->dispatch->clCreateProgramWithIL(
-            context,
-            il,
-            length,
-            errcode_ret);
+#endif // CL_VERSION_3_0
+
+#ifdef __cplusplus
 }
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetKernelSubGroupInfo(
-    cl_kernel kernel,
-    cl_device_id device,
-    cl_kernel_sub_group_info param_name,
-    size_t input_value_size,
-    const void * input_value,
-    size_t param_value_size,
-    void * param_value,
-    size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_2_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return kernel->dispatch->clGetKernelSubGroupInfo(
-            kernel,
-            device,
-            param_name,
-            input_value_size,
-            input_value,
-            param_value_size,
-            param_value,
-            param_value_size_ret);
-}
-
-CL_API_ENTRY cl_kernel CL_API_CALL
-clCloneKernel(
-    cl_kernel source_kernel,
-    cl_int * errcode_ret) CL_API_SUFFIX__VERSION_2_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(source_kernel, CL_INVALID_KERNEL);
-    return source_kernel->dispatch->clCloneKernel(
-            source_kernel,
-            errcode_ret);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueSVMMigrateMem(
-    cl_command_queue command_queue,
-    cl_uint num_svm_pointers,
-    const void ** svm_pointers,
-    const size_t * sizes,
-    cl_mem_migration_flags flags,
-    cl_uint num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event * event) CL_API_SUFFIX__VERSION_2_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
-    return command_queue->dispatch->clEnqueueSVMMigrateMem(
-            command_queue,
-            num_svm_pointers,
-            svm_pointers,
-            sizes,
-            flags,
-            num_events_in_wait_list,
-            event_wait_list,
-            event);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetDeviceAndHostTimer(
-    cl_device_id device,
-    cl_ulong * device_timestamp,
-    cl_ulong * host_timestamp) CL_API_SUFFIX__VERSION_2_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return device->dispatch->clGetDeviceAndHostTimer(
-            device,
-            device_timestamp,
-            host_timestamp);
-}
-
-CL_API_ENTRY cl_int CL_API_CALL
-clGetHostTimer(
-    cl_device_id device,
-    cl_ulong * host_timestamp) CL_API_SUFFIX__VERSION_2_1
-{
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
-    return device->dispatch->clGetHostTimer(
-            device,
-            host_timestamp);
-}
-
-
+#endif
diff --git a/loader/icd_dispatch.h b/loader/icd_dispatch.h
index 22af335..c1adbfa 100644
--- a/loader/icd_dispatch.h
+++ b/loader/icd_dispatch.h
@@ -35,6 +35,14 @@
 #define CL_USE_DEPRECATED_OPENCL_2_0_APIS
 #endif
 
+#ifndef CL_USE_DEPRECATED_OPENCL_2_1_APIS
+#define CL_USE_DEPRECATED_OPENCL_2_1_APIS
+#endif
+
+#ifndef CL_USE_DEPRECATED_OPENCL_2_2_APIS
+#define CL_USE_DEPRECATED_OPENCL_2_2_APIS
+#endif
+
 // cl.h
 #include <CL/cl.h>
 
@@ -51,1410 +59,7 @@
 #include <CL/cl_gl_ext.h>
 #include <CL/cl_ext.h>
 #include <CL/cl_egl.h>
-
-/*
- *
- * function pointer typedefs
- *
- */
-
-// Platform APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetPlatformIDs)(
-                 cl_uint          num_entries,
-                 cl_platform_id * platforms,
-                 cl_uint *        num_platforms) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_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;
-
-// Device APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetDeviceIDs)(
-    cl_platform_id   platform,
-    cl_device_type   device_type, 
-    cl_uint          num_entries, 
-    cl_device_id *   devices, 
-    cl_uint *        num_devices) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetDeviceInfo)(
-    cl_device_id    device,
-    cl_device_info  param_name, 
-    size_t          param_value_size, 
-    void *          param_value,
-    size_t *        param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clCreateSubDevices)(
-    cl_device_id     in_device,
-    const cl_device_partition_property * partition_properties,
-    cl_uint          num_entries,
-    cl_device_id *   out_devices,
-    cl_uint *        num_devices);
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL * KHRpfn_clRetainDevice)(
-    cl_device_id     device) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL * KHRpfn_clReleaseDevice)(
-    cl_device_id     device) CL_API_SUFFIX__VERSION_1_2;
-
-// Context APIs  
-typedef CL_API_ENTRY cl_context (CL_API_CALL *KHRpfn_clCreateContext)(
-    const cl_context_properties * properties,
-    cl_uint                 num_devices,
-    const cl_device_id *    devices,
-    void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *),
-    void *                  user_data,
-    cl_int *                errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_context (CL_API_CALL *KHRpfn_clCreateContextFromType)(
-    const cl_context_properties * properties,
-    cl_device_type          device_type,
-    void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *),
-    void *                  user_data,
-    cl_int *                errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clRetainContext)(
-    cl_context context) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clReleaseContext)(
-    cl_context context) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetContextInfo)(
-    cl_context         context, 
-    cl_context_info    param_name, 
-    size_t             param_value_size, 
-    void *             param_value, 
-    size_t *           param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-// Command Queue APIs
-typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *KHRpfn_clCreateCommandQueue)(
-    cl_context                     context, 
-    cl_device_id                   device, 
-    cl_command_queue_properties    properties,
-    cl_int *                       errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *KHRpfn_clCreateCommandQueueWithProperties)(
-    cl_context                  /* context */,
-    cl_device_id                /* device */,
-    const cl_queue_properties * /* properties */,
-    cl_int *                    /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clRetainCommandQueue)(
-    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clReleaseCommandQueue)(
-    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetCommandQueueInfo)(
-    cl_command_queue      command_queue,
-    cl_command_queue_info param_name,
-    size_t                param_value_size,
-    void *                param_value,
-    size_t *              param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-// Memory Object APIs
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateBuffer)(
-    cl_context   context,
-    cl_mem_flags flags,
-    size_t       size,
-    void *       host_ptr,
-    cl_int *     errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateImage)(
-    cl_context              context,
-    cl_mem_flags            flags,
-    const cl_image_format * image_format,
-    const cl_image_desc *   image_desc,
-    void *                  host_ptr,
-    cl_int *                errcode_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clRetainMemObject)(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clReleaseMemObject)(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetSupportedImageFormats)(
-    cl_context           context,
-    cl_mem_flags         flags,
-    cl_mem_object_type   image_type,
-    cl_uint              num_entries,
-    cl_image_format *    image_formats,
-    cl_uint *            num_image_formats) CL_API_SUFFIX__VERSION_1_0;
-                                    
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetMemObjectInfo)(
-    cl_mem           memobj,
-    cl_mem_info      param_name, 
-    size_t           param_value_size,
-    void *           param_value,
-    size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetImageInfo)(
-    cl_mem           image,
-    cl_image_info    param_name, 
-    size_t           param_value_size,
-    void *           param_value,
-    size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreatePipe)(
-    cl_context                 /* context */,
-    cl_mem_flags               /* flags */,
-    cl_uint                    /* pipe_packet_size */,
-    cl_uint                    /* pipe_max_packets */,
-    const cl_pipe_properties * /* properties */,
-    cl_int *                   /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetPipeInfo)(
-    cl_mem       /* pipe */,
-    cl_pipe_info /* param_name */,
-    size_t       /* param_value_size */,
-    void *       /* param_value */,
-    size_t *     /* param_value_size_ret */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY void * (CL_API_CALL *KHRpfn_clSVMAlloc)(
-    cl_context       /* context */,
-    cl_svm_mem_flags /* flags */,
-    size_t           /* size */,
-    unsigned int     /* alignment */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY void (CL_API_CALL *KHRpfn_clSVMFree)(
-    cl_context /* context */,
-    void *     /* svm_pointer */) CL_API_SUFFIX__VERSION_2_0;
-
-// Sampler APIs
-typedef CL_API_ENTRY cl_sampler (CL_API_CALL *KHRpfn_clCreateSampler)(
-    cl_context          context,
-    cl_bool             normalized_coords, 
-    cl_addressing_mode  addressing_mode, 
-    cl_filter_mode      filter_mode,
-    cl_int *            errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clRetainSampler)(cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clReleaseSampler)(cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetSamplerInfo)(
-    cl_sampler         sampler,
-    cl_sampler_info    param_name,
-    size_t             param_value_size,
-    void *             param_value,
-    size_t *           param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_sampler (CL_API_CALL *KHRpfn_clCreateSamplerWithProperties)(
-    cl_context                    /* context */,
-    const cl_sampler_properties * /* sampler_properties */,
-    cl_int *                      /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0;
-
-// Program Object APIs
-typedef CL_API_ENTRY cl_program (CL_API_CALL *KHRpfn_clCreateProgramWithSource)(
-    cl_context        context,
-    cl_uint           count,
-    const char **     strings,
-    const size_t *    lengths,
-    cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_program (CL_API_CALL *KHRpfn_clCreateProgramWithBinary)(
-    cl_context                     context,
-    cl_uint                        num_devices,
-    const cl_device_id *           device_list,
-    const size_t *                 lengths,
-    const unsigned char **         binaries,
-    cl_int *                       binary_status,
-    cl_int *                       errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_program (CL_API_CALL *KHRpfn_clCreateProgramWithBuiltInKernels)(
-    cl_context            context,
-    cl_uint               num_devices,
-    const cl_device_id *  device_list,
-    const char *          kernel_names,
-    cl_int *              errcode_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clRetainProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clBuildProgram)(
-    cl_program           program,
-    cl_uint              num_devices,
-    const cl_device_id * device_list,
-    const char *         options, 
-    void (CL_CALLBACK *pfn_notify)(cl_program program, void * user_data),
-    void *               user_data) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clCompileProgram)(
-    cl_program           program,
-    cl_uint              num_devices,
-    const cl_device_id * device_list,
-    const char *         options,
-    cl_uint              num_input_headers,
-    const cl_program *   input_headers,
-    const char **        header_include_names,
-    void (CL_CALLBACK *  pfn_notify)(cl_program program, void * user_data),
-    void *               user_data) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_program (CL_API_CALL *KHRpfn_clLinkProgram)(
-    cl_context           context,
-    cl_uint              num_devices,
-    const cl_device_id * device_list,
-    const char *         options,
-    cl_uint              num_input_programs,
-    const cl_program *   input_programs,
-    void (CL_CALLBACK *  pfn_notify)(cl_program program, void * user_data),
-    void *               user_data,
-    cl_int *             errcode_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetProgramSpecializationConstant)(
-    cl_program           program,
-    cl_uint              spec_id,
-    size_t               spec_size,
-    const void*          spec_value) CL_API_SUFFIX__VERSION_2_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetProgramReleaseCallback)(
-    cl_program           program,
-    void (CL_CALLBACK *  pfn_notify)(cl_program program, void * user_data),
-    void *               user_data) CL_API_SUFFIX__VERSION_2_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clUnloadPlatformCompiler)(
-    cl_platform_id     platform) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetProgramInfo)(
-    cl_program         program,
-    cl_program_info    param_name,
-    size_t             param_value_size,
-    void *             param_value,
-    size_t *           param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetProgramBuildInfo)(
-    cl_program            program,
-    cl_device_id          device,
-    cl_program_build_info param_name,
-    size_t                param_value_size,
-    void *                param_value,
-    size_t *              param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-                            
-// Kernel Object APIs
-typedef CL_API_ENTRY cl_kernel (CL_API_CALL *KHRpfn_clCreateKernel)(
-    cl_program      program,
-    const char *    kernel_name,
-    cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clCreateKernelsInProgram)(
-    cl_program     program,
-    cl_uint        num_kernels,
-    cl_kernel *    kernels,
-    cl_uint *      num_kernels_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clRetainKernel)(cl_kernel    kernel) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clReleaseKernel)(cl_kernel   kernel) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetKernelArg)(
-    cl_kernel    kernel,
-    cl_uint      arg_index,
-    size_t       arg_size,
-    const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetKernelInfo)(
-    cl_kernel       kernel,
-    cl_kernel_info  param_name,
-    size_t          param_value_size,
-    void *          param_value,
-    size_t *        param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetKernelArgInfo)(
-    cl_kernel       kernel,
-    cl_uint         arg_indx,
-    cl_kernel_arg_info  param_name,
-    size_t          param_value_size,
-    void *          param_value,
-    size_t *        param_value_size_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetKernelWorkGroupInfo)(
-    cl_kernel                  kernel,
-    cl_device_id               device,
-    cl_kernel_work_group_info  param_name,
-    size_t                     param_value_size,
-    void *                     param_value,
-    size_t *                   param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetKernelArgSVMPointer)(
-    cl_kernel    /* kernel */,
-    cl_uint      /* arg_index */,
-    const void * /* arg_value */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetKernelExecInfo)(
-    cl_kernel            /* kernel */,
-    cl_kernel_exec_info  /* param_name */,
-    size_t               /* param_value_size */,
-    const void *         /* param_value */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetKernelSubGroupInfoKHR)(
-    cl_kernel                /* in_kernel */,
-    cl_device_id             /*in_device*/,
-    cl_kernel_sub_group_info /* param_name */,
-    size_t                   /*input_value_size*/,
-    const void *             /*input_value*/,
-    size_t                   /*param_value_size*/,
-    void*                    /*param_value*/,
-    size_t*                  /*param_value_size_ret*/) CL_EXT_SUFFIX__VERSION_2_0;
-
-// Event Object APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clWaitForEvents)(
-    cl_uint             num_events,
-    const cl_event *    event_list) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetEventInfo)(
-    cl_event         event,
-    cl_event_info    param_name,
-    size_t           param_value_size,
-    void *           param_value,
-    size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-                            
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clRetainEvent)(cl_event event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clReleaseEvent)(cl_event event) CL_API_SUFFIX__VERSION_1_0;
-
-// Profiling APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetEventProfilingInfo)(
-    cl_event            event,
-    cl_profiling_info   param_name,
-    size_t              param_value_size,
-    void *              param_value,
-    size_t *            param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-                                
-// Flush and Finish APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clFlush)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clFinish)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
-
-// Enqueued Commands APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueReadBuffer)(
-    cl_command_queue    command_queue,
-    cl_mem              buffer,
-    cl_bool             blocking_read,
-    size_t              offset,
-    size_t              cb, 
-    void *              ptr,
-    cl_uint             num_events_in_wait_list,
-    const cl_event *    event_wait_list,
-    cl_event *          event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueReadBufferRect)(
-    cl_command_queue    command_queue,
-    cl_mem              buffer,
-    cl_bool             blocking_read,
-    const size_t *      buffer_origin,
-    const size_t *      host_origin, 
-    const size_t *      region,
-    size_t              buffer_row_pitch,
-    size_t              buffer_slice_pitch,
-    size_t              host_row_pitch,
-    size_t              host_slice_pitch,
-    void *              ptr,
-    cl_uint             num_events_in_wait_list,
-    const cl_event *    event_wait_list,
-    cl_event *          event) CL_API_SUFFIX__VERSION_1_1;
-                            
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueWriteBuffer)(
-    cl_command_queue   command_queue, 
-    cl_mem             buffer, 
-    cl_bool            blocking_write, 
-    size_t             offset, 
-    size_t             cb, 
-    const void *       ptr, 
-    cl_uint            num_events_in_wait_list, 
-    const cl_event *   event_wait_list, 
-    cl_event *         event) CL_API_SUFFIX__VERSION_1_0;
-                            
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueWriteBufferRect)(
-    cl_command_queue    command_queue,
-    cl_mem              buffer,
-    cl_bool             blocking_read,
-    const size_t *      buffer_origin,
-    const size_t *      host_origin, 
-    const size_t *      region,
-    size_t              buffer_row_pitch,
-    size_t              buffer_slice_pitch,
-    size_t              host_row_pitch,
-    size_t              host_slice_pitch,    
-    const void *        ptr,
-    cl_uint             num_events_in_wait_list,
-    const cl_event *    event_wait_list,
-    cl_event *          event) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueFillBuffer)(
-    cl_command_queue   command_queue,
-    cl_mem             buffer,
-    const void *       pattern,
-    size_t             pattern_size,
-    size_t             offset,
-    size_t             cb,
-    cl_uint            num_events_in_wait_list,
-    const cl_event *   event_wait_list,
-    cl_event *         event) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueCopyBuffer)(
-    cl_command_queue    command_queue, 
-    cl_mem              src_buffer,
-    cl_mem              dst_buffer, 
-    size_t              src_offset,
-    size_t              dst_offset,
-    size_t              cb, 
-    cl_uint             num_events_in_wait_list,
-    const cl_event *    event_wait_list,
-    cl_event *          event) CL_API_SUFFIX__VERSION_1_0;
-                            
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueCopyBufferRect)(
-    cl_command_queue    command_queue, 
-    cl_mem              src_buffer,
-    cl_mem              dst_buffer, 
-    const size_t *      src_origin,
-    const size_t *      dst_origin,
-    const size_t *      region,
-    size_t              src_row_pitch,
-    size_t              src_slice_pitch,
-    size_t              dst_row_pitch,
-    size_t              dst_slice_pitch,
-    cl_uint             num_events_in_wait_list,
-    const cl_event *    event_wait_list,
-    cl_event *          event) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueReadImage)(
-    cl_command_queue     command_queue,
-    cl_mem               image,
-    cl_bool              blocking_read, 
-    const size_t *       origin,
-    const size_t *       region,
-    size_t               row_pitch,
-    size_t               slice_pitch, 
-    void *               ptr,
-    cl_uint              num_events_in_wait_list,
-    const cl_event *     event_wait_list,
-    cl_event *           event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueWriteImage)(
-    cl_command_queue    command_queue,
-    cl_mem              image,
-    cl_bool             blocking_write, 
-    const size_t *      origin,
-    const size_t *      region,
-    size_t              input_row_pitch,
-    size_t              input_slice_pitch, 
-    const void *        ptr,
-    cl_uint             num_events_in_wait_list,
-    const cl_event *    event_wait_list,
-    cl_event *          event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueFillImage)(
-    cl_command_queue   command_queue,
-    cl_mem             image,
-    const void *       fill_color,
-    const size_t       origin[3],
-    const size_t       region[3],
-    cl_uint            num_events_in_wait_list,
-    const cl_event *   event_wait_list,
-    cl_event *         event) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueCopyImage)(
-    cl_command_queue     command_queue,
-    cl_mem               src_image,
-    cl_mem               dst_image, 
-    const size_t *       src_origin,
-    const size_t *       dst_origin,
-    const size_t *       region, 
-    cl_uint              num_events_in_wait_list,
-    const cl_event *     event_wait_list,
-    cl_event *           event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueCopyImageToBuffer)(
-    cl_command_queue command_queue,
-    cl_mem           src_image,
-    cl_mem           dst_buffer, 
-    const size_t *   src_origin,
-    const size_t *   region, 
-    size_t           dst_offset,
-    cl_uint          num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event *       event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueCopyBufferToImage)(
-    cl_command_queue command_queue,
-    cl_mem           src_buffer,
-    cl_mem           dst_image, 
-    size_t           src_offset,
-    const size_t *   dst_origin,
-    const size_t *   region, 
-    cl_uint          num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event *       event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY void * (CL_API_CALL *KHRpfn_clEnqueueMapBuffer)(
-    cl_command_queue command_queue,
-    cl_mem           buffer,
-    cl_bool          blocking_map, 
-    cl_map_flags     map_flags,
-    size_t           offset,
-    size_t           cb,
-    cl_uint          num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event *       event,
-    cl_int *         errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY void * (CL_API_CALL *KHRpfn_clEnqueueMapImage)(
-    cl_command_queue  command_queue,
-    cl_mem            image, 
-    cl_bool           blocking_map, 
-    cl_map_flags      map_flags, 
-    const size_t *    origin,
-    const size_t *    region,
-    size_t *          image_row_pitch,
-    size_t *          image_slice_pitch,
-    cl_uint           num_events_in_wait_list,
-    const cl_event *  event_wait_list,
-    cl_event *        event,
-    cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueUnmapMemObject)(
-    cl_command_queue command_queue,
-    cl_mem           memobj,
-    void *           mapped_ptr,
-    cl_uint          num_events_in_wait_list,
-    const cl_event *  event_wait_list,
-    cl_event *        event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueMigrateMemObjects)(
-    cl_command_queue       command_queue,
-    cl_uint                num_mem_objects,
-    const cl_mem *         mem_objects,
-    cl_mem_migration_flags flags,
-    cl_uint                num_events_in_wait_list,
-    const cl_event *       event_wait_list,
-    cl_event *             event) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueNDRangeKernel)(
-    cl_command_queue command_queue,
-    cl_kernel        kernel,
-    cl_uint          work_dim,
-    const size_t *   global_work_offset,
-    const size_t *   global_work_size,
-    const size_t *   local_work_size,
-    cl_uint          num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event *       event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueTask)(
-    cl_command_queue  command_queue,
-    cl_kernel         kernel,
-    cl_uint           num_events_in_wait_list,
-    const cl_event *  event_wait_list,
-    cl_event *        event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueNativeKernel)(
-    cl_command_queue  command_queue,
-    void (CL_CALLBACK * user_func)(void *),
-    void *            args,
-    size_t            cb_args, 
-    cl_uint           num_mem_objects,
-    const cl_mem *    mem_list,
-    const void **     args_mem_loc,
-    cl_uint           num_events_in_wait_list,
-    const cl_event *  event_wait_list,
-    cl_event *        event) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueMarkerWithWaitList)(
-    cl_command_queue  command_queue,
-    cl_uint           num_events_in_wait_list,
-    const cl_event *  event_wait_list,
-    cl_event *        event) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueBarrierWithWaitList)(
-    cl_command_queue  command_queue,
-    cl_uint           num_events_in_wait_list,
-    const cl_event *  event_wait_list,
-    cl_event *        event) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY void * (CL_API_CALL *KHRpfn_clGetExtensionFunctionAddressForPlatform)(
-    cl_platform_id platform,
-    const char *   function_name) CL_API_SUFFIX__VERSION_1_2;
-
-// Shared Virtual Memory APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueSVMFree)(
-    cl_command_queue /* command_queue */,
-    cl_uint          /* num_svm_pointers */,
-    void **          /* svm_pointers */,
-    void (CL_CALLBACK *pfn_free_func)(
-        cl_command_queue /* queue */,
-        cl_uint          /* num_svm_pointers */,
-        void **          /* svm_pointers[] */,
-        void *           /* user_data */),
-    void *           /* user_data */,
-    cl_uint          /* num_events_in_wait_list */,
-    const cl_event * /* event_wait_list */,
-    cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueSVMMemcpy)(
-    cl_command_queue /* command_queue */,
-    cl_bool          /* blocking_copy */,
-    void *           /* dst_ptr */,
-    const void *     /* src_ptr */,
-    size_t           /* size */,
-    cl_uint          /* num_events_in_wait_list */,
-    const cl_event * /* event_wait_list */,
-    cl_event *       /* event */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueSVMMemFill)(
-    cl_command_queue /* command_queue */,
-    void *           /* svm_ptr */,
-    const void *     /* pattern */,
-    size_t           /* pattern_size */,
-    size_t           /* size */,
-    cl_uint          /* num_events_in_wait_list */,
-    const cl_event * /* event_wait_list */,
-    cl_event *       /* event */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueSVMMap)(
-    cl_command_queue /* command_queue */,
-    cl_bool          /* blocking_map */,
-    cl_map_flags     /* map_flags */,
-    void *           /* svm_ptr */,
-    size_t           /* size */,
-    cl_uint          /* num_events_in_wait_list */,
-    const cl_event * /* event_wait_list */,
-    cl_event *       /* event */) CL_API_SUFFIX__VERSION_2_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueSVMUnmap)(
-    cl_command_queue /* command_queue */,
-    void *           /* svm_ptr */,
-    cl_uint          /* num_events_in_wait_list */,
-    const cl_event * /* event_wait_list */,
-    cl_event *       /* event */) CL_API_SUFFIX__VERSION_2_0;
-
-// Deprecated APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetCommandQueueProperty)(
-    cl_command_queue              command_queue,
-    cl_command_queue_properties   properties, 
-    cl_bool                       enable,
-    cl_command_queue_properties * old_properties) CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateImage2D)(
-    cl_context              context,
-    cl_mem_flags            flags,
-    const cl_image_format * image_format,
-    size_t                  image_width,
-    size_t                  image_height,
-    size_t                  image_row_pitch, 
-    void *                  host_ptr,
-    cl_int *                errcode_ret) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-                        
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateImage3D)(
-    cl_context              context,
-    cl_mem_flags            flags,
-    const cl_image_format * image_format,
-    size_t                  image_width, 
-    size_t                  image_height,
-    size_t                  image_depth, 
-    size_t                  image_row_pitch, 
-    size_t                  image_slice_pitch, 
-    void *                  host_ptr,
-    cl_int *                errcode_ret) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clUnloadCompiler)(void) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueMarker)(
-    cl_command_queue    command_queue,
-    cl_event *          event) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueWaitForEvents)(
-    cl_command_queue command_queue,
-    cl_uint          num_events,
-    const cl_event * event_list) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueBarrier)(cl_command_queue command_queue) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-
-typedef CL_API_ENTRY void * (CL_API_CALL *KHRpfn_clGetExtensionFunctionAddress)(const char *function_name) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
-
-// GL and other APIs
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromGLBuffer)(
-    cl_context    context,
-    cl_mem_flags  flags,
-    cl_GLuint     bufobj,
-    int *         errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromGLTexture)(
-    cl_context      context,
-    cl_mem_flags    flags,
-    cl_GLenum       target,
-    cl_GLint        miplevel,
-    cl_GLuint       texture,
-    cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromGLTexture2D)(
-    cl_context      context,
-    cl_mem_flags    flags,
-    cl_GLenum       target,
-    cl_GLint        miplevel,
-    cl_GLuint       texture,
-    cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromGLTexture3D)(
-    cl_context      context,
-    cl_mem_flags    flags,
-    cl_GLenum       target,
-    cl_GLint        miplevel,
-    cl_GLuint       texture,
-    cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromGLRenderbuffer)(
-    cl_context           context,
-    cl_mem_flags         flags,
-    cl_GLuint            renderbuffer,
-    cl_int *             errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetGLObjectInfo)(
-    cl_mem               memobj,
-    cl_gl_object_type *  gl_object_type,
-    cl_GLuint *          gl_object_name) CL_API_SUFFIX__VERSION_1_0;
-                  
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetGLTextureInfo)(
-    cl_mem               memobj,
-    cl_gl_texture_info   param_name,
-    size_t               param_value_size,
-    void *               param_value,
-    size_t *             param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueAcquireGLObjects)(
-    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_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueReleaseGLObjects)(
-    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_API_SUFFIX__VERSION_1_0;
-
-/* cl_khr_gl_sharing */
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_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);
-
-/* cl_khr_gl_event */
-typedef CL_API_ENTRY cl_event (CL_API_CALL *KHRpfn_clCreateEventFromGLsyncKHR)(
-    cl_context context,
-    cl_GLsync sync,
-    cl_int *errcode_ret);
-
-
-#if defined(_WIN32)
-
-/* cl_khr_d3d10_sharing */
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_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_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromD3D10BufferKHR)(
-    cl_context     context,
-    cl_mem_flags   flags,
-    ID3D10Buffer * resource,
-    cl_int *       errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromD3D10Texture2DKHR)(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D10Texture2D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromD3D10Texture3DKHR)(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D10Texture3D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_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_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_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) CL_API_SUFFIX__VERSION_1_0;
-
-extern CL_API_ENTRY cl_int CL_API_CALL
-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);
- 
-extern CL_API_ENTRY cl_mem CL_API_CALL 
-clCreateFromD3D10BufferKHR(
-    cl_context context,
-    cl_mem_flags flags,
-    ID3D10Buffer *resource,
-    cl_int *errcode_ret);
-
-extern CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromD3D10Texture2DKHR(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D10Texture2D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret);
-
-extern CL_API_ENTRY cl_mem CL_API_CALL 
-clCreateFromD3D10Texture3DKHR(
-    cl_context context,
-    cl_mem_flags flags,
-    ID3D10Texture3D *resource,
-    UINT subresource,
-    cl_int *errcode_ret);
-
-extern CL_API_ENTRY cl_int CL_API_CALL 
-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);
-
-extern CL_API_ENTRY cl_int CL_API_CALL 
-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);
-
-/* cl_khr_d3d11_sharing */
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetDeviceIDsFromD3D11KHR)(
-    cl_platform_id             platform,
-    cl_d3d11_device_source_khr d3d_device_source,
-    void *                     d3d_object,
-    cl_d3d11_device_set_khr    d3d_device_set,
-    cl_uint                    num_entries,
-    cl_device_id *             devices,
-    cl_uint *                  num_devices) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromD3D11BufferKHR)(
-    cl_context     context,
-    cl_mem_flags   flags,
-    ID3D11Buffer * resource,
-    cl_int *       errcode_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromD3D11Texture2DKHR)(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D11Texture2D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromD3D11Texture3DKHR)(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D11Texture3D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueAcquireD3D11ObjectsKHR)(
-    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_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueReleaseD3D11ObjectsKHR)(
-    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_API_SUFFIX__VERSION_1_2;
-
-/* cl_khr_dx9_media_sharing */
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetDeviceIDsFromDX9MediaAdapterKHR)(
-    cl_platform_id                  platform,
-    cl_uint                         num_media_adapters,
-    cl_dx9_media_adapter_type_khr * media_adapters_type,
-    void *                          media_adapters,
-    cl_dx9_media_adapter_set_khr    media_adapter_set,
-    cl_uint                         num_entries,
-    cl_device_id *                  devices,
-    cl_uint *                       num_devices) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromDX9MediaSurfaceKHR)(
-    cl_context                    context,
-    cl_mem_flags                  flags,
-    cl_dx9_media_adapter_type_khr adapter_type,
-    void *                        surface_info,
-    cl_uint                       plane,                                                                          
-    cl_int *                      errcode_ret) CL_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueAcquireDX9MediaSurfacesKHR)(
-    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_API_SUFFIX__VERSION_1_2;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueReleaseDX9MediaSurfacesKHR)(
-    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_API_SUFFIX__VERSION_1_2;
-
-/* cl_khr_d3d11_sharing */
-extern CL_API_ENTRY cl_int CL_API_CALL
-clGetDeviceIDsFromD3D11KHR(
-    cl_platform_id             platform,
-    cl_d3d11_device_source_khr d3d_device_source,
-    void *                     d3d_object,
-    cl_d3d11_device_set_khr    d3d_device_set,
-    cl_uint                    num_entries,
-    cl_device_id *             devices,
-    cl_uint *                  num_devices);
-
-extern CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromD3D11BufferKHR(
-    cl_context     context,
-    cl_mem_flags   flags,
-    ID3D11Buffer * resource,
-    cl_int *       errcode_ret);
-
-extern CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromD3D11Texture2DKHR(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D11Texture2D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret);
-
-extern CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromD3D11Texture3DKHR(
-    cl_context        context,
-    cl_mem_flags      flags,
-    ID3D11Texture3D * resource,
-    UINT              subresource,
-    cl_int *          errcode_ret);
-
-extern CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueAcquireD3D11ObjectsKHR(
-    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);
-
-extern CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueReleaseD3D11ObjectsKHR(
-    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_khr_dx9_media_sharing */
-extern CL_API_ENTRY cl_int CL_API_CALL
-clGetDeviceIDsFromDX9MediaAdapterKHR(
-    cl_platform_id                 platform,
-    cl_uint                        num_media_adapters,
-    cl_dx9_media_adapter_type_khr * media_adapter_type,
-    void *                         media_adapters,
-    cl_dx9_media_adapter_set_khr   media_adapter_set,
-    cl_uint                        num_entries,
-    cl_device_id *                 devices,
-    cl_uint *                      num_devices);
-
-extern CL_API_ENTRY cl_mem CL_API_CALL
-clCreateFromDX9MediaSurfaceKHR(
-    cl_context                    context,
-    cl_mem_flags                  flags,
-    cl_dx9_media_adapter_type_khr adapter_type,
-    void *                        surface_info,
-    cl_uint                       plane,                                                                          
-    cl_int *                      errcode_ret);
-
-extern CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueAcquireDX9MediaSurfacesKHR(
-    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);
-
-extern CL_API_ENTRY cl_int CL_API_CALL
-clEnqueueReleaseDX9MediaSurfacesKHR(
-    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);
-
-#else
-
-/* cl_khr_d3d10_sharing */
-typedef void *KHRpfn_clGetDeviceIDsFromD3D10KHR;
-typedef void *KHRpfn_clCreateFromD3D10BufferKHR;
-typedef void *KHRpfn_clCreateFromD3D10Texture2DKHR;
-typedef void *KHRpfn_clCreateFromD3D10Texture3DKHR;
-typedef void *KHRpfn_clEnqueueAcquireD3D10ObjectsKHR;
-typedef void *KHRpfn_clEnqueueReleaseD3D10ObjectsKHR;
-
-/* cl_khr_d3d11_sharing */
-typedef void *KHRpfn_clGetDeviceIDsFromD3D11KHR;
-typedef void *KHRpfn_clCreateFromD3D11BufferKHR;
-typedef void *KHRpfn_clCreateFromD3D11Texture2DKHR;
-typedef void *KHRpfn_clCreateFromD3D11Texture3DKHR;
-typedef void *KHRpfn_clEnqueueAcquireD3D11ObjectsKHR;
-typedef void *KHRpfn_clEnqueueReleaseD3D11ObjectsKHR;
-
-/* cl_khr_dx9_media_sharing */
-typedef void *KHRpfn_clCreateFromDX9MediaSurfaceKHR;
-typedef void *KHRpfn_clEnqueueAcquireDX9MediaSurfacesKHR;
-typedef void *KHRpfn_clEnqueueReleaseDX9MediaSurfacesKHR;
-typedef void *KHRpfn_clGetDeviceIDsFromDX9MediaAdapterKHR;
-
-#endif
-
-/* OpenCL 1.1 */
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetEventCallback)(
-    cl_event            /* event */,
-    cl_int              /* command_exec_callback_type */,
-    void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
-    void *              /* user_data */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateSubBuffer)(
-    cl_mem                   /* buffer */,
-    cl_mem_flags             /* flags */,
-    cl_buffer_create_type    /* buffer_create_type */,
-    const void *             /* buffer_create_info */,
-    cl_int *                 /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetMemObjectDestructorCallback)(
-    cl_mem /* memobj */, 
-    void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), 
-    void * /*user_data */ ) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_event (CL_API_CALL *KHRpfn_clCreateUserEvent)(
-    cl_context    /* context */,
-    cl_int *      /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetUserEventStatus)(
-    cl_event   /* event */,
-    cl_int     /* execution_status */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clCreateSubDevicesEXT)(
-    cl_device_id     in_device,
-    const cl_device_partition_property_ext * partition_properties,
-    cl_uint          num_entries,
-    cl_device_id *   out_devices,
-    cl_uint *        num_devices);
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL * KHRpfn_clRetainDeviceEXT)(
-    cl_device_id     device) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL * KHRpfn_clReleaseDeviceEXT)(
-    cl_device_id     device) CL_API_SUFFIX__VERSION_1_0;
-
-/* cl_khr_egl_image */
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *KHRpfn_clCreateFromEGLImageKHR)(
-    cl_context context,
-    CLeglDisplayKHR display,
-    CLeglImageKHR image,
-    cl_mem_flags flags,
-    const cl_egl_image_properties_khr *properties,
-    cl_int *errcode_ret);
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueAcquireEGLObjectsKHR)(
-    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);
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueReleaseEGLObjectsKHR)(
-    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_khr_egl_event */
-typedef CL_API_ENTRY cl_event (CL_API_CALL *KHRpfn_clCreateEventFromEGLSyncKHR)(
-    cl_context context,
-    CLeglSyncKHR sync,
-    CLeglDisplayKHR display,
-    cl_int *errcode_ret);
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clSetDefaultDeviceCommandQueue)(
-    cl_context context,
-    cl_device_id device,
-    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_2_1;
-
-typedef CL_API_ENTRY cl_program (CL_API_CALL *KHRpfn_clCreateProgramWithIL)(
-    cl_context context,
-    const void * il,
-    size_t length,
-    cl_int * errcode_ret) CL_API_SUFFIX__VERSION_2_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetKernelSubGroupInfo )(
-    cl_kernel kernel,
-    cl_device_id device,
-    cl_kernel_sub_group_info param_name,
-    size_t input_value_size,
-    const void * input_value,
-    size_t param_value_size,
-    void * param_value,
-    size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_2_1;
-
-typedef CL_API_ENTRY cl_kernel (CL_API_CALL *KHRpfn_clCloneKernel)(
-    cl_kernel source_kernel, 
-    cl_int * errcode_ret) CL_API_SUFFIX__VERSION_2_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clEnqueueSVMMigrateMem)(
-    cl_command_queue command_queue,
-    cl_uint num_svm_pointers,
-    const void ** svm_pointers,
-    const size_t * sizes,
-    cl_mem_migration_flags flags,
-    cl_uint num_events_in_wait_list,
-    const cl_event * event_wait_list,
-    cl_event * event) CL_API_SUFFIX__VERSION_2_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetDeviceAndHostTimer)(
-    cl_device_id device,
-    cl_ulong * device_timestamp,
-    cl_ulong * host_timestamp) CL_API_SUFFIX__VERSION_2_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *KHRpfn_clGetHostTimer)(
-    cl_device_id device,
-    cl_ulong * host_timestamp) CL_API_SUFFIX__VERSION_2_1;
-
-/*
- *
- * vendor dispatch table structure
- *
- * note that the types in the structure KHRicdVendorDispatch mirror the function 
- * names listed in the string table khrIcdVendorDispatchFunctionNames
- *
- */
-
-typedef struct KHRicdVendorDispatchRec KHRicdVendorDispatch;
-
-struct KHRicdVendorDispatchRec
-{
-    /* OpenCL 1.0 */
-    KHRpfn_clGetPlatformIDs                         clGetPlatformIDs;
-    KHRpfn_clGetPlatformInfo                        clGetPlatformInfo;
-    KHRpfn_clGetDeviceIDs                           clGetDeviceIDs;
-    KHRpfn_clGetDeviceInfo                          clGetDeviceInfo;
-    KHRpfn_clCreateContext                          clCreateContext;
-    KHRpfn_clCreateContextFromType                  clCreateContextFromType;
-    KHRpfn_clRetainContext                          clRetainContext;
-    KHRpfn_clReleaseContext                         clReleaseContext;
-    KHRpfn_clGetContextInfo                         clGetContextInfo;
-    KHRpfn_clCreateCommandQueue                     clCreateCommandQueue;
-    KHRpfn_clRetainCommandQueue                     clRetainCommandQueue;
-    KHRpfn_clReleaseCommandQueue                    clReleaseCommandQueue;
-    KHRpfn_clGetCommandQueueInfo                    clGetCommandQueueInfo;
-    KHRpfn_clSetCommandQueueProperty                clSetCommandQueueProperty;
-    KHRpfn_clCreateBuffer                           clCreateBuffer;
-    KHRpfn_clCreateImage2D                          clCreateImage2D;
-    KHRpfn_clCreateImage3D                          clCreateImage3D;
-    KHRpfn_clRetainMemObject                        clRetainMemObject;
-    KHRpfn_clReleaseMemObject                       clReleaseMemObject;
-    KHRpfn_clGetSupportedImageFormats               clGetSupportedImageFormats;
-    KHRpfn_clGetMemObjectInfo                       clGetMemObjectInfo;
-    KHRpfn_clGetImageInfo                           clGetImageInfo;
-    KHRpfn_clCreateSampler                          clCreateSampler;
-    KHRpfn_clRetainSampler                          clRetainSampler;
-    KHRpfn_clReleaseSampler                         clReleaseSampler;
-    KHRpfn_clGetSamplerInfo                         clGetSamplerInfo;
-    KHRpfn_clCreateProgramWithSource                clCreateProgramWithSource;
-    KHRpfn_clCreateProgramWithBinary                clCreateProgramWithBinary;
-    KHRpfn_clRetainProgram                          clRetainProgram;
-    KHRpfn_clReleaseProgram                         clReleaseProgram;
-    KHRpfn_clBuildProgram                           clBuildProgram;
-    KHRpfn_clUnloadCompiler                         clUnloadCompiler;
-    KHRpfn_clGetProgramInfo                         clGetProgramInfo;
-    KHRpfn_clGetProgramBuildInfo                    clGetProgramBuildInfo;
-    KHRpfn_clCreateKernel                           clCreateKernel;
-    KHRpfn_clCreateKernelsInProgram                 clCreateKernelsInProgram;
-    KHRpfn_clRetainKernel                           clRetainKernel;
-    KHRpfn_clReleaseKernel                          clReleaseKernel;
-    KHRpfn_clSetKernelArg                           clSetKernelArg;
-    KHRpfn_clGetKernelInfo                          clGetKernelInfo;
-    KHRpfn_clGetKernelWorkGroupInfo                 clGetKernelWorkGroupInfo;
-    KHRpfn_clWaitForEvents                          clWaitForEvents;
-    KHRpfn_clGetEventInfo                           clGetEventInfo;
-    KHRpfn_clRetainEvent                            clRetainEvent;
-    KHRpfn_clReleaseEvent                           clReleaseEvent;
-    KHRpfn_clGetEventProfilingInfo                  clGetEventProfilingInfo;
-    KHRpfn_clFlush                                  clFlush;
-    KHRpfn_clFinish                                 clFinish;
-    KHRpfn_clEnqueueReadBuffer                      clEnqueueReadBuffer;
-    KHRpfn_clEnqueueWriteBuffer                     clEnqueueWriteBuffer;
-    KHRpfn_clEnqueueCopyBuffer                      clEnqueueCopyBuffer;
-    KHRpfn_clEnqueueReadImage                       clEnqueueReadImage;
-    KHRpfn_clEnqueueWriteImage                      clEnqueueWriteImage;
-    KHRpfn_clEnqueueCopyImage                       clEnqueueCopyImage;
-    KHRpfn_clEnqueueCopyImageToBuffer               clEnqueueCopyImageToBuffer;
-    KHRpfn_clEnqueueCopyBufferToImage               clEnqueueCopyBufferToImage;
-    KHRpfn_clEnqueueMapBuffer                       clEnqueueMapBuffer;
-    KHRpfn_clEnqueueMapImage                        clEnqueueMapImage;
-    KHRpfn_clEnqueueUnmapMemObject                  clEnqueueUnmapMemObject;
-    KHRpfn_clEnqueueNDRangeKernel                   clEnqueueNDRangeKernel;
-    KHRpfn_clEnqueueTask                            clEnqueueTask;
-    KHRpfn_clEnqueueNativeKernel                    clEnqueueNativeKernel;
-    KHRpfn_clEnqueueMarker                          clEnqueueMarker;
-    KHRpfn_clEnqueueWaitForEvents                   clEnqueueWaitForEvents;
-    KHRpfn_clEnqueueBarrier                         clEnqueueBarrier;
-    KHRpfn_clGetExtensionFunctionAddress            clGetExtensionFunctionAddress;
-    KHRpfn_clCreateFromGLBuffer                     clCreateFromGLBuffer;
-    KHRpfn_clCreateFromGLTexture2D                  clCreateFromGLTexture2D;
-    KHRpfn_clCreateFromGLTexture3D                  clCreateFromGLTexture3D;
-    KHRpfn_clCreateFromGLRenderbuffer               clCreateFromGLRenderbuffer;
-    KHRpfn_clGetGLObjectInfo                        clGetGLObjectInfo;
-    KHRpfn_clGetGLTextureInfo                       clGetGLTextureInfo;
-    KHRpfn_clEnqueueAcquireGLObjects                clEnqueueAcquireGLObjects;
-    KHRpfn_clEnqueueReleaseGLObjects                clEnqueueReleaseGLObjects;
-    KHRpfn_clGetGLContextInfoKHR                    clGetGLContextInfoKHR;
-
-    /* cl_khr_d3d10_sharing */
-    KHRpfn_clGetDeviceIDsFromD3D10KHR               clGetDeviceIDsFromD3D10KHR;
-    KHRpfn_clCreateFromD3D10BufferKHR               clCreateFromD3D10BufferKHR;
-    KHRpfn_clCreateFromD3D10Texture2DKHR            clCreateFromD3D10Texture2DKHR;
-    KHRpfn_clCreateFromD3D10Texture3DKHR            clCreateFromD3D10Texture3DKHR;
-    KHRpfn_clEnqueueAcquireD3D10ObjectsKHR          clEnqueueAcquireD3D10ObjectsKHR;
-    KHRpfn_clEnqueueReleaseD3D10ObjectsKHR          clEnqueueReleaseD3D10ObjectsKHR;
-
-    /* OpenCL 1.1 */
-    KHRpfn_clSetEventCallback                       clSetEventCallback;
-    KHRpfn_clCreateSubBuffer                        clCreateSubBuffer;
-    KHRpfn_clSetMemObjectDestructorCallback         clSetMemObjectDestructorCallback;
-    KHRpfn_clCreateUserEvent                        clCreateUserEvent;
-    KHRpfn_clSetUserEventStatus                     clSetUserEventStatus;
-    KHRpfn_clEnqueueReadBufferRect                  clEnqueueReadBufferRect;
-    KHRpfn_clEnqueueWriteBufferRect                 clEnqueueWriteBufferRect;
-    KHRpfn_clEnqueueCopyBufferRect                  clEnqueueCopyBufferRect;
-
-    /* cl_ext_device_fission */
-    KHRpfn_clCreateSubDevicesEXT                    clCreateSubDevicesEXT;
-    KHRpfn_clRetainDeviceEXT                        clRetainDeviceEXT;
-    KHRpfn_clReleaseDeviceEXT                       clReleaseDeviceEXT;
-
-    /* cl_khr_gl_event */
-    KHRpfn_clCreateEventFromGLsyncKHR               clCreateEventFromGLsyncKHR;
-
-    /* OpenCL 1.2 */
-    KHRpfn_clCreateSubDevices                       clCreateSubDevices;
-    KHRpfn_clRetainDevice                           clRetainDevice;
-    KHRpfn_clReleaseDevice                          clReleaseDevice;
-    KHRpfn_clCreateImage                            clCreateImage;
-    KHRpfn_clCreateProgramWithBuiltInKernels        clCreateProgramWithBuiltInKernels;
-    KHRpfn_clCompileProgram                         clCompileProgram;
-    KHRpfn_clLinkProgram                            clLinkProgram;
-    KHRpfn_clUnloadPlatformCompiler                 clUnloadPlatformCompiler;
-    KHRpfn_clGetKernelArgInfo                       clGetKernelArgInfo;
-    KHRpfn_clEnqueueFillBuffer                      clEnqueueFillBuffer;
-    KHRpfn_clEnqueueFillImage                       clEnqueueFillImage;
-    KHRpfn_clEnqueueMigrateMemObjects               clEnqueueMigrateMemObjects;
-    KHRpfn_clEnqueueMarkerWithWaitList              clEnqueueMarkerWithWaitList;
-    KHRpfn_clEnqueueBarrierWithWaitList             clEnqueueBarrierWithWaitList;
-    KHRpfn_clGetExtensionFunctionAddressForPlatform clGetExtensionFunctionAddressForPlatform;
-    KHRpfn_clCreateFromGLTexture                    clCreateFromGLTexture;
-
-    /* cl_khr_d3d11_sharing */
-    KHRpfn_clGetDeviceIDsFromD3D11KHR               clGetDeviceIDsFromD3D11KHR;
-    KHRpfn_clCreateFromD3D11BufferKHR               clCreateFromD3D11BufferKHR;
-    KHRpfn_clCreateFromD3D11Texture2DKHR            clCreateFromD3D11Texture2DKHR;
-    KHRpfn_clCreateFromD3D11Texture3DKHR            clCreateFromD3D11Texture3DKHR;
-    KHRpfn_clCreateFromDX9MediaSurfaceKHR           clCreateFromDX9MediaSurfaceKHR;
-    KHRpfn_clEnqueueAcquireD3D11ObjectsKHR          clEnqueueAcquireD3D11ObjectsKHR;
-    KHRpfn_clEnqueueReleaseD3D11ObjectsKHR          clEnqueueReleaseD3D11ObjectsKHR;
-
-    /* cl_khr_dx9_media_sharing */
-    KHRpfn_clGetDeviceIDsFromDX9MediaAdapterKHR     clGetDeviceIDsFromDX9MediaAdapterKHR;
-    KHRpfn_clEnqueueAcquireDX9MediaSurfacesKHR      clEnqueueAcquireDX9MediaSurfacesKHR;
-    KHRpfn_clEnqueueReleaseDX9MediaSurfacesKHR      clEnqueueReleaseDX9MediaSurfacesKHR;
-
-    /* cl_khr_egl_image */
-    KHRpfn_clCreateFromEGLImageKHR                  clCreateFromEGLImageKHR;
-    KHRpfn_clEnqueueAcquireEGLObjectsKHR            clEnqueueAcquireEGLObjectsKHR;
-    KHRpfn_clEnqueueReleaseEGLObjectsKHR            clEnqueueReleaseEGLObjectsKHR;
-
-    /* cl_khr_egl_event */
-    KHRpfn_clCreateEventFromEGLSyncKHR              clCreateEventFromEGLSyncKHR;
-
-    /* OpenCL 2.0 */
-    KHRpfn_clCreateCommandQueueWithProperties       clCreateCommandQueueWithProperties;
-    KHRpfn_clCreatePipe                             clCreatePipe;
-    KHRpfn_clGetPipeInfo                            clGetPipeInfo;
-    KHRpfn_clSVMAlloc                               clSVMAlloc;
-    KHRpfn_clSVMFree                                clSVMFree;
-    KHRpfn_clEnqueueSVMFree                         clEnqueueSVMFree;
-    KHRpfn_clEnqueueSVMMemcpy                       clEnqueueSVMMemcpy;
-    KHRpfn_clEnqueueSVMMemFill                      clEnqueueSVMMemFill;
-    KHRpfn_clEnqueueSVMMap                          clEnqueueSVMMap;
-    KHRpfn_clEnqueueSVMUnmap                        clEnqueueSVMUnmap;
-    KHRpfn_clCreateSamplerWithProperties            clCreateSamplerWithProperties;
-    KHRpfn_clSetKernelArgSVMPointer                 clSetKernelArgSVMPointer;
-    KHRpfn_clSetKernelExecInfo                      clSetKernelExecInfo;
-
-    /* cl_khr_sub_groups */
-    KHRpfn_clGetKernelSubGroupInfoKHR               clGetKernelSubGroupInfoKHR;
-
-    /* OpenCL 2.1 */
-    KHRpfn_clCloneKernel                            clCloneKernel;
-    KHRpfn_clCreateProgramWithIL                    clCreateProgramWithIL;
-    KHRpfn_clEnqueueSVMMigrateMem                   clEnqueueSVMMigrateMem;
-    KHRpfn_clGetDeviceAndHostTimer                  clGetDeviceAndHostTimer;
-    KHRpfn_clGetHostTimer                           clGetHostTimer;
-    KHRpfn_clGetKernelSubGroupInfo                  clGetKernelSubGroupInfo;
-    KHRpfn_clSetDefaultDeviceCommandQueue           clSetDefaultDeviceCommandQueue;
-
-    /* OpenCL 2.2 */
-    KHRpfn_clSetProgramReleaseCallback              clSetProgramReleaseCallback;
-    KHRpfn_clSetProgramSpecializationConstant       clSetProgramSpecializationConstant;
-};
+#include <CL/cl_icd.h>
 
 /*
  *
@@ -1464,47 +69,47 @@
 
 struct _cl_platform_id
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 struct _cl_device_id
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 struct _cl_context
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 struct _cl_command_queue
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 struct _cl_mem
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 struct _cl_program
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 struct _cl_kernel
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 struct _cl_event
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 struct _cl_sampler
 {
-    KHRicdVendorDispatch *dispatch;
+    cl_icd_dispatch *dispatch;
 };
 
 #endif // _ICD_DISPATCH_H_
diff --git a/loader/icd_dispatch_generated.c b/loader/icd_dispatch_generated.c
new file mode 100644
index 0000000..8a05935
--- /dev/null
+++ b/loader/icd_dispatch_generated.c
@@ -0,0 +1,2618 @@
+/*
+ * Copyright (c) 2012-2020 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * OpenCL is a trademark of Apple Inc. used under license by Khronos.
+ */
+
+#include "icd_dispatch.h"
+#include "icd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// Core APIs:
+
+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
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
+    return platform->dispatch->clGetPlatformInfo(
+        platform,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetDeviceIDs(
+    cl_platform_id platform,
+    cl_device_type device_type,
+    cl_uint num_entries,
+    cl_device_id* devices,
+    cl_uint* num_devices) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
+    return platform->dispatch->clGetDeviceIDs(
+        platform,
+        device_type,
+        num_entries,
+        devices,
+        num_devices);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetDeviceInfo(
+    cl_device_id device,
+    cl_device_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
+    return device->dispatch->clGetDeviceInfo(
+        device,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_context CL_API_CALL clCreateContext(
+    const cl_context_properties* properties,
+    cl_uint num_devices,
+    const cl_device_id* devices,
+    void (CL_CALLBACK* pfn_notify)(const char* errinfo, const void* private_info, size_t cb, void* user_data),
+    void* user_data,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    if (num_devices == 0 || devices == NULL) {
+        KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(NULL, CL_INVALID_VALUE);
+    }
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(devices[0], CL_INVALID_DEVICE);
+    return devices[0]->dispatch->clCreateContext(
+        properties,
+        num_devices,
+        devices,
+        pfn_notify,
+        user_data,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_context CL_API_CALL clCreateContextFromType(
+    const cl_context_properties* properties,
+    cl_device_type device_type,
+    void (CL_CALLBACK* pfn_notify)(const char* errinfo, const void* private_info, size_t cb, void* user_data),
+    void* user_data,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    cl_platform_id platform = NULL;
+    khrIcdInitialize();
+    khrIcdContextPropertiesGetPlatform(properties, &platform);
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(platform, CL_INVALID_PLATFORM);
+    return platform->dispatch->clCreateContextFromType(
+        properties,
+        device_type,
+        pfn_notify,
+        user_data,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainContext(
+    cl_context context) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clRetainContext(
+        context);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseContext(
+    cl_context context) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clReleaseContext(
+        context);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetContextInfo(
+    cl_context context,
+    cl_context_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clGetContextInfo(
+        context,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainCommandQueue(
+    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clRetainCommandQueue(
+        command_queue);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseCommandQueue(
+    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clReleaseCommandQueue(
+        command_queue);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetCommandQueueInfo(
+    cl_command_queue command_queue,
+    cl_command_queue_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clGetCommandQueueInfo(
+        command_queue,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateBuffer(
+    cl_context context,
+    cl_mem_flags flags,
+    size_t size,
+    void* host_ptr,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateBuffer(
+        context,
+        flags,
+        size,
+        host_ptr,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainMemObject(
+    cl_mem memobj) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
+    return memobj->dispatch->clRetainMemObject(
+        memobj);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseMemObject(
+    cl_mem memobj) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
+    return memobj->dispatch->clReleaseMemObject(
+        memobj);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetSupportedImageFormats(
+    cl_context context,
+    cl_mem_flags flags,
+    cl_mem_object_type image_type,
+    cl_uint num_entries,
+    cl_image_format* image_formats,
+    cl_uint* num_image_formats) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clGetSupportedImageFormats(
+        context,
+        flags,
+        image_type,
+        num_entries,
+        image_formats,
+        num_image_formats);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetMemObjectInfo(
+    cl_mem memobj,
+    cl_mem_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
+    return memobj->dispatch->clGetMemObjectInfo(
+        memobj,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetImageInfo(
+    cl_mem image,
+    cl_image_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(image, CL_INVALID_MEM_OBJECT);
+    return image->dispatch->clGetImageInfo(
+        image,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainSampler(
+    cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(sampler, CL_INVALID_SAMPLER);
+    return sampler->dispatch->clRetainSampler(
+        sampler);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseSampler(
+    cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(sampler, CL_INVALID_SAMPLER);
+    return sampler->dispatch->clReleaseSampler(
+        sampler);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetSamplerInfo(
+    cl_sampler sampler,
+    cl_sampler_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(sampler, CL_INVALID_SAMPLER);
+    return sampler->dispatch->clGetSamplerInfo(
+        sampler,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithSource(
+    cl_context context,
+    cl_uint count,
+    const char** strings,
+    const size_t* lengths,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateProgramWithSource(
+        context,
+        count,
+        strings,
+        lengths,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithBinary(
+    cl_context context,
+    cl_uint num_devices,
+    const cl_device_id* device_list,
+    const size_t* lengths,
+    const unsigned char** binaries,
+    cl_int* binary_status,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateProgramWithBinary(
+        context,
+        num_devices,
+        device_list,
+        lengths,
+        binaries,
+        binary_status,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainProgram(
+    cl_program program) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clRetainProgram(
+        program);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseProgram(
+    cl_program program) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clReleaseProgram(
+        program);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clBuildProgram(
+    cl_program program,
+    cl_uint num_devices,
+    const cl_device_id* device_list,
+    const char* options,
+    void (CL_CALLBACK* pfn_notify)(cl_program program, void* user_data),
+    void* user_data) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clBuildProgram(
+        program,
+        num_devices,
+        device_list,
+        options,
+        pfn_notify,
+        user_data);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetProgramInfo(
+    cl_program program,
+    cl_program_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clGetProgramInfo(
+        program,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetProgramBuildInfo(
+    cl_program program,
+    cl_device_id device,
+    cl_program_build_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clGetProgramBuildInfo(
+        program,
+        device,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_kernel CL_API_CALL clCreateKernel(
+    cl_program program,
+    const char* kernel_name,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clCreateKernel(
+        program,
+        kernel_name,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clCreateKernelsInProgram(
+    cl_program program,
+    cl_uint num_kernels,
+    cl_kernel* kernels,
+    cl_uint* num_kernels_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clCreateKernelsInProgram(
+        program,
+        num_kernels,
+        kernels,
+        num_kernels_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainKernel(
+    cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clRetainKernel(
+        kernel);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseKernel(
+    cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clReleaseKernel(
+        kernel);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetKernelArg(
+    cl_kernel kernel,
+    cl_uint arg_index,
+    size_t arg_size,
+    const void* arg_value) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clSetKernelArg(
+        kernel,
+        arg_index,
+        arg_size,
+        arg_value);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetKernelInfo(
+    cl_kernel kernel,
+    cl_kernel_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clGetKernelInfo(
+        kernel,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetKernelWorkGroupInfo(
+    cl_kernel kernel,
+    cl_device_id device,
+    cl_kernel_work_group_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clGetKernelWorkGroupInfo(
+        kernel,
+        device,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clWaitForEvents(
+    cl_uint num_events,
+    const cl_event* event_list) CL_API_SUFFIX__VERSION_1_0
+{
+    if (num_events == 0 || event_list == NULL) {
+        return CL_INVALID_VALUE;
+    }
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event_list[0], CL_INVALID_EVENT);
+    return event_list[0]->dispatch->clWaitForEvents(
+        num_events,
+        event_list);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetEventInfo(
+    cl_event event,
+    cl_event_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
+    return event->dispatch->clGetEventInfo(
+        event,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainEvent(
+    cl_event event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
+    return event->dispatch->clRetainEvent(
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseEvent(
+    cl_event event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
+    return event->dispatch->clReleaseEvent(
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetEventProfilingInfo(
+    cl_event event,
+    cl_profiling_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
+    return event->dispatch->clGetEventProfilingInfo(
+        event,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clFlush(
+    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clFlush(
+        command_queue);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clFinish(
+    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clFinish(
+        command_queue);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadBuffer(
+    cl_command_queue command_queue,
+    cl_mem buffer,
+    cl_bool blocking_read,
+    size_t offset,
+    size_t size,
+    void* ptr,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueReadBuffer(
+        command_queue,
+        buffer,
+        blocking_read,
+        offset,
+        size,
+        ptr,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteBuffer(
+    cl_command_queue command_queue,
+    cl_mem buffer,
+    cl_bool blocking_write,
+    size_t offset,
+    size_t size,
+    const void* ptr,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueWriteBuffer(
+        command_queue,
+        buffer,
+        blocking_write,
+        offset,
+        size,
+        ptr,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyBuffer(
+    cl_command_queue command_queue,
+    cl_mem src_buffer,
+    cl_mem dst_buffer,
+    size_t src_offset,
+    size_t dst_offset,
+    size_t size,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueCopyBuffer(
+        command_queue,
+        src_buffer,
+        dst_buffer,
+        src_offset,
+        dst_offset,
+        size,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadImage(
+    cl_command_queue command_queue,
+    cl_mem image,
+    cl_bool blocking_read,
+    const size_t* origin,
+    const size_t* region,
+    size_t row_pitch,
+    size_t slice_pitch,
+    void* ptr,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueReadImage(
+        command_queue,
+        image,
+        blocking_read,
+        origin,
+        region,
+        row_pitch,
+        slice_pitch,
+        ptr,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteImage(
+    cl_command_queue command_queue,
+    cl_mem image,
+    cl_bool blocking_write,
+    const size_t* origin,
+    const size_t* region,
+    size_t input_row_pitch,
+    size_t input_slice_pitch,
+    const void* ptr,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueWriteImage(
+        command_queue,
+        image,
+        blocking_write,
+        origin,
+        region,
+        input_row_pitch,
+        input_slice_pitch,
+        ptr,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyImage(
+    cl_command_queue command_queue,
+    cl_mem src_image,
+    cl_mem dst_image,
+    const size_t* src_origin,
+    const size_t* dst_origin,
+    const size_t* region,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueCopyImage(
+        command_queue,
+        src_image,
+        dst_image,
+        src_origin,
+        dst_origin,
+        region,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyImageToBuffer(
+    cl_command_queue command_queue,
+    cl_mem src_image,
+    cl_mem dst_buffer,
+    const size_t* src_origin,
+    const size_t* region,
+    size_t dst_offset,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueCopyImageToBuffer(
+        command_queue,
+        src_image,
+        dst_buffer,
+        src_origin,
+        region,
+        dst_offset,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyBufferToImage(
+    cl_command_queue command_queue,
+    cl_mem src_buffer,
+    cl_mem dst_image,
+    size_t src_offset,
+    const size_t* dst_origin,
+    const size_t* region,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueCopyBufferToImage(
+        command_queue,
+        src_buffer,
+        dst_image,
+        src_offset,
+        dst_origin,
+        region,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY void* CL_API_CALL clEnqueueMapBuffer(
+    cl_command_queue command_queue,
+    cl_mem buffer,
+    cl_bool blocking_map,
+    cl_map_flags map_flags,
+    size_t offset,
+    size_t size,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueMapBuffer(
+        command_queue,
+        buffer,
+        blocking_map,
+        map_flags,
+        offset,
+        size,
+        num_events_in_wait_list,
+        event_wait_list,
+        event,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY void* CL_API_CALL clEnqueueMapImage(
+    cl_command_queue command_queue,
+    cl_mem image,
+    cl_bool blocking_map,
+    cl_map_flags map_flags,
+    const size_t* origin,
+    const size_t* region,
+    size_t* image_row_pitch,
+    size_t* image_slice_pitch,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueMapImage(
+        command_queue,
+        image,
+        blocking_map,
+        map_flags,
+        origin,
+        region,
+        image_row_pitch,
+        image_slice_pitch,
+        num_events_in_wait_list,
+        event_wait_list,
+        event,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueUnmapMemObject(
+    cl_command_queue command_queue,
+    cl_mem memobj,
+    void* mapped_ptr,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueUnmapMemObject(
+        command_queue,
+        memobj,
+        mapped_ptr,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueNDRangeKernel(
+    cl_command_queue command_queue,
+    cl_kernel kernel,
+    cl_uint work_dim,
+    const size_t* global_work_offset,
+    const size_t* global_work_size,
+    const size_t* local_work_size,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueNDRangeKernel(
+        command_queue,
+        kernel,
+        work_dim,
+        global_work_offset,
+        global_work_size,
+        local_work_size,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueNativeKernel(
+    cl_command_queue command_queue,
+    void (CL_CALLBACK* user_func)(void*),
+    void* args,
+    size_t cb_args,
+    cl_uint num_mem_objects,
+    const cl_mem* mem_list,
+    const void** args_mem_loc,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueNativeKernel(
+        command_queue,
+        user_func,
+        args,
+        cb_args,
+        num_mem_objects,
+        mem_list,
+        args_mem_loc,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetCommandQueueProperty(
+    cl_command_queue command_queue,
+    cl_command_queue_properties properties,
+    cl_bool enable,
+    cl_command_queue_properties* old_properties) CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clSetCommandQueueProperty(
+        command_queue,
+        properties,
+        enable,
+        old_properties);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateImage2D(
+    cl_context context,
+    cl_mem_flags flags,
+    const cl_image_format* image_format,
+    size_t image_width,
+    size_t image_height,
+    size_t image_row_pitch,
+    void* host_ptr,
+    cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateImage2D(
+        context,
+        flags,
+        image_format,
+        image_width,
+        image_height,
+        image_row_pitch,
+        host_ptr,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateImage3D(
+    cl_context context,
+    cl_mem_flags flags,
+    const cl_image_format* image_format,
+    size_t image_width,
+    size_t image_height,
+    size_t image_depth,
+    size_t image_row_pitch,
+    size_t image_slice_pitch,
+    void* host_ptr,
+    cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateImage3D(
+        context,
+        flags,
+        image_format,
+        image_width,
+        image_height,
+        image_depth,
+        image_row_pitch,
+        image_slice_pitch,
+        host_ptr,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueMarker(
+    cl_command_queue command_queue,
+    cl_event* event) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueMarker(
+        command_queue,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueWaitForEvents(
+    cl_command_queue command_queue,
+    cl_uint num_events,
+    const cl_event* event_list) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueWaitForEvents(
+        command_queue,
+        num_events,
+        event_list);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueBarrier(
+    cl_command_queue command_queue) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueBarrier(
+        command_queue);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clUnloadCompiler(
+    void ) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+{
+    // Nothing!
+    return CL_SUCCESS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_command_queue CL_API_CALL clCreateCommandQueue(
+    cl_context context,
+    cl_device_id device,
+    cl_command_queue_properties properties,
+    cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_2_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateCommandQueue(
+        context,
+        device,
+        properties,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_sampler CL_API_CALL clCreateSampler(
+    cl_context context,
+    cl_bool normalized_coords,
+    cl_addressing_mode addressing_mode,
+    cl_filter_mode filter_mode,
+    cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_2_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateSampler(
+        context,
+        normalized_coords,
+        addressing_mode,
+        filter_mode,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueTask(
+    cl_command_queue command_queue,
+    cl_kernel kernel,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_EXT_SUFFIX__VERSION_1_2_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueTask(
+        command_queue,
+        kernel,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateSubBuffer(
+    cl_mem buffer,
+    cl_mem_flags flags,
+    cl_buffer_create_type buffer_create_type,
+    const void* buffer_create_info,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(buffer, CL_INVALID_MEM_OBJECT);
+    return buffer->dispatch->clCreateSubBuffer(
+        buffer,
+        flags,
+        buffer_create_type,
+        buffer_create_info,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetMemObjectDestructorCallback(
+    cl_mem memobj,
+    void (CL_CALLBACK* pfn_notify)(cl_mem memobj, void* user_data),
+    void* user_data) CL_API_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
+    return memobj->dispatch->clSetMemObjectDestructorCallback(
+        memobj,
+        pfn_notify,
+        user_data);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_event CL_API_CALL clCreateUserEvent(
+    cl_context context,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateUserEvent(
+        context,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetUserEventStatus(
+    cl_event event,
+    cl_int execution_status) CL_API_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
+    return event->dispatch->clSetUserEventStatus(
+        event,
+        execution_status);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetEventCallback(
+    cl_event event,
+    cl_int command_exec_callback_type,
+    void (CL_CALLBACK* pfn_notify)(cl_event event, cl_int event_command_status, void *user_data),
+    void* user_data) CL_API_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(event, CL_INVALID_EVENT);
+    return event->dispatch->clSetEventCallback(
+        event,
+        command_exec_callback_type,
+        pfn_notify,
+        user_data);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadBufferRect(
+    cl_command_queue command_queue,
+    cl_mem buffer,
+    cl_bool blocking_read,
+    const size_t* buffer_offset,
+    const size_t* host_offset,
+    const size_t* region,
+    size_t buffer_row_pitch,
+    size_t buffer_slice_pitch,
+    size_t host_row_pitch,
+    size_t host_slice_pitch,
+    void* ptr,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueReadBufferRect(
+        command_queue,
+        buffer,
+        blocking_read,
+        buffer_offset,
+        host_offset,
+        region,
+        buffer_row_pitch,
+        buffer_slice_pitch,
+        host_row_pitch,
+        host_slice_pitch,
+        ptr,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteBufferRect(
+    cl_command_queue command_queue,
+    cl_mem buffer,
+    cl_bool blocking_write,
+    const size_t* buffer_offset,
+    const size_t* host_offset,
+    const size_t* region,
+    size_t buffer_row_pitch,
+    size_t buffer_slice_pitch,
+    size_t host_row_pitch,
+    size_t host_slice_pitch,
+    const void* ptr,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueWriteBufferRect(
+        command_queue,
+        buffer,
+        blocking_write,
+        buffer_offset,
+        host_offset,
+        region,
+        buffer_row_pitch,
+        buffer_slice_pitch,
+        host_row_pitch,
+        host_slice_pitch,
+        ptr,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyBufferRect(
+    cl_command_queue command_queue,
+    cl_mem src_buffer,
+    cl_mem dst_buffer,
+    const size_t* src_origin,
+    const size_t* dst_origin,
+    const size_t* region,
+    size_t src_row_pitch,
+    size_t src_slice_pitch,
+    size_t dst_row_pitch,
+    size_t dst_slice_pitch,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueCopyBufferRect(
+        command_queue,
+        src_buffer,
+        dst_buffer,
+        src_origin,
+        dst_origin,
+        region,
+        src_row_pitch,
+        src_slice_pitch,
+        dst_row_pitch,
+        dst_slice_pitch,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clCreateSubDevices(
+    cl_device_id in_device,
+    const cl_device_partition_property* properties,
+    cl_uint num_devices,
+    cl_device_id* out_devices,
+    cl_uint* num_devices_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(in_device, CL_INVALID_DEVICE);
+    return in_device->dispatch->clCreateSubDevices(
+        in_device,
+        properties,
+        num_devices,
+        out_devices,
+        num_devices_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainDevice(
+    cl_device_id device) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
+    return device->dispatch->clRetainDevice(
+        device);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseDevice(
+    cl_device_id device) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
+    return device->dispatch->clReleaseDevice(
+        device);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateImage(
+    cl_context context,
+    cl_mem_flags flags,
+    const cl_image_format* image_format,
+    const cl_image_desc* image_desc,
+    void* host_ptr,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateImage(
+        context,
+        flags,
+        image_format,
+        image_desc,
+        host_ptr,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithBuiltInKernels(
+    cl_context context,
+    cl_uint num_devices,
+    const cl_device_id* device_list,
+    const char* kernel_names,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateProgramWithBuiltInKernels(
+        context,
+        num_devices,
+        device_list,
+        kernel_names,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clCompileProgram(
+    cl_program program,
+    cl_uint num_devices,
+    const cl_device_id* device_list,
+    const char* options,
+    cl_uint num_input_headers,
+    const cl_program* input_headers,
+    const char** header_include_names,
+    void (CL_CALLBACK* pfn_notify)(cl_program program, void* user_data),
+    void* user_data) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clCompileProgram(
+        program,
+        num_devices,
+        device_list,
+        options,
+        num_input_headers,
+        input_headers,
+        header_include_names,
+        pfn_notify,
+        user_data);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_program CL_API_CALL clLinkProgram(
+    cl_context context,
+    cl_uint num_devices,
+    const cl_device_id* device_list,
+    const char* options,
+    cl_uint num_input_programs,
+    const cl_program* input_programs,
+    void (CL_CALLBACK* pfn_notify)(cl_program program, void* user_data),
+    void* user_data,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clLinkProgram(
+        context,
+        num_devices,
+        device_list,
+        options,
+        num_input_programs,
+        input_programs,
+        pfn_notify,
+        user_data,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clUnloadPlatformCompiler(
+    cl_platform_id platform) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
+    return platform->dispatch->clUnloadPlatformCompiler(
+        platform);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetKernelArgInfo(
+    cl_kernel kernel,
+    cl_uint arg_index,
+    cl_kernel_arg_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clGetKernelArgInfo(
+        kernel,
+        arg_index,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueFillBuffer(
+    cl_command_queue command_queue,
+    cl_mem buffer,
+    const void* pattern,
+    size_t pattern_size,
+    size_t offset,
+    size_t size,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueFillBuffer(
+        command_queue,
+        buffer,
+        pattern,
+        pattern_size,
+        offset,
+        size,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueFillImage(
+    cl_command_queue command_queue,
+    cl_mem image,
+    const void* fill_color,
+    const size_t* origin,
+    const size_t* region,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueFillImage(
+        command_queue,
+        image,
+        fill_color,
+        origin,
+        region,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueMigrateMemObjects(
+    cl_command_queue command_queue,
+    cl_uint num_mem_objects,
+    const cl_mem* mem_objects,
+    cl_mem_migration_flags flags,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueMigrateMemObjects(
+        command_queue,
+        num_mem_objects,
+        mem_objects,
+        flags,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueMarkerWithWaitList(
+    cl_command_queue command_queue,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueMarkerWithWaitList(
+        command_queue,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueBarrierWithWaitList(
+    cl_command_queue command_queue,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueBarrierWithWaitList(
+        command_queue,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_command_queue CL_API_CALL clCreateCommandQueueWithProperties(
+    cl_context context,
+    cl_device_id device,
+    const cl_queue_properties* properties,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateCommandQueueWithProperties(
+        context,
+        device,
+        properties,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreatePipe(
+    cl_context context,
+    cl_mem_flags flags,
+    cl_uint pipe_packet_size,
+    cl_uint pipe_max_packets,
+    const cl_pipe_properties* properties,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreatePipe(
+        context,
+        flags,
+        pipe_packet_size,
+        pipe_max_packets,
+        properties,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetPipeInfo(
+    cl_mem pipe,
+    cl_pipe_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(pipe, CL_INVALID_MEM_OBJECT);
+    return pipe->dispatch->clGetPipeInfo(
+        pipe,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY void* CL_API_CALL clSVMAlloc(
+    cl_context context,
+    cl_svm_mem_flags flags,
+    size_t size,
+    cl_uint alignment) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, NULL);
+    return context->dispatch->clSVMAlloc(
+        context,
+        flags,
+        size,
+        alignment);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY void CL_API_CALL clSVMFree(
+    cl_context context,
+    void* svm_pointer) CL_API_SUFFIX__VERSION_2_0
+{
+    if (context == NULL) return;
+    context->dispatch->clSVMFree(
+        context,
+        svm_pointer);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_sampler CL_API_CALL clCreateSamplerWithProperties(
+    cl_context context,
+    const cl_sampler_properties* sampler_properties,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateSamplerWithProperties(
+        context,
+        sampler_properties,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetKernelArgSVMPointer(
+    cl_kernel kernel,
+    cl_uint arg_index,
+    const void* arg_value) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clSetKernelArgSVMPointer(
+        kernel,
+        arg_index,
+        arg_value);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetKernelExecInfo(
+    cl_kernel kernel,
+    cl_kernel_exec_info param_name,
+    size_t param_value_size,
+    const void* param_value) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clSetKernelExecInfo(
+        kernel,
+        param_name,
+        param_value_size,
+        param_value);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueSVMFree(
+    cl_command_queue command_queue,
+    cl_uint num_svm_pointers,
+    void* svm_pointers[],
+    void (CL_CALLBACK* pfn_free_func)(cl_command_queue queue, cl_uint num_svm_pointers, void* svm_pointers[], void* user_data),
+    void* user_data,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueSVMFree(
+        command_queue,
+        num_svm_pointers,
+        svm_pointers,
+        pfn_free_func,
+        user_data,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueSVMMemcpy(
+    cl_command_queue command_queue,
+    cl_bool blocking_copy,
+    void* dst_ptr,
+    const void* src_ptr,
+    size_t size,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueSVMMemcpy(
+        command_queue,
+        blocking_copy,
+        dst_ptr,
+        src_ptr,
+        size,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueSVMMemFill(
+    cl_command_queue command_queue,
+    void* svm_ptr,
+    const void* pattern,
+    size_t pattern_size,
+    size_t size,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueSVMMemFill(
+        command_queue,
+        svm_ptr,
+        pattern,
+        pattern_size,
+        size,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueSVMMap(
+    cl_command_queue command_queue,
+    cl_bool blocking_map,
+    cl_map_flags flags,
+    void* svm_ptr,
+    size_t size,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueSVMMap(
+        command_queue,
+        blocking_map,
+        flags,
+        svm_ptr,
+        size,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueSVMUnmap(
+    cl_command_queue command_queue,
+    void* svm_ptr,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_2_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueSVMUnmap(
+        command_queue,
+        svm_ptr,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetDefaultDeviceCommandQueue(
+    cl_context context,
+    cl_device_id device,
+    cl_command_queue command_queue) CL_API_SUFFIX__VERSION_2_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clSetDefaultDeviceCommandQueue(
+        context,
+        device,
+        command_queue);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetDeviceAndHostTimer(
+    cl_device_id device,
+    cl_ulong* device_timestamp,
+    cl_ulong* host_timestamp) CL_API_SUFFIX__VERSION_2_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
+    return device->dispatch->clGetDeviceAndHostTimer(
+        device,
+        device_timestamp,
+        host_timestamp);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetHostTimer(
+    cl_device_id device,
+    cl_ulong* host_timestamp) CL_API_SUFFIX__VERSION_2_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
+    return device->dispatch->clGetHostTimer(
+        device,
+        host_timestamp);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithIL(
+    cl_context context,
+    const void* il,
+    size_t length,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_2_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateProgramWithIL(
+        context,
+        il,
+        length,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_kernel CL_API_CALL clCloneKernel(
+    cl_kernel source_kernel,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_2_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(source_kernel, CL_INVALID_KERNEL);
+    return source_kernel->dispatch->clCloneKernel(
+        source_kernel,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clGetKernelSubGroupInfo(
+    cl_kernel kernel,
+    cl_device_id device,
+    cl_kernel_sub_group_info param_name,
+    size_t input_value_size,
+    const void* input_value,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_2_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(kernel, CL_INVALID_KERNEL);
+    return kernel->dispatch->clGetKernelSubGroupInfo(
+        kernel,
+        device,
+        param_name,
+        input_value_size,
+        input_value,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueSVMMigrateMem(
+    cl_command_queue command_queue,
+    cl_uint num_svm_pointers,
+    const void** svm_pointers,
+    const size_t* sizes,
+    cl_mem_migration_flags flags,
+    cl_uint num_events_in_wait_list,
+    const cl_event* event_wait_list,
+    cl_event* event) CL_API_SUFFIX__VERSION_2_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueSVMMigrateMem(
+        command_queue,
+        num_svm_pointers,
+        svm_pointers,
+        sizes,
+        flags,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetProgramSpecializationConstant(
+    cl_program program,
+    cl_uint spec_id,
+    size_t spec_size,
+    const void* spec_value) CL_API_SUFFIX__VERSION_2_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clSetProgramSpecializationConstant(
+        program,
+        spec_id,
+        spec_size,
+        spec_value);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+CL_API_ENTRY cl_int CL_API_CALL clSetProgramReleaseCallback(
+    cl_program program,
+    void (CL_CALLBACK* pfn_notify)(cl_program program, void* user_data),
+    void* user_data) CL_EXT_SUFFIX__VERSION_2_2_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(program, CL_INVALID_PROGRAM);
+    return program->dispatch->clSetProgramReleaseCallback(
+        program,
+        pfn_notify,
+        user_data);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_ext_device_fission
+
+CL_API_ENTRY cl_int CL_API_CALL clReleaseDeviceEXT(
+    cl_device_id device) CL_EXT_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
+    return device->dispatch->clReleaseDeviceEXT(
+        device);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clRetainDeviceEXT(
+    cl_device_id device) CL_EXT_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(device, CL_INVALID_DEVICE);
+    return device->dispatch->clRetainDeviceEXT(
+        device);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clCreateSubDevicesEXT(
+    cl_device_id in_device,
+    const cl_device_partition_property_ext* properties,
+    cl_uint num_entries,
+    cl_device_id* out_devices,
+    cl_uint* num_devices) CL_EXT_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(in_device, CL_INVALID_DEVICE);
+    return in_device->dispatch->clCreateSubDevicesEXT(
+        in_device,
+        properties,
+        num_entries,
+        out_devices,
+        num_devices);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_khr_d3d10_sharing
+
+#if defined(_WIN32)
+
+CL_API_ENTRY cl_int CL_API_CALL 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_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
+    return platform->dispatch->clGetDeviceIDsFromD3D10KHR(
+        platform,
+        d3d_device_source,
+        d3d_object,
+        d3d_device_set,
+        num_entries,
+        devices,
+        num_devices);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D10BufferKHR(
+    cl_context context,
+    cl_mem_flags flags,
+    ID3D10Buffer* resource,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromD3D10BufferKHR(
+        context,
+        flags,
+        resource,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D10Texture2DKHR(
+    cl_context context,
+    cl_mem_flags flags,
+    ID3D10Texture2D* resource,
+    UINT subresource,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromD3D10Texture2DKHR(
+        context,
+        flags,
+        resource,
+        subresource,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D10Texture3DKHR(
+    cl_context context,
+    cl_mem_flags flags,
+    ID3D10Texture3D* resource,
+    UINT subresource,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromD3D10Texture3DKHR(
+        context,
+        flags,
+        resource,
+        subresource,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL 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_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueAcquireD3D10ObjectsKHR(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL 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) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueReleaseD3D10ObjectsKHR(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+#endif // defined(_WIN32)
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_khr_d3d11_sharing
+
+#if defined(_WIN32)
+
+CL_API_ENTRY cl_int CL_API_CALL clGetDeviceIDsFromD3D11KHR(
+    cl_platform_id platform,
+    cl_d3d11_device_source_khr d3d_device_source,
+    void* d3d_object,
+    cl_d3d11_device_set_khr d3d_device_set,
+    cl_uint num_entries,
+    cl_device_id* devices,
+    cl_uint* num_devices) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
+    return platform->dispatch->clGetDeviceIDsFromD3D11KHR(
+        platform,
+        d3d_device_source,
+        d3d_object,
+        d3d_device_set,
+        num_entries,
+        devices,
+        num_devices);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D11BufferKHR(
+    cl_context context,
+    cl_mem_flags flags,
+    ID3D11Buffer* resource,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromD3D11BufferKHR(
+        context,
+        flags,
+        resource,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D11Texture2DKHR(
+    cl_context context,
+    cl_mem_flags flags,
+    ID3D11Texture2D* resource,
+    UINT subresource,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromD3D11Texture2DKHR(
+        context,
+        flags,
+        resource,
+        subresource,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D11Texture3DKHR(
+    cl_context context,
+    cl_mem_flags flags,
+    ID3D11Texture3D* resource,
+    UINT subresource,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromD3D11Texture3DKHR(
+        context,
+        flags,
+        resource,
+        subresource,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireD3D11ObjectsKHR(
+    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_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueAcquireD3D11ObjectsKHR(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseD3D11ObjectsKHR(
+    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_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueReleaseD3D11ObjectsKHR(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+#endif // defined(_WIN32)
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_khr_dx9_media_sharing
+
+#if defined(_WIN32)
+
+CL_API_ENTRY cl_int CL_API_CALL clGetDeviceIDsFromDX9MediaAdapterKHR(
+    cl_platform_id platform,
+    cl_uint num_media_adapters,
+    cl_dx9_media_adapter_type_khr* media_adapter_type,
+    void* media_adapters,
+    cl_dx9_media_adapter_set_khr media_adapter_set,
+    cl_uint num_entries,
+    cl_device_id* devices,
+    cl_uint* num_devices) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
+    return platform->dispatch->clGetDeviceIDsFromDX9MediaAdapterKHR(
+        platform,
+        num_media_adapters,
+        media_adapter_type,
+        media_adapters,
+        media_adapter_set,
+        num_entries,
+        devices,
+        num_devices);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromDX9MediaSurfaceKHR(
+    cl_context context,
+    cl_mem_flags flags,
+    cl_dx9_media_adapter_type_khr adapter_type,
+    void* surface_info,
+    cl_uint plane,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromDX9MediaSurfaceKHR(
+        context,
+        flags,
+        adapter_type,
+        surface_info,
+        plane,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireDX9MediaSurfacesKHR(
+    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_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueAcquireDX9MediaSurfacesKHR(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseDX9MediaSurfacesKHR(
+    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_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueReleaseDX9MediaSurfacesKHR(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+#endif // defined(_WIN32)
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_khr_egl_event
+
+CL_API_ENTRY cl_event CL_API_CALL clCreateEventFromEGLSyncKHR(
+    cl_context context,
+    CLeglSyncKHR sync,
+    CLeglDisplayKHR display,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateEventFromEGLSyncKHR(
+        context,
+        sync,
+        display,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_khr_egl_image
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromEGLImageKHR(
+    cl_context context,
+    CLeglDisplayKHR egldisplay,
+    CLeglImageKHR eglimage,
+    cl_mem_flags flags,
+    const cl_egl_image_properties_khr* properties,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromEGLImageKHR(
+        context,
+        egldisplay,
+        eglimage,
+        flags,
+        properties,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireEGLObjectsKHR(
+    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_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueAcquireEGLObjectsKHR(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseEGLObjectsKHR(
+    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_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueReleaseEGLObjectsKHR(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_khr_gl_event
+
+CL_API_ENTRY cl_event CL_API_CALL clCreateEventFromGLsyncKHR(
+    cl_context context,
+    cl_GLsync sync,
+    cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_1
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateEventFromGLsyncKHR(
+        context,
+        sync,
+        errcode_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_khr_gl_sharing
+
+CL_API_ENTRY cl_int CL_API_CALL 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) CL_API_SUFFIX__VERSION_1_0
+{
+    cl_platform_id platform = NULL;
+    khrIcdInitialize();
+    khrIcdContextPropertiesGetPlatform(properties, &platform);
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
+    return platform->dispatch->clGetGLContextInfoKHR(
+        properties,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLBuffer(
+    cl_context context,
+    cl_mem_flags flags,
+    cl_GLuint bufobj,
+    int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromGLBuffer(
+        context,
+        flags,
+        bufobj,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture(
+    cl_context context,
+    cl_mem_flags flags,
+    cl_GLenum target,
+    cl_GLint miplevel,
+    cl_GLuint texture,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromGLTexture(
+        context,
+        flags,
+        target,
+        miplevel,
+        texture,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture2D(
+    cl_context context,
+    cl_mem_flags flags,
+    cl_GLenum target,
+    cl_GLint miplevel,
+    cl_GLuint texture,
+    cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromGLTexture2D(
+        context,
+        flags,
+        target,
+        miplevel,
+        texture,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture3D(
+    cl_context context,
+    cl_mem_flags flags,
+    cl_GLenum target,
+    cl_GLint miplevel,
+    cl_GLuint texture,
+    cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromGLTexture3D(
+        context,
+        flags,
+        target,
+        miplevel,
+        texture,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLRenderbuffer(
+    cl_context context,
+    cl_mem_flags flags,
+    cl_GLuint renderbuffer,
+    cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(context, CL_INVALID_CONTEXT);
+    return context->dispatch->clCreateFromGLRenderbuffer(
+        context,
+        flags,
+        renderbuffer,
+        errcode_ret);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clGetGLObjectInfo(
+    cl_mem memobj,
+    cl_gl_object_type* gl_object_type,
+    cl_GLuint* gl_object_name) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
+    return memobj->dispatch->clGetGLObjectInfo(
+        memobj,
+        gl_object_type,
+        gl_object_name);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clGetGLTextureInfo(
+    cl_mem memobj,
+    cl_gl_texture_info param_name,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(memobj, CL_INVALID_MEM_OBJECT);
+    return memobj->dispatch->clGetGLTextureInfo(
+        memobj,
+        param_name,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireGLObjects(
+    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_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueAcquireGLObjects(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseGLObjects(
+    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_API_SUFFIX__VERSION_1_0
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(command_queue, CL_INVALID_COMMAND_QUEUE);
+    return command_queue->dispatch->clEnqueueReleaseGLObjects(
+        command_queue,
+        num_objects,
+        mem_objects,
+        num_events_in_wait_list,
+        event_wait_list,
+        event);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+// cl_khr_subgroups
+
+CL_API_ENTRY cl_int CL_API_CALL clGetKernelSubGroupInfoKHR(
+    cl_kernel in_kernel,
+    cl_device_id in_device,
+    cl_kernel_sub_group_info param_name,
+    size_t input_value_size,
+    const void* input_value,
+    size_t param_value_size,
+    void* param_value,
+    size_t* param_value_size_ret) CL_EXT_SUFFIX__VERSION_2_0_DEPRECATED
+{
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(in_kernel, CL_INVALID_KERNEL);
+    return in_kernel->dispatch->clGetKernelSubGroupInfoKHR(
+        in_kernel,
+        in_device,
+        param_name,
+        input_value_size,
+        input_value,
+        param_value_size,
+        param_value,
+        param_value_size_ret);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/loader/icd_platform.h b/loader/icd_platform.h
index b16d0db..f84f519 100644
--- a/loader/icd_platform.h
+++ b/loader/icd_platform.h
@@ -24,9 +24,9 @@
 #define PATH_SEPARATOR  ':'
 #define DIRECTORY_SYMBOL '/'
 #ifdef __ANDROID__
-#define ICD_VENDOR_PATH "/system/vendor/Khronos/OpenCL/vendors/";
+#define ICD_VENDOR_PATH "/system/vendor/Khronos/OpenCL/vendors";
 #else
-#define ICD_VENDOR_PATH "/etc/OpenCL/vendors/";
+#define ICD_VENDOR_PATH "/etc/OpenCL/vendors";
 #endif // ANDROID
 
 #elif defined(_WIN32)
diff --git a/loader/linux/icd_exports.map b/loader/linux/icd_exports.map.in
similarity index 94%
rename from loader/linux/icd_exports.map
rename to loader/linux/icd_exports.map.in
index c716a39..8ef522b 100644
--- a/loader/linux/icd_exports.map
+++ b/loader/linux/icd_exports.map.in
@@ -163,3 +163,12 @@
         clSetProgramReleaseCallback;
         clSetProgramSpecializationConstant;
 } OPENCL_2.1;
+
+@ENABLE_OPENCL30_SYMBOLS_START@
+OPENCL_3.0 {
+    global:
+        clCreateBufferWithProperties;
+        clCreateImageWithProperties;
+        clSetContextDestructorCallback;
+} OPENCL_2.2;
+@ENABLE_OPENCL30_SYMBOLS_END@
diff --git a/loader/linux/icd_linux.c b/loader/linux/icd_linux.c
index 809f095..bb21b2a 100644
--- a/loader/linux/icd_linux.c
+++ b/loader/linux/icd_linux.c
@@ -84,13 +84,13 @@
                     }
 
                     // allocate space for the full path of the vendor library name
-                    fileName = malloc(strlen(dirEntry->d_name) + strlen(vendorPath) + 1);
+                    fileName = malloc(strlen(dirEntry->d_name) + strlen(vendorPath) + 2);
                     if (!fileName)
                     {
                         KHR_ICD_TRACE("Failed allocate space for ICD file path\n");
                         break;
                     }
-                    sprintf(fileName, "%s%s", vendorPath, dirEntry->d_name);
+                    sprintf(fileName, "%s/%s", vendorPath, dirEntry->d_name);
 
                     // open the file and read its contents
                     fin = fopen(fileName, "r");
diff --git a/loader/windows/OpenCL.def b/loader/windows/OpenCL.def.in
similarity index 94%
rename from loader/windows/OpenCL.def
rename to loader/windows/OpenCL.def.in
index 98abc9b..7fbd39c 100644
--- a/loader/windows/OpenCL.def
+++ b/loader/windows/OpenCL.def.in
@@ -160,3 +160,7 @@
 clSetProgramReleaseCallback
 clSetProgramSpecializationConstant
 
+; OpenCL 3.0 API
+@ENABLE_OPENCL30_SYMBOLS@clCreateBufferWithProperties
+@ENABLE_OPENCL30_SYMBOLS@clCreateImageWithProperties
+@ENABLE_OPENCL30_SYMBOLS@clSetContextDestructorCallback
diff --git a/loader/windows/OpenCL.rc b/loader/windows/OpenCL.rc
index 71140c2..a0f2084 100644
--- a/loader/windows/OpenCL.rc
+++ b/loader/windows/OpenCL.rc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2019 The Khronos Group Inc.
+ * Copyright (c) 2016-2020 The Khronos Group Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
 
 #define OPENCL_ICD_LOADER_VERSION_MAJOR 2
 #define OPENCL_ICD_LOADER_VERSION_MINOR 2
-#define OPENCL_ICD_LOADER_VERSION_REV   5
+#define OPENCL_ICD_LOADER_VERSION_REV   9
 
 #ifdef RC_INVOKED
 
@@ -48,7 +48,7 @@
         BEGIN
             VALUE "FileDescription" ,"OpenCL Client DLL"
             VALUE "ProductName"     ,"Khronos OpenCL ICD Loader"
-            VALUE "LegalCopyright"  ,"Copyright \251 The Khronos Group Inc 2016-2019"
+            VALUE "LegalCopyright"  ,"Copyright \251 The Khronos Group Inc 2016-2020"
             VALUE "FileVersion"     ,OPENCL_ICD_LOADER_VERSION_STRING ".0"
             VALUE "CompanyName"     ,"Khronos Group"
             VALUE "InternalName"    ,"OpenCL"
diff --git a/loader/windows/adapter.h b/loader/windows/adapter.h
new file mode 100644
index 0000000..ef97d66
--- /dev/null
+++ b/loader/windows/adapter.h
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2019 The Khronos Group Inc.
+* Copyright (c) 2019 Valve Corporation
+* Copyright (c) 2019 LunarG, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+* Author: Lenny Komow <lenny@lunarg.com>
+*/
+
+typedef struct LoaderEnumAdapters2 {
+    ULONG adapter_count;
+    struct {
+        UINT handle;
+        LUID luid;
+        ULONG source_count;
+        BOOL present_move_regions_preferred;
+    } * adapters;
+} LoaderEnumAdapters2;
+
+typedef _Check_return_ NTSTATUS(APIENTRY *PFN_LoaderEnumAdapters2)(const LoaderEnumAdapters2 *);
+
+typedef enum AdapterInfoType {
+    LOADER_QUERY_TYPE_REGISTRY = 48,
+} AdapterInfoType;
+
+typedef struct LoaderQueryAdapterInfo {
+    UINT handle;
+    AdapterInfoType type;
+    VOID *private_data;
+    UINT private_data_size;
+} LoaderQueryAdapterInfo;
+
+typedef _Check_return_ NTSTATUS(APIENTRY *PFN_LoaderQueryAdapterInfo)(const LoaderQueryAdapterInfo *);
+
+typedef enum LoaderQueryRegistryType {
+    LOADER_QUERY_REGISTRY_ADAPTER_KEY = 1,
+} LoaderQueryRegistryType;
+
+typedef enum LoaderQueryRegistryStatus {
+    LOADER_QUERY_REGISTRY_STATUS_SUCCESS = 0,
+    LOADER_QUERY_REGISTRY_STATUS_BUFFER_OVERFLOW = 1,
+} LoaderQueryRegistryStatus;
+
+typedef struct LoaderQueryRegistryFlags {
+    union {
+        struct {
+            UINT translate_path : 1;
+            UINT mutable_value : 1;
+            UINT reserved : 30;
+        };
+        UINT value;
+    };
+} LoaderQueryRegistryFlags;
+
+typedef struct LoaderQueryRegistryInfo {
+    LoaderQueryRegistryType query_type;
+    LoaderQueryRegistryFlags query_flags;
+    WCHAR value_name[MAX_PATH];
+    ULONG value_type;
+    ULONG physical_adapter_index;
+    ULONG output_value_size;
+    LoaderQueryRegistryStatus status;
+    union {
+        DWORD output_dword;
+        UINT64 output_qword;
+        WCHAR output_string[1];
+        BYTE output_binary[1];
+    };
+} LoaderQueryRegistryInfo;
diff --git a/loader/windows/icd_windows.c b/loader/windows/icd_windows.c
index 3fec097..da884f6 100644
--- a/loader/windows/icd_windows.c
+++ b/loader/windows/icd_windows.c
@@ -20,6 +20,7 @@
 #include "icd_windows.h"
 #include "icd_windows_hkr.h"
 #include "icd_windows_dxgk.h"
+#include "icd_windows_apppackage.h"
 #include <stdio.h>
 #include <winreg.h>
 
@@ -118,6 +119,8 @@
             KHR_ICD_TRACE("Failed to enumerate HKR entries, continuing\n");
         }
     }
+    
+    status |= khrIcdOsVendorsEnumerateAppPackage();
 
     KHR_ICD_TRACE("Opening key HKLM\\%s...\n", platformsName);
     result = RegOpenKeyExA(
@@ -249,7 +252,12 @@
 // dynamically load a library.  returns NULL on failure
 void *khrIcdOsLibraryLoad(const char *libraryName)
 {
-    return (void *)LoadLibraryA(libraryName);
+    HMODULE hTemp = LoadLibraryExA(libraryName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+    if (!hTemp && GetLastError() == ERROR_INVALID_PARAMETER)
+    {
+        hTemp = LoadLibraryExA(libraryName, NULL, 0);
+    }
+    return (void*)hTemp;
 }
 
 // get a function pointer from a loaded library.  returns NULL on failure.
diff --git a/loader/windows/icd_windows_apppackage.cpp b/loader/windows/icd_windows_apppackage.cpp
new file mode 100644
index 0000000..96a0bb2
--- /dev/null
+++ b/loader/windows/icd_windows_apppackage.cpp
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * OpenCL is a trademark of Apple Inc. used under license by Khronos.
+ */
+
+extern "C"
+{
+#include "icd.h"
+#include "icd_windows.h"
+}
+
+#ifdef OPENCL_ICD_LOADER_DISABLE_OPENCLON12
+
+extern "C" bool khrIcdOsVendorsEnumerateAppPackage()
+{
+    KHR_ICD_TRACE("OpenCLOn12 is disabled\n");
+    return false;
+}
+
+#else
+
+#include "icd_windows_apppackage.h"
+
+#include <windows.management.deployment.h>
+#include <wrl/client.h>
+#include <wrl/wrappers/corewrappers.h>
+
+#include <locale>
+#include <codecvt>
+
+template <typename F>
+struct ScopeExit {
+    ScopeExit(F&& f) : f(std::forward<F>(f)) {}
+    ~ScopeExit() { f(); }
+    F f;
+};
+
+template <typename F>
+inline ScopeExit<F> MakeScopeExit(F&& f) {
+    return ScopeExit<F>(std::forward<F>(f));
+};
+
+using namespace Microsoft::WRL;
+using namespace Microsoft::WRL::Wrappers;
+
+extern "C" bool khrIcdOsVendorsEnumerateAppPackage()
+{
+    HRESULT hrInit = Windows::Foundation::Initialize(RO_INIT_MULTITHREADED);
+    if (hrInit == RPC_E_CHANGED_MODE)
+    {
+        hrInit = Windows::Foundation::Initialize(RO_INIT_SINGLETHREADED);
+    }
+    if (FAILED(hrInit))
+    {
+        KHR_ICD_TRACE("Failed to init WinRT\n");
+        return false;
+    }
+    auto Cleanup = MakeScopeExit([]()
+        {
+            Windows::Foundation::Uninitialize();
+        });
+
+    using ABI::Windows::Management::Deployment::IPackageManager;
+    ComPtr<IPackageManager> packageManager;
+    if (FAILED(Windows::Foundation::ActivateInstance(
+        HStringReference(RuntimeClass_Windows_Management_Deployment_PackageManager).Get(),
+        &packageManager)))
+    {
+        KHR_ICD_TRACE("Failed to get package manager\n");
+        return false;
+    }
+
+    using IPackageCollection = ABI::Windows::Foundation::Collections::__FIIterable_1_Windows__CApplicationModel__CPackage_t;
+    ComPtr<IPackageCollection> collection;
+    if (FAILED(packageManager->FindPackagesByUserSecurityIdPackageFamilyName(
+        HStringReference(L"").Get(),
+        HStringReference(L"Microsoft.D3DMappingLayers_8wekyb3d8bbwe").Get(),
+        &collection)))
+    {
+        KHR_ICD_TRACE("Failed to find mapping layers package\n");
+        return false;
+    }
+
+    using IPackageIterator = ABI::Windows::Foundation::Collections::IIterator<
+        ABI::Windows::ApplicationModel::Package*>;
+    ComPtr<IPackageIterator> iter;
+    if (FAILED(collection->First(&iter)))
+    {
+        KHR_ICD_TRACE("Failed to get package collection iterator\n");
+        return false;
+    }
+
+    while ([&iter]()
+        {
+            boolean hasCurrent = false;
+            return SUCCEEDED(iter->get_HasCurrent(&hasCurrent)) && hasCurrent;
+        }())
+    {
+        using ABI::Windows::ApplicationModel::IPackage;
+        ComPtr<IPackage> package;
+        if (FAILED(iter->get_Current(&package)))
+        {
+            KHR_ICD_TRACE("Failed to get package\n");
+            boolean hasCurrent = false;
+            (void)iter->MoveNext(&hasCurrent);
+            continue;
+        }
+
+        boolean hasCurrent = false;
+        (void)iter->MoveNext(&hasCurrent);
+
+        using ABI::Windows::Storage::IStorageFolder;
+        ComPtr<IStorageFolder> folder;
+        if (FAILED(package->get_InstalledLocation(&folder)))
+        {
+            KHR_ICD_TRACE("Failed to get package install folder\n");
+            continue;
+        }
+
+        using ABI::Windows::Storage::IStorageItem;
+        ComPtr<IStorageItem> item;
+        if (FAILED(folder.As(&item)))
+        {
+            KHR_ICD_TRACE("Failed to convert folder to storage item\n");
+            continue;
+        }
+
+        HString path;
+        if (FAILED(item->get_Path(path.GetAddressOf())))
+        {
+            KHR_ICD_TRACE("Failed to get path\n");
+            continue;
+        }
+
+        UINT pathSize = 0;
+        auto rawPath = path.GetRawBuffer(&pathSize);
+        if (pathSize == 0 || rawPath == nullptr)
+        {
+            KHR_ICD_TRACE("Failed to get path\n");
+            continue;
+        }
+        
+#if defined(_M_AMD64)
+#define PLATFORM_PATH L"x64"
+#elif defined(_M_ARM)
+#define PLATFORM_PATH L"arm"
+#elif defined(_M_ARM64)
+#define PLATFORM_PATH L"arm64"
+#elif defined(_M_IX86)
+#define PLATFORM_PATH L"x86"
+#endif
+
+        wchar_t dllPath[MAX_PATH];
+        wcscpy_s(dllPath, rawPath);
+        wcscat_s(dllPath, L"\\" PLATFORM_PATH L"\\OpenCLOn12.dll");
+
+        std::wstring_convert<std::codecvt_utf8<wchar_t>> convert;
+        std::string narrowDllPath = convert.to_bytes(dllPath);
+
+        adapterAdd(narrowDllPath.c_str(), {});
+        return true;
+    }
+    return false;
+}
+
+#endif
diff --git a/loader/windows/icd_windows_apppackage.h b/loader/windows/icd_windows_apppackage.h
new file mode 100644
index 0000000..d4c55da
--- /dev/null
+++ b/loader/windows/icd_windows_apppackage.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2017-2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * OpenCL is a trademark of Apple Inc. used under license by Khronos.
+ */
+
+#include <stdbool.h>
+#include "icd_windows.h"
+
+#ifdef __cplusplus
+extern "C"
+#endif
+bool khrIcdOsVendorsEnumerateAppPackage(void);
diff --git a/loader/windows/icd_windows_dxgk.c b/loader/windows/icd_windows_dxgk.c
index 660dbb6..65e896a 100644
--- a/loader/windows/icd_windows_dxgk.c
+++ b/loader/windows/icd_windows_dxgk.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019 The Khronos Group Inc.
+ * Copyright (c) 2017-2020 The Khronos Group Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,8 @@
 #include "icd.h"
 #include "icd_windows_dxgk.h"
 
-#if defined(OPENCL_ICD_LOADER_REQUIRE_WDK)
 #include <windows.h>
+#include "adapter.h"
 
 #ifndef NTSTATUS
 typedef LONG NTSTATUS;
@@ -29,38 +29,41 @@
 #define NT_SUCCESS(status) (((NTSTATUS)(status)) >= 0)
 #endif
 
-#include <d3dkmthk.h>
-#endif
-
 bool khrIcdOsVendorsEnumerateDXGK(void)
 {
     bool ret = false;
     int result = 0;
-#if defined(DXGKDDI_INTERFACE_VERSION_WDDM2_4) && (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_4)
     // Get handle to GDI Runtime
     HMODULE h = LoadLibrary("gdi32.dll");
     if (h == NULL)
         return ret;
 
-    if(GetProcAddress((HMODULE)h, "D3DKMTSubmitPresentBltToHwQueue")) // OS Version check
+    if(GetProcAddress(h, "D3DKMTSubmitPresentBltToHwQueue")) // OS Version check
     {
-        D3DKMT_ADAPTERINFO* pAdapterInfo = NULL;
-        D3DKMT_ENUMADAPTERS2 EnumAdapters;
+        LoaderEnumAdapters2 EnumAdapters;
+
         NTSTATUS status = STATUS_SUCCESS;
 
         char cszLibraryName[MAX_PATH] = { 0 };
-        EnumAdapters.NumAdapters = 0;
-        EnumAdapters.pAdapters = NULL;
-        PFND3DKMT_ENUMADAPTERS2 pEnumAdapters2 = (PFND3DKMT_ENUMADAPTERS2)GetProcAddress((HMODULE)h, "D3DKMTEnumAdapters2");
+        EnumAdapters.adapter_count = 0;
+        EnumAdapters.adapters = NULL;
+        PFN_LoaderEnumAdapters2 pEnumAdapters2 = (PFN_LoaderEnumAdapters2)GetProcAddress(h, "D3DKMTEnumAdapters2");
         if (!pEnumAdapters2)
         {
-            KHR_ICD_TRACE("GetProcAddress failed for D3DKMT_ENUMADAPTERS2\n");
+            KHR_ICD_TRACE("GetProcAddress failed for D3DKMTEnumAdapters2\n");
+            goto out;
+        }
+        PFN_LoaderQueryAdapterInfo pQueryAdapterInfo = (PFN_LoaderQueryAdapterInfo)GetProcAddress(h, "D3DKMTQueryAdapterInfo");
+        if (!pQueryAdapterInfo)
+        {
+            KHR_ICD_TRACE("GetProcAddress failed for D3DKMTQueryAdapterInfo\n");
             goto out;
         }
         while (1)
         {
-            EnumAdapters.NumAdapters = 0;
-            EnumAdapters.pAdapters = NULL;
+            EnumAdapters.adapter_count = 0;
+            EnumAdapters.adapters = NULL;
+
             status = pEnumAdapters2(&EnumAdapters);
             if (status == STATUS_BUFFER_TOO_SMALL)
             {
@@ -69,88 +72,95 @@
             }
             else if (!NT_SUCCESS(status))
             {
-                KHR_ICD_TRACE("D3DKMT_ENUMADAPTERS2 status != SUCCESS\n");
+                KHR_ICD_TRACE("D3DKMTEnumAdapters2 status != SUCCESS\n");
                 goto out;
             }
             break;
         }
-        pAdapterInfo = (D3DKMT_ADAPTERINFO*)malloc(sizeof(D3DKMT_ADAPTERINFO)*(EnumAdapters.NumAdapters));
-        if (pAdapterInfo == NULL)
+        EnumAdapters.adapters = malloc(sizeof(*EnumAdapters.adapters)*(EnumAdapters.adapter_count));
+        if (EnumAdapters.adapters == NULL)
         {
-            KHR_ICD_TRACE("Allocation failure for AdapterInfo buffer\n");
+            KHR_ICD_TRACE("Allocation failure for adapters buffer\n");
             goto out;
         }
-        EnumAdapters.pAdapters = pAdapterInfo;
+
         status = pEnumAdapters2(&EnumAdapters);
         if (!NT_SUCCESS(status))
         {
-            KHR_ICD_TRACE("D3DKMT_ENUMADAPTERS2 status != SUCCESS\n");
+            KHR_ICD_TRACE("D3DKMTEnumAdapters2 status != SUCCESS\n");
             goto out;
         }
         const char* cszOpenCLRegKeyName = getOpenCLRegKeyName();
         const int szOpenCLRegKeyName = (int)(strlen(cszOpenCLRegKeyName) + 1)*sizeof(cszOpenCLRegKeyName[0]);
-        PFND3DKMT_QUERYADAPTERINFO pQueryAdapterInfo = (PFND3DKMT_QUERYADAPTERINFO)GetProcAddress((HMODULE)h, "D3DKMTQueryAdapterInfo");
-        if (!pQueryAdapterInfo)
+
+        for (UINT AdapterIndex = 0; AdapterIndex < EnumAdapters.adapter_count; AdapterIndex++)
+
         {
-            KHR_ICD_TRACE("GetProcAddress failed for D3DKMT_ENUMADAPTERS2\n");
-            goto out;
-        }
-       
-        for (UINT AdapterIndex = 0; AdapterIndex < EnumAdapters.NumAdapters; AdapterIndex++)
-        {
-            D3DDDI_QUERYREGISTRY_INFO queryArgs = {0};
-            D3DDDI_QUERYREGISTRY_INFO* pQueryArgs = &queryArgs;
-            D3DDDI_QUERYREGISTRY_INFO* pQueryBuffer = NULL;
-            queryArgs.QueryType = D3DDDI_QUERYREGISTRY_ADAPTERKEY;
-            queryArgs.QueryFlags.TranslatePath = TRUE;
-            queryArgs.ValueType = REG_SZ;
+            LoaderQueryRegistryInfo queryArgs = {0};
+            LoaderQueryRegistryInfo* pQueryArgs = &queryArgs;
+            LoaderQueryRegistryInfo* pQueryBuffer = NULL;
+            queryArgs.query_type = LOADER_QUERY_REGISTRY_ADAPTER_KEY;
+            queryArgs.query_flags.translate_path = TRUE;
+            queryArgs.value_type = REG_SZ;
             result = MultiByteToWideChar(
                 CP_ACP,
                 0,
                 cszOpenCLRegKeyName,
                 szOpenCLRegKeyName,
-                queryArgs.ValueName,
-                ARRAYSIZE(queryArgs.ValueName));
+                queryArgs.value_name,
+                ARRAYSIZE(queryArgs.value_name));
             if (!result)
             {
                 KHR_ICD_TRACE("MultiByteToWideChar status != SUCCESS\n");
                 continue;
             }
-            D3DKMT_QUERYADAPTERINFO queryAdapterInfo = {0};
-            queryAdapterInfo.hAdapter = pAdapterInfo[AdapterIndex].hAdapter;
-            queryAdapterInfo.Type = KMTQAITYPE_QUERYREGISTRY;
-            queryAdapterInfo.pPrivateDriverData = &queryArgs;
-            queryAdapterInfo.PrivateDriverDataSize = sizeof(queryArgs);
+            LoaderQueryAdapterInfo queryAdapterInfo = {0};
+            queryAdapterInfo.handle = EnumAdapters.adapters[AdapterIndex].handle;
+            queryAdapterInfo.type = LOADER_QUERY_TYPE_REGISTRY;
+            queryAdapterInfo.private_data = &queryArgs;
+            queryAdapterInfo.private_data_size = sizeof(queryArgs);
             status = pQueryAdapterInfo(&queryAdapterInfo);
             if (!NT_SUCCESS(status))
             {
-                // Continue trying to get as much info on each adapter as possible.
-                // It's too late to return FALSE and claim WDDM2_4 enumeration is not available here.
-                continue;
+                // Try a different value type.  Some vendors write the key as a multi-string type.
+                queryArgs.value_type = REG_MULTI_SZ;
+                status = pQueryAdapterInfo(&queryAdapterInfo);
+                if (NT_SUCCESS(status))
+                {
+                    KHR_ICD_TRACE("Accepting multi-string registry key type\n");
+                }
+                else
+                {
+                    // Continue trying to get as much info on each adapter as possible.
+                    // It's too late to return FALSE and claim WDDM2_4 enumeration is not available here.
+                    continue;
+                }
             }
-            if (NT_SUCCESS(status) && pQueryArgs->Status == D3DDDI_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW)
+
+            if (NT_SUCCESS(status) && pQueryArgs->status == LOADER_QUERY_REGISTRY_STATUS_BUFFER_OVERFLOW)
             {
-                ULONG queryBufferSize = sizeof(D3DDDI_QUERYREGISTRY_INFO) + queryArgs.OutputValueSize;
-                pQueryBuffer = (D3DDDI_QUERYREGISTRY_INFO*)malloc(queryBufferSize);
+                ULONG queryBufferSize = sizeof(LoaderQueryRegistryInfo) + queryArgs.output_value_size;
+                pQueryBuffer = malloc(queryBufferSize);
                 if (pQueryBuffer == NULL)
                     continue;
-                memcpy(pQueryBuffer, &queryArgs, sizeof(D3DDDI_QUERYREGISTRY_INFO));
-                queryAdapterInfo.pPrivateDriverData = pQueryBuffer;
-                queryAdapterInfo.PrivateDriverDataSize = queryBufferSize;
+                memcpy(pQueryBuffer, &queryArgs, sizeof(LoaderQueryRegistryInfo));
+                queryAdapterInfo.private_data = pQueryBuffer;
+                queryAdapterInfo.private_data_size = queryBufferSize;
                 status = pQueryAdapterInfo(&queryAdapterInfo);
                 pQueryArgs = pQueryBuffer;
             }
-            if (NT_SUCCESS(status) && pQueryArgs->Status == D3DDDI_QUERYREGISTRY_STATUS_SUCCESS)
+            if (NT_SUCCESS(status) && pQueryArgs->status == LOADER_QUERY_REGISTRY_STATUS_SUCCESS)
             {
-                wchar_t* pWchar = pQueryArgs->OutputString;
+                wchar_t* pWchar = pQueryArgs->output_string;
                 memset(cszLibraryName, 0, sizeof(cszLibraryName));
                 {
-                    size_t len = wcstombs(cszLibraryName, pWchar, sizeof(cszLibraryName));
+                    size_t len;
+                    wcstombs_s(&len, cszLibraryName, sizeof(cszLibraryName), pWchar, sizeof(cszLibraryName));
                     KHR_ICD_ASSERT(len == (sizeof(cszLibraryName) - 1));
-                    ret |= adapterAdd(cszLibraryName, pAdapterInfo[AdapterIndex].AdapterLuid);
+                    ret |= adapterAdd(cszLibraryName, EnumAdapters.adapters[AdapterIndex].luid);
                 }
             }
-            else if (status == STATUS_INVALID_PARAMETER && pQueryArgs->Status == D3DDDI_QUERYREGISTRY_STATUS_FAIL)
+            else if (status == STATUS_INVALID_PARAMETER)
             {
                 free(pQueryBuffer);
                 goto out;
@@ -158,11 +168,10 @@
             free(pQueryBuffer);
         }
 out:
-      free(pAdapterInfo);
+      free(EnumAdapters.adapters);
     }
 
     FreeLibrary(h);
 
-#endif
     return ret;
 }
diff --git a/loader/windows/icd_windows_hkr.c b/loader/windows/icd_windows_hkr.c
index b383f2b..cc57574 100644
--- a/loader/windows/icd_windows_hkr.c
+++ b/loader/windows/icd_windows_hkr.c
@@ -130,8 +130,15 @@
 
         if (REG_MULTI_SZ != dwLibraryNameType)
         {
-            KHR_ICD_TRACE("Unexpected registry entry 0x%x! continuing\n", dwLibraryNameType);
-            goto out;
+            if (REG_MULTI_SZ == dwLibraryNameType)
+            {
+                KHR_ICD_TRACE("Accepting multi-string registry key type\n");
+            }
+            else
+            {
+                KHR_ICD_TRACE("Unexpected registry entry 0x%x! continuing\n", dwLibraryNameType);
+                goto out;
+            }
         }
 
         KHR_ICD_TRACE("    Path: %s\n", cszOclPath);
diff --git a/scripts/README.md b/scripts/README.md
new file mode 100644
index 0000000..1b7a371
--- /dev/null
+++ b/scripts/README.md
@@ -0,0 +1,35 @@
+# OpenCL ICD Loader Code Generation
+
+## Introduction
+
+In order to ease maintenance and enable faster development of related OpenCL ICD loader features, the OpenCL ICD loader API dispatch functions are generated from the OpenCL XML machine readable grammar.
+
+## Dependencies
+
+The API dispatch functions are generated using Python [Mako Templates](https://www.makotemplates.org/).
+
+In most cases, after installing Python for your platform, Mako may be installed using:
+
+```sh
+$ pip install Mako
+```
+
+## Making Changes
+
+Most changes only require modifications to the Mako templates.
+Small changes modifying syntax or layout are simple and straightforward.
+Occasionally more complicated changes will be required, say when a new API is added that is unlike any previous API, but this should be rare.
+
+The Python script should only need to be modified if additional information needs to be propagated from the XML file into the Mako template itself.
+
+## Generating Files
+
+Files for the OpenCL ICD loader may be generated by executing the `gen_loader.py` script.
+
+The script requires the `cl.xml` machine readable grammar.
+By default, the script searches for `cl.xml` in the current directory.
+The latest version of `cl.xml` may be found in the Khronos OpenCL-Docs repo [here](https://github.com/KhronosGroup/OpenCL-Docs/blob/master/xml/cl.xml).
+
+The output from the script is placed in the current directory by default, to allow easy comparisons between the generated files and the current files.
+After the generated files are evaluated, they should be manually copied into the source tree.
+These steps may be automated in the future.
diff --git a/scripts/gen_loader.py b/scripts/gen_loader.py
new file mode 100644
index 0000000..d939ac5
--- /dev/null
+++ b/scripts/gen_loader.py
@@ -0,0 +1,137 @@
+#!/usr/bin/python3
+
+# Copyright (c) 2020 The Khronos Group Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from mako.template import Template
+
+from collections import OrderedDict
+from collections import namedtuple
+
+import argparse
+import sys
+import urllib
+import xml.etree.ElementTree as etree
+import urllib.request
+
+# parse_xml - Helper function to parse the XML file from a URL or local file.
+def parse_xml(path):
+    file = urllib.request.urlopen(path) if path.startswith("http") else open(path, 'r')
+    with file:
+        tree = etree.parse(file)
+        return tree
+
+# noneStr - returns string argument, or "" if argument is None.
+def noneStr(s):
+    if s:
+        return s
+    return ""
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser()
+
+    # To pull the latest registry file from GitHub, pass:
+    # -registry "https://raw.githubusercontent.com/KhronosGroup/OpenCL-Registry/master/xml/cl.xml"
+
+    parser.add_argument('-registry', action='store',
+                        default='cl.xml',
+                        help='Use specified registry file instead of cl.xml')
+    parser.add_argument('-o', action='store', dest='directory',
+                        default='.',
+                        help='Create target and related files in specified directory')
+
+    args = parser.parse_args()
+
+    specpath = args.registry
+
+    print('Parsing XML file from: ' + specpath)
+    spec = parse_xml(specpath)
+
+    # Generate the API function signatures dictionary:
+    apisigs = OrderedDict()
+    ApiSignature = namedtuple('ApiSignature', 'Name RetType Params Suffix')
+    ApiParam = namedtuple('ApiParam', 'Type TypeEnd Name')
+    print('Generating API signatures dictionary...')
+    for command in spec.findall('commands/command'):
+        suffix = noneStr(command.get('suffix'))
+        proto = command.find('proto')
+        ret = noneStr(proto.text)
+        name = ""
+        params = ""
+        for elem in proto:
+            if elem.tag == 'name':
+                name = noneStr(elem.text) + noneStr(elem.tail)
+            else:
+                ret = ret + noneStr(elem.text) + noneStr(elem.tail)
+        ret = ret.strip()
+        name = name.strip()
+
+        plist = []
+        for param in command.findall('param'):
+            ptype = noneStr(param.text)
+            ptypeend = ""
+            pname = ""
+            for elem in param:
+                if elem.tag == 'name':
+                    pname = noneStr(elem.text)
+                    ptypeend = noneStr(elem.tail)
+                else:
+                    ptype = ptype + noneStr(elem.text) + noneStr(elem.tail)
+            ptype = ptype.strip()
+            ptypeend = ptypeend.strip()
+            pname = pname.strip()
+            plist.append(ApiParam(ptype, ptypeend, pname))
+        apisigs[name] = ApiSignature(name, ret, plist, suffix)
+
+    # Generate the core API dictionary:
+    coreapis = OrderedDict()
+    print('Generating core API dictionary...')
+    for feature in spec.findall('feature'):
+        version = noneStr(feature.get('name'))
+
+        alist = []
+        for function in feature.findall('require/command'):
+            name = function.get('name')
+            alist.append(apisigs[name])
+        coreapis[version] = alist
+
+    # Generate the extensions API dictionary:
+    extapis = OrderedDict()
+    print('Generating API extensions dictionary...')
+    for feature in spec.findall('extensions/extension'):
+        extension = noneStr(feature.get('name'))
+
+        alist = []
+        for function in feature.findall('require/command'):
+            name = function.get('name')
+            alist.append(apisigs[name])
+        extapis[extension] = alist
+
+    try:
+        # Create the loader cpp file from the API dictionary:
+        test = open(args.directory + '/icd_dispatch_generated.c', 'wb')
+        icd_dispatch_generated_template = Template(filename='icd_dispatch_generated.c.mako')
+        test.write(
+          icd_dispatch_generated_template.render_unicode(
+              spec=spec,
+              apisigs=apisigs,
+              coreapis=coreapis,
+              extapis=extapis).
+          encode('utf-8', 'replace'))
+    except:
+        traceback = RichTraceback()
+        for (filename, lineno, function, line) in traceback.traceback:
+            print('%s(%s) : error in %s' % (filename, lineno, function))
+            print('    ', line)
+        print('%s: %s' % (str(traceback.error.__class__.__name__), traceback.error))
diff --git a/scripts/icd_dispatch_generated.c.mako b/scripts/icd_dispatch_generated.c.mako
new file mode 100644
index 0000000..5bc9db4
--- /dev/null
+++ b/scripts/icd_dispatch_generated.c.mako
@@ -0,0 +1,216 @@
+<%
+# APIs to skip - they need to be done "manually":
+apiskip = {
+    'clGetPlatformIDs',                         # to query platforms
+    'clGetExtensionFunctionAddress',            # to return ICD-aware extensions
+    'clGetExtensionFunctionAddressForPlatform', # to return ICD-aware extensions
+    'clCreateBufferWithProperties',             # only until OpenCL 3.0 is final
+    'clCreateImageWithProperties',              # only until OpenCL 3.0 is final
+    'clSetContextDestructorCallback',           # only until OpenCL 3.0 is final
+    }
+
+# Handles, and mappings to errors when handles are invalid:
+apihandles = {
+    'cl_command_queue'  : 'CL_INVALID_COMMAND_QUEUE',
+    'cl_context'        : 'CL_INVALID_CONTEXT',
+    'cl_device_id'      : 'CL_INVALID_DEVICE',
+    'cl_event'          : 'CL_INVALID_EVENT',
+    'cl_kernel'         : 'CL_INVALID_KERNEL',
+    'cl_mem'            : 'CL_INVALID_MEM_OBJECT',
+    'cl_platform_id'    : 'CL_INVALID_PLATFORM',
+    'cl_program'        : 'CL_INVALID_PROGRAM',
+    'cl_sampler'        : 'CL_INVALID_SAMPLER',
+    }
+%>/*
+ * Copyright (c) 2012-2020 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * OpenCL is a trademark of Apple Inc. used under license by Khronos.
+ */
+
+#include "icd_dispatch.h"
+#include "icd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// Core APIs:
+%for apis in coreapis.values():
+%for api in apis:
+%if not api.Name in apiskip:
+<%
+      handle = api.Params[0]
+      if handle.Type in apihandles:
+          invalid = apihandles[handle.Type]
+      else:
+          invalid = 'NULL'
+%>
+CL_API_ENTRY ${api.RetType} CL_API_CALL ${api.Name}(
+%for i, param in enumerate(api.Params):
+%  if i < len(api.Params)-1:
+    ${param.Type} ${param.Name}${param.TypeEnd},
+%  else:
+    ${param.Type} ${param.Name}${param.TypeEnd}) ${api.Suffix}
+%  endif
+%endfor
+{
+%if api.RetType in apihandles or api.RetType == "void*":
+## clCreateContext is a special case, since it calls through
+## the dispatch table via the first "device":
+%  if api.Name == "clCreateContext":
+    if (${api.Params[1].Name} == 0 || ${api.Params[2].Name} == NULL) {
+        KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(NULL, CL_INVALID_VALUE);
+    }
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${api.Params[2].Name}[0], CL_INVALID_DEVICE);
+## clCreateContextFromType is a special case, since it calls
+## through a platform passed via properties:
+%  elif api.Name == "clCreateContextFromType":
+    cl_platform_id platform = NULL;
+    khrIcdInitialize();
+    khrIcdContextPropertiesGetPlatform(properties, &platform);
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(platform, CL_INVALID_PLATFORM);
+## These APIs are special cases because they return a void*, but
+## do not nave an errcode_ret:
+%  elif api.Name == "clSVMAlloc" or api.Name == "clGetExtensionFunctionAddressForPlatform":
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, NULL);
+%  else:
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${handle.Name}, ${invalid});
+%  endif
+%elif api.Name == "clSVMFree":
+## clSVMFree has no return value or errcode_ret:
+    if (${handle.Name} == NULL) return;
+## clWaitForEvents is a special case, since it calls through
+## the dispatch table via the first "event":
+%elif api.Name == "clWaitForEvents":
+    if (${api.Params[0].Name} == 0 || ${api.Params[1].Name} == NULL) {
+        return CL_INVALID_VALUE;
+    }
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${api.Params[1].Name}[0], CL_INVALID_EVENT);
+%elif api.Name == "clUnloadCompiler":
+    // Nothing!
+%else:
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, ${invalid});
+%endif
+%if api.Name == "clCreateContext":
+    return ${api.Params[2].Name}[0]->dispatch->${api.Name}(
+%elif api.Name == "clWaitForEvents":
+    return ${api.Params[1].Name}[0]->dispatch->${api.Name}(
+%elif api.Name == "clCreateContextFromType":
+    return platform->dispatch->${api.Name}(
+%elif api.Name == "clSVMFree":
+    ${handle.Name}->dispatch->${api.Name}(
+%elif api.Name == "clUnloadCompiler":
+    return CL_SUCCESS;
+%else:
+    return ${handle.Name}->dispatch->${api.Name}(
+%endif:
+%for i, param in enumerate(api.Params):
+%  if i < len(api.Params)-1:
+        ${param.Name},
+%  elif param.Name: # for clUnloadCompiler
+        ${param.Name});
+%  endif
+%endfor
+}
+
+///////////////////////////////////////////////////////////////////////////////
+%endif
+%endfor
+%endfor
+<%
+icdextensions = [
+    'cl_ext_device_fission',
+    'cl_khr_d3d10_sharing',
+    'cl_khr_d3d11_sharing',
+    'cl_khr_dx9_media_sharing',
+    'cl_khr_egl_event',
+    'cl_khr_egl_image',
+    'cl_khr_gl_event',
+    'cl_khr_gl_sharing',
+    'cl_khr_subgroups'
+    ]
+win32extensions = {
+    'cl_khr_d3d10_sharing',
+    'cl_khr_d3d11_sharing',
+    'cl_khr_dx9_media_sharing',
+    }
+%>
+%for extension in icdextensions:
+<%
+    apis = extapis[extension]
+%>// ${extension}
+%if extension in win32extensions:
+
+#if defined(_WIN32)
+%endif
+%for api in apis:
+<%
+      handle = api.Params[0]
+      if handle.Type in apihandles:
+          invalid = apihandles[handle.Type]
+      else:
+          invalid = 'NULL'
+%>
+CL_API_ENTRY ${api.RetType} CL_API_CALL ${api.Name}(
+%for i, param in enumerate(api.Params):
+%  if i < len(api.Params)-1:
+    ${param.Type} ${param.Name}${param.TypeEnd},
+%  else:
+    ${param.Type} ${param.Name}${param.TypeEnd}) ${api.Suffix}
+%  endif
+%endfor
+{
+%if api.RetType in apihandles or api.RetType == "void*":
+%  if False:
+    // api.Name == "clXXX":  # There are currently no API special cases here.
+%  else:
+    KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(${handle.Name}, ${invalid});
+% endif
+%else:
+%  if api.Name == "clGetGLContextInfoKHR":
+    cl_platform_id platform = NULL;
+    khrIcdInitialize();
+    khrIcdContextPropertiesGetPlatform(properties, &platform);
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, CL_INVALID_PLATFORM);
+%  else:
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(${handle.Name}, ${invalid});
+%  endif
+%endif
+%if api.Name == "clGetGLContextInfoKHR":
+    return platform->dispatch->${api.Name}(
+%else:
+    return ${handle.Name}->dispatch->${api.Name}(
+%endif
+%for i, param in enumerate(api.Params):
+%  if i < len(api.Params)-1:
+        ${param.Name},
+%  elif param.Name: # for clUnloadCompiler
+        ${param.Name});
+%  endif
+%endfor
+}
+%endfor
+
+%if extension in win32extensions:
+#endif // defined(_WIN32)
+
+%endif
+///////////////////////////////////////////////////////////////////////////////
+
+%endfor
+#ifdef __cplusplus
+}
+#endif
diff --git a/test/driver_stub/cl.c b/test/driver_stub/cl.c
index 8021923..733a2aa 100644
--- a/test/driver_stub/cl.c
+++ b/test/driver_stub/cl.c
@@ -355,6 +355,30 @@
     return return_value;
 }
 
+#ifdef CL_VERSION_3_0
+
+CL_API_ENTRY cl_int CL_API_CALL
+clSetContextDestructorCallback(cl_context         context,
+                               void (CL_CALLBACK* pfn_notify)(cl_context context,
+                                                              void* user_data),
+                               void*              user_data) CL_API_SUFFIX__VERSION_3_0
+{
+    cl_int return_value = CL_OUT_OF_RESOURCES;
+    test_icd_stub_log("clSetContextDestructorCallback(%p, %p, %p)\n",
+                      context,
+                      pfn_notify,
+                      user_data);
+    pfn_notify(context, user_data);
+    test_icd_stub_log("setcontextdestructor_callback(%p, %p)\n",
+               context,
+               user_data);
+
+    test_icd_stub_log("Value returned: %d\n", return_value);
+    return return_value;
+}
+
+#endif
+
 /* Command Queue APIs */
 CL_API_ENTRY cl_command_queue CL_API_CALL
 clCreateCommandQueue(cl_context                     context,
@@ -551,6 +575,56 @@
     return obj;
 }
 
+#ifdef CL_VERSION_3_0
+
+CL_API_ENTRY cl_mem CL_API_CALL
+clCreateBufferWithProperties(cl_context                context ,
+                             const cl_mem_properties * properties,
+                             cl_mem_flags              flags ,
+                             size_t                    size ,
+                             void *                    host_ptr ,
+                             cl_int *                  errcode_ret) CL_API_SUFFIX__VERSION_3_0
+{
+    cl_mem obj = (cl_mem) malloc(sizeof(struct _cl_mem));
+    obj->dispatch = dispatchTable;
+    test_icd_stub_log("clCreateBufferWithProperties(%p, %p, %x, %u, %p, %p)\n",
+                      context,
+                      properties,
+                      flags,
+                      size,
+                      host_ptr,
+                      errcode_ret);
+
+    test_icd_stub_log("Value returned: %p\n", obj);
+    return obj;
+}
+
+CL_API_ENTRY cl_mem CL_API_CALL
+clCreateImageWithProperties(cl_context                context,
+                            const cl_mem_properties * properties,
+                            cl_mem_flags              flags,
+                            const cl_image_format *   image_format,
+                            const cl_image_desc *     image_desc,
+                            void *                    host_ptr,
+                            cl_int *                  errcode_ret) CL_API_SUFFIX__VERSION_3_0
+{
+    cl_mem obj = (cl_mem) malloc(sizeof(struct _cl_mem));
+    obj->dispatch = dispatchTable;
+    test_icd_stub_log("clCreateImageWithProperties(%p, %p, %x, %p, %p, %p, %p)\n",
+                      context,
+                      properties,
+                      flags,
+                      image_format,
+                      image_desc,
+                      host_ptr,
+                      errcode_ret);
+
+    test_icd_stub_log("Value returned: %p\n", obj);
+    return obj;
+}
+
+#endif  // CL_VERSION_3_0
+
 CL_API_ENTRY cl_int CL_API_CALL
 clRetainMemObject(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0
 {
@@ -639,10 +713,10 @@
                       memobj,
                       pfn_notify,
                       user_data);
-    pfn_notify(memobj, NULL);
+    pfn_notify(memobj, user_data);
     test_icd_stub_log("setmemobjectdestructor_callback(%p, %p)\n",
                memobj,
-               NULL);
+               user_data);
 
     test_icd_stub_log("Value returned: %d\n", return_value);
     return return_value;
diff --git a/test/driver_stub/icd.c b/test/driver_stub/icd.c
index d2b1b2b..eea8665 100644
--- a/test/driver_stub/icd.c
+++ b/test/driver_stub/icd.c
@@ -7,6 +7,9 @@
 #define CL_USE_DEPRECATED_OPENCL_1_0_APIS
 #define CL_USE_DEPRECATED_OPENCL_1_1_APIS
 #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
+#define CL_USE_DEPRECATED_OPENCL_2_0_APIS
+#define CL_USE_DEPRECATED_OPENCL_2_1_APIS
+#define CL_USE_DEPRECATED_OPENCL_2_2_APIS
 
 // Need to rename all CL API functions to prevent ICD loader functions calling
 // themselves via the dispatch table. Include this before cl headers.
@@ -148,12 +151,15 @@
     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueWriteBufferRect);
     ICD_DISPATCH_TABLE_ENTRY ( clEnqueueCopyBufferRect);
 
+    /* cl_ext_device_fission */
     ICD_DISPATCH_TABLE_ENTRY ( /*clCreateSubDevicesEXT*/NULL);
     ICD_DISPATCH_TABLE_ENTRY ( /*clRetainDeviceEXT*/ NULL);
     ICD_DISPATCH_TABLE_ENTRY ( /*clReleaseDevice*/NULL);
 
+    /* cl_khr_gl_event */
     ICD_DISPATCH_TABLE_ENTRY ( clCreateEventFromGLsyncKHR); 
 
+    /* OpenCL 1.2 */
     ICD_DISPATCH_TABLE_ENTRY ( clCreateSubDevices);
     ICD_DISPATCH_TABLE_ENTRY ( clRetainDevice);
     ICD_DISPATCH_TABLE_ENTRY ( clReleaseDevice);
@@ -171,6 +177,70 @@
     ICD_DISPATCH_TABLE_ENTRY ( clGetExtensionFunctionAddressForPlatform);
     ICD_DISPATCH_TABLE_ENTRY ( clCreateFromGLTexture);
 
+    /* cl_khr_d3d11_sharing */
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+
+    /* cl_khr_dx9_media_sharing */
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+
+    /* cl_khr_egl_image */
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+
+    /* cl_khr_egl_event */
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+
+    /* OpenCL 2.0 */
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+
+    /* cl_khr_sub_groups */
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+
+    /* OpenCL 2.1 */
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+
+    /* OpenCL 2.2 */
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+
+#ifdef CL_VERSION_3_0
+    /* OpenCL 3.0 */
+    ICD_DISPATCH_TABLE_ENTRY ( clCreateBufferWithProperties );
+    ICD_DISPATCH_TABLE_ENTRY ( clCreateImageWithProperties );
+    ICD_DISPATCH_TABLE_ENTRY ( clSetContextDestructorCallback );
+#else
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+    ICD_DISPATCH_TABLE_ENTRY( NULL );
+#endif  // CL_VERSION_3_0
+
     // return success
     *outDispatchTable = dispatchTable;
     return CL_SUCCESS;
diff --git a/test/driver_stub/rename_api.h b/test/driver_stub/rename_api.h
index 7d5130c..555695d 100644
--- a/test/driver_stub/rename_api.h
+++ b/test/driver_stub/rename_api.h
@@ -102,5 +102,8 @@
 #define clEnqueueReleaseGLObjects                ___clEnqueueReleaseGLObjects
 #define clGetGLContextInfoKHR                    ___clGetGLContextInfoKHR
 #define clCreateEventFromGLsyncKHR               ___clCreateEventFromGLsyncKHR
+#define clCreateBufferWithProperties             ___clCreateBufferWithProperties
+#define clCreateImageWithProperties              ___clCreateImageWithProperties
+#define clSetContextDestructorCallback           ___clSetContextDestructorCallback
 
 #endif /* __RENAME_API_H__ */
diff --git a/test/loader_test/callbacks.c b/test/loader_test/callbacks.c
index 8e0b493..73d5a95 100644
--- a/test/loader_test/callbacks.c
+++ b/test/loader_test/callbacks.c
@@ -11,6 +11,11 @@
                     _d);
 }
 
+void CL_CALLBACK setcontextdestructor_callback(cl_context _a, void* _b)
+{
+    test_icd_app_log("setcontextdestructor_callback(%p, %p)\n", _a, _b);
+}
+
 void CL_CALLBACK setmemobjectdestructor_callback(cl_mem _a, void* _b)
 {
     test_icd_app_log("setmemobjectdestructor_callback(%p, %p)\n", 
diff --git a/test/loader_test/param_struct.h b/test/loader_test/param_struct.h
index 06a1f2b..0e2db51 100644
--- a/test/loader_test/param_struct.h
+++ b/test/loader_test/param_struct.h
@@ -68,6 +68,15 @@
     size_t *param_value_size_ret;
 };
 
+#ifdef CL_VERSION_3_0
+struct clSetContextDestructorCallback_st
+{
+    cl_context context;
+    void (CL_CALLBACK *pfn_notify)(cl_context context, void *user_data);
+    void *user_data;
+};
+#endif  // CL_VERSION_3_0
+
 struct clGetPlatformIDs_st 
 {
     cl_uint num_entries;
@@ -113,6 +122,7 @@
 #define NUM_ITEMS_clRetainContext 1
 #define NUM_ITEMS_clReleaseContext 1
 #define NUM_ITEMS_clGetContextInfo 1
+#define NUM_ITEMS_clSetContextDestructorCallback 1
 #define NUM_ITEMS_clGetPlatformIDs 1
 #define NUM_ITEMS_clGetPlatformInfo 1
 #define NUM_ITEMS_clGetDeviceIDs 1
@@ -151,6 +161,7 @@
 
 
 #define NUM_ITEMS_clCreateBuffer 1
+#define NUM_ITEMS_clCreateBufferWithProperties 1
 #define NUM_ITEMS_clCreateSubBuffer 1
 #define NUM_ITEMS_clEnqueueReadBuffer 1
 #define NUM_ITEMS_clEnqueueWriteBuffer 1
@@ -174,6 +185,17 @@
     void *host_ptr;
     cl_int *errcode_ret;
 };
+#ifdef CL_VERSION_3_0
+struct clCreateBufferWithProperties_st
+{
+    cl_context context;
+    const cl_mem_properties * properties;
+    cl_mem_flags flags;
+    size_t size;
+    void *host_ptr;
+    cl_int *errcode_ret;
+};
+#endif  // CL_VERSION_3_0
 struct clCreateSubBuffer_st 
 {
     cl_mem buffer;
@@ -473,6 +495,7 @@
 #define NUM_ITEMS_clCreateImage2D 1
 #define NUM_ITEMS_clCreateImage3D 1
 #define NUM_ITEMS_clCreateImage 1
+#define NUM_ITEMS_clCreateImageWithProperties 1
 #define NUM_ITEMS_clGetSupportedImageFormats 1
 #define NUM_ITEMS_clEnqueueCopyImageToBuffer 1
 #define NUM_ITEMS_clEnqueueCopyBufferToImage 1
@@ -494,6 +517,19 @@
     cl_int *errcode_ret;
 };
 
+#ifdef CL_VERSION_3_0
+struct clCreateImageWithProperties_st
+{
+    cl_context context;
+    const cl_mem_properties * properties;
+    cl_mem_flags flags;
+    const cl_image_format *image_format;
+    const cl_image_desc *image_desc;
+    void *host_ptr;
+    cl_int *errcode_ret;
+};
+#endif  // CL_VERSION_3_0
+
 struct clCreateImage2D_st 
 {
     cl_context context;
diff --git a/test/loader_test/test_cl_runtime.c b/test/loader_test/test_cl_runtime.c
index 6b08212..60bd3ee 100644
--- a/test/loader_test/test_cl_runtime.c
+++ b/test/loader_test/test_cl_runtime.c
@@ -4,8 +4,6 @@
 
 extern cl_command_queue command_queue;
 
-cl_int ret_val;
-
 const struct clRetainCommandQueue_st clRetainCommandQueueData[NUM_ITEMS_clRetainCommandQueue] = {
 	{NULL}
 };
@@ -16,6 +14,8 @@
 
 int test_clRetainCommandQueue(const struct clRetainCommandQueue_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clRetainCommandQueue(%p)\n", command_queue);
 
     ret_val = clRetainCommandQueue(command_queue);
@@ -28,6 +28,8 @@
 
 int test_clGetCommandQueueInfo(const struct clGetCommandQueueInfo_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetCommandQueueInfo(%p, %u, %u, %p, %p)\n",
                      command_queue,
                      data->param_name,
@@ -40,7 +42,7 @@
                                     data->param_value_size,
                                     data->param_value,
                                     data->param_value_size_ret);
-    
+
     test_icd_app_log("Value returned: %d\n", ret_val);
 
     return 0;
@@ -54,7 +56,7 @@
 	for (i=0; i<NUM_ITEMS_clRetainCommandQueue; i++)	{
 		test_clRetainCommandQueue(&clRetainCommandQueueData[i]);
 	}
-    
+
     for (i=0; i<NUM_ITEMS_clGetCommandQueueInfo; i++)    {
         test_clGetCommandQueueInfo(&clGetCommandQueueInfoData[i]);
     }
diff --git a/test/loader_test/test_clgl.c b/test/loader_test/test_clgl.c
index 4e3cee4..b72c589 100644
--- a/test/loader_test/test_clgl.c
+++ b/test/loader_test/test_clgl.c
@@ -12,8 +12,6 @@
 extern cl_command_queue command_queue;
 extern cl_event event;
 extern cl_context_properties context_properties[3];
-cl_int ret_val;
-cl_mem ret_mem;
 
 struct clCreateFromGLBuffer_st clCreateFromGLBufferData[NUM_ITEMS_clCreateFromGLBuffer] = {
 	{NULL, 0x0, 0, NULL}
@@ -21,20 +19,21 @@
 
 int test_clCreateFromGLBuffer(const struct clCreateFromGLBuffer_st* data)
 {
+    cl_mem ret_mem;
 
     test_icd_app_log("clCreateFromGLBuffer(%p, %x, %u, %p)\n",
                      context,
                      data->flags,
-                     data->bufobj, 
+                     data->bufobj,
                      data->errcode_ret);
 
     ret_mem = clCreateFromGLBuffer(context,
                                    data->flags,
-                                   data->bufobj, 
-                                   data->errcode_ret);	
+                                   data->bufobj,
+                                   data->errcode_ret);
 
     test_icd_app_log("Value returned: %p\n", ret_mem);
-    
+
     return 0;
 }
 
@@ -44,23 +43,25 @@
 
 int test_clCreateFromGLTexture(const struct clCreateFromGLTexture_st* data)
 {
+    cl_mem ret_mem;
+
     test_icd_app_log("clCreateFromGLTexture(%p, %x, %d, %d, %u, %p)\n",
                      context,
-                     data->flags, 
+                     data->flags,
                      data->texture_target,
-                     data->miplevel, 
-                     data->texture, 
+                     data->miplevel,
+                     data->texture,
                      data->errcode_ret);
 
     ret_mem = clCreateFromGLTexture(context,
-                                    data->flags, 
+                                    data->flags,
                                     data->texture_target,
-                                    data->miplevel, 
-                                    data->texture, 
+                                    data->miplevel,
+                                    data->texture,
                                     data->errcode_ret);
 
     test_icd_app_log("Value returned: %p\n", ret_mem);
-    
+
     return 0;
 }
 
@@ -70,23 +71,25 @@
 
 int test_clCreateFromGLTexture2D(const struct clCreateFromGLTexture2D_st* data)
 {
+    cl_mem ret_mem;
+
     test_icd_app_log("clCreateFromGLTexture2D(%p, %x, %d, %d, %u, %p)\n",
                      context,
-                     data->flags, 
+                     data->flags,
                      data->texture_target,
-                     data->miplevel, 
-                     data->texture, 
+                     data->miplevel,
+                     data->texture,
                      data->errcode_ret);
 
     ret_mem = clCreateFromGLTexture2D(context,
-                                      data->flags, 
+                                      data->flags,
                                       data->texture_target,
-                                      data->miplevel, 
-                                      data->texture, 
+                                      data->miplevel,
+                                      data->texture,
                                       data->errcode_ret);
 
     test_icd_app_log("Value returned: %p\n", ret_mem);
-    
+
     return 0;
 }
 
@@ -95,21 +98,23 @@
 };
 
 int test_clCreateFromGLTexture3D(const struct clCreateFromGLTexture3D_st* data)
-{	
+{
+    cl_mem ret_mem;
+
     test_icd_app_log("clCreateFromGLTexture3D(%p, %x, %d, %d, %u, %p)\n",
                      context,
                      data->flags,
                      data->texture_target,
-                     data->miplevel, 
-                     data->texture, 
+                     data->miplevel,
+                     data->texture,
                      data->errcode_ret);
 
     ret_mem = clCreateFromGLTexture3D(context,
-                                      data->flags, 
+                                      data->flags,
                                       data->texture_target,
-                                      data->miplevel, 
-                                      data->texture, 
-                                      data->errcode_ret);	
+                                      data->miplevel,
+                                      data->texture,
+                                      data->errcode_ret);
 
     test_icd_app_log("Value returned: %p\n", ret_mem);
 
@@ -122,15 +127,17 @@
 
 int test_clCreateFromGLRenderbuffer(const struct clCreateFromGLRenderbuffer_st* data)
 {
+    cl_mem ret_mem;
+
     test_icd_app_log("clCreateFromGLRenderbuffer(%p, %x, %d, %p)\n",
-                     context, 
+                     context,
                      data->flags,
-                     data->renderbuffer, 
+                     data->renderbuffer,
                      data->errcode_ret);
 
-    ret_mem = clCreateFromGLRenderbuffer(context, 
+    ret_mem = clCreateFromGLRenderbuffer(context,
                                          data->flags,
-                                         data->renderbuffer, 
+                                         data->renderbuffer,
                                          data->errcode_ret);
 
     test_icd_app_log("Value returned: %p\n", ret_mem);
@@ -144,17 +151,19 @@
 
 int test_clGetGLObjectInfo(const struct clGetGLObjectInfo_st* data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetGLObjectInfo(%p, %p, %p)\n",
                      buffer,
-                     data->gl_object_type, 
+                     data->gl_object_type,
                      data->gl_object_name);
 
     ret_val = clGetGLObjectInfo(buffer,
-                                data->gl_object_type, 
+                                data->gl_object_type,
                                 data->gl_object_name);
 
     test_icd_app_log("Value returned: %p\n", ret_val);
-    
+
     return ret_val;
 
 }
@@ -165,16 +174,18 @@
 
 int test_clGetGLTextureInfo(const struct clGetGLTextureInfo_st* data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetGLTextureInfo(%p, %u, %u, %p, %p)\n",
                      buffer,
                      data->param_name,
-                     data->param_value_size, 
+                     data->param_value_size,
                      data->param_value,
                      data->param_value_size_ret);
 
     ret_val = clGetGLTextureInfo (buffer,
                                   data->param_name,
-                                  data->param_value_size, 
+                                  data->param_value_size,
                                   data->param_value,
                                   data->param_value_size_ret);
 
@@ -189,19 +200,21 @@
 
 int test_clEnqueueAcquireGLObjects(const struct clEnqueueAcquireGLObjects_st* data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clEnqueueAcquireGLObjects(%p, %u, %p, %u, %p, %p)\n",
                      command_queue,
-                     data->num_objects, 
+                     data->num_objects,
                      data->mem_objects,
                      data->num_events_in_wait_list,
                      &event,
                      &event);
 
     ret_val = clEnqueueAcquireGLObjects (command_queue,
-                                         data->num_objects, 
+                                         data->num_objects,
                                          data->mem_objects,
                                          data->num_events_in_wait_list,
-                                         &event, 
+                                         &event,
                                          &event);
 
     test_icd_app_log("Value returned: %p\n", ret_val);
@@ -215,19 +228,21 @@
 
 int test_clEnqueueReleaseGLObjects(const struct clEnqueueReleaseGLObjects_st* data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clEnqueueReleaseGLObjects(%p, %u, %p, %u, %p, %p)\n",
                      command_queue,
-                     data->num_objects, 
+                     data->num_objects,
                      data->mem_objects,
                      data->num_events_in_wait_list,
-                     &event, 
+                     &event,
                      &event);
 
     ret_val = clEnqueueReleaseGLObjects (command_queue,
-                                         data->num_objects, 
+                                         data->num_objects,
                                          data->mem_objects,
                                          data->num_events_in_wait_list,
-                                         &event, 
+                                         &event,
                                          &event);
 
 
@@ -250,8 +265,8 @@
     PFN_clCreateEventFromGLsyncKHR pfn_clCreateEventFromGLsyncKHR = NULL;
 
     test_icd_app_log("clCreateEventFromGLsyncKHR(%p, %p, %p)\n",
-                     context, 
-                     data->sync, 
+                     context,
+                     data->sync,
                      data->errcode_ret);
 
     pfn_clCreateEventFromGLsyncKHR = clGetExtensionFunctionAddress("clCreateEventFromGLsyncKHR");
@@ -260,8 +275,8 @@
         return 1;
     }
 
-    ret_event = pfn_clCreateEventFromGLsyncKHR (context, 
-                                            data->sync, 
+    ret_event = pfn_clCreateEventFromGLsyncKHR (context,
+                                            data->sync,
                                             data->errcode_ret);
 
     test_icd_app_log("Value returned: %p\n", ret_event);
@@ -278,14 +293,16 @@
                                          size_t                        /* param_value_size */,
                                          void *                        /* param_value */,
                                          size_t *                      /* param_value_size_ret */);
- 
+
 int test_clGetGLContextInfoKHR(const struct clGetGLContextInfoKHR_st* data)
 {
+    cl_int ret_val;
+
     PFN_clGetGLContextInfoKHR pfn_clGetGLContextInfoKHR = NULL;
     test_icd_app_log("clGetGLContextInfoKHR(%p, %u, %u, %p, %p)\n",
                      context_properties,
                      data->param_name,
-                     data->param_value_size, 
+                     data->param_value_size,
                      data->param_value,
                      data->param_value_size_ret);
 
@@ -297,7 +314,7 @@
 
     ret_val = pfn_clGetGLContextInfoKHR(context_properties,
                                     data->param_name,
-                                    data->param_value_size, 
+                                    data->param_value_size,
                                     data->param_value,
                                     data->param_value_size_ret);
 
@@ -309,7 +326,7 @@
 int test_OpenGL_share()
 {
 	int i;
-    
+
     for(i=0;i<NUM_ITEMS_clCreateFromGLBuffer;i++)
 		test_clCreateFromGLBuffer(&clCreateFromGLBufferData[i]);
 
@@ -333,15 +350,15 @@
 
     for(i=0;i<NUM_ITEMS_clEnqueueAcquireGLObjects;i++)
 		test_clEnqueueAcquireGLObjects(&clEnqueueAcquireGLObjectsData[i]);
-        
+
     for(i=0;i<NUM_ITEMS_clEnqueueReleaseGLObjects;i++)
-		test_clEnqueueReleaseGLObjects(&clEnqueueReleaseGLObjectsData[i]);	
-    
+		test_clEnqueueReleaseGLObjects(&clEnqueueReleaseGLObjectsData[i]);
+
     for(i=0;i<NUM_ITEMS_clCreateEventFromGLsyncKHR;i++)
 		test_clCreateEventFromGLsyncKHR(&clCreateEventFromGLsyncKHRData[i]);
-    
+
     for(i=0;i<NUM_ITEMS_clGetGLContextInfoKHR;i++)
 		test_clGetGLContextInfoKHR(&clGetGLContextInfoKHRData[i]);
-    
+
     return 0;
 }
diff --git a/test/loader_test/test_create_calls.c b/test/loader_test/test_create_calls.c
index dfce9c2..f7e8990 100644
--- a/test/loader_test/test_create_calls.c
+++ b/test/loader_test/test_create_calls.c
@@ -60,6 +60,13 @@
     {NULL, 0, 0, NULL, NULL}
 };
 
+#ifdef CL_VERSION_3_0
+const struct clCreateBufferWithProperties_st clCreateBufferWithPropertiesData[NUM_ITEMS_clCreateBufferWithProperties] =
+{
+    {NULL, NULL, 0, 0, NULL, NULL}
+};
+#endif  // CL_VERSION_3_0
+
 const struct clCreateSubBuffer_st clCreateSubBufferData[NUM_ITEMS_clCreateSubBuffer] =
 {
     {NULL, 0, 0, NULL, NULL}
@@ -70,6 +77,13 @@
     { NULL, 0x0, NULL, NULL, NULL, NULL}
 };
 
+#ifdef CL_VERSION_3_0
+const struct clCreateImageWithProperties_st clCreateImageWithPropertiesData[NUM_ITEMS_clCreateImageWithProperties] =
+{
+    { NULL, NULL, 0x0, NULL, NULL, NULL, NULL}
+};
+#endif  // CL_VERSION_3_0
+
 const struct clCreateImage2D_st clCreateImage2DData[NUM_ITEMS_clCreateImage2D] =
 {
     { NULL, 0x0, NULL, 0, 0, 0, NULL, NULL}
@@ -299,6 +313,33 @@
 
 }
 
+#ifdef CL_VERSION_3_0
+int test_clCreateBufferWithProperties(const struct clCreateBufferWithProperties_st *data)
+{
+    test_icd_app_log("clCreateBufferWithProperties(%p, %p, %x, %u, %p, %p)\n",
+                     context,
+                     data->properties,
+                     data->flags,
+                     data->size,
+                     data->host_ptr,
+                     data->errcode_ret);
+
+    buffer = clCreateBufferWithProperties(context,
+                       data->properties,
+                       data->flags,
+                       data->size,
+                       data->host_ptr,
+                       data->errcode_ret);
+
+    clReleaseMemObjectData->memobj = buffer;
+
+    test_icd_app_log("Value returned: %p\n", buffer);
+
+    return 0;
+
+}
+#endif  // CL_VERSION_3_0
+
 int test_clCreateSubBuffer(const struct clCreateSubBuffer_st *data)
 {
     test_icd_app_log("clCreateSubBuffer(%p, %x, %u, %p, %p)\n",
@@ -346,6 +387,34 @@
 
 }
 
+#ifdef CL_VERSION_3_0
+int test_clCreateImageWithProperties(const struct clCreateImageWithProperties_st *data)
+{
+    test_icd_app_log("clCreateImageWithProperties(%p, %p, %x, %p, %p, %p, %p)\n",
+                     context,
+                     data->properties,
+                     data->flags,
+                     data->image_format,
+                     data->image_desc,
+                     data->host_ptr,
+                     data->errcode_ret);
+
+    image = clCreateImageWithProperties(context,
+                        data->properties,
+                        data->flags,
+                        data->image_format,
+                        data->image_desc,
+                        data->host_ptr,
+                        data->errcode_ret);
+
+    clReleaseMemObjectDataImage[0].memobj = image;
+    test_icd_app_log("Value returned: %p\n", image);
+
+    return 0;
+
+}
+#endif  // CL_VERSION_3_0
+
 int test_clCreateImage2D(const struct clCreateImage2D_st *data)
 {
     test_icd_app_log("clCreateImage2D(%p, %x, %p, %u, %u, %u, %p, %p)\n",
@@ -710,10 +779,18 @@
 
     test_clCreateBuffer(clCreateBufferData);
 
+#ifdef CL_VERSION_3_0
+    test_clCreateBufferWithProperties(clCreateBufferWithPropertiesData);
+#endif
+
     test_clCreateSubBuffer(clCreateSubBufferData);
 
     test_clCreateImage(clCreateImageData);
 
+#ifdef CL_VERSION_3_0
+    test_clCreateImageWithProperties(clCreateImageWithPropertiesData);
+#endif
+
     test_clReleaseMemObject(clReleaseMemObjectDataImage);
 
     test_clCreateImage2D(clCreateImage2DData);
diff --git a/test/loader_test/test_image_objects.c b/test/loader_test/test_image_objects.c
index f399451..34040ce 100644
--- a/test/loader_test/test_image_objects.c
+++ b/test/loader_test/test_image_objects.c
@@ -10,8 +10,6 @@
 extern cl_event event;
 extern cl_mem buffer;
 
-int ret_val;
-
 const struct clGetSupportedImageFormats_st clGetSupportedImageFormatsData[NUM_ITEMS_clGetSupportedImageFormats] =
 {
     { NULL, 0x0, 0, 0, NULL, NULL }
@@ -59,6 +57,8 @@
 
 int test_clGetSupportedImageFormats(const struct clGetSupportedImageFormats_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetSupportedImageFormats(%p, %x, %u, %u, %p, %p)\n",
                      context,
                      data->flags,
@@ -66,7 +66,7 @@
                      data->num_entries,
                      data->image_formats,
                      data->num_image_formats);
-    
+
     ret_val = clGetSupportedImageFormats(context,
                                     data->flags,
                                     data->image_type,
@@ -82,6 +82,8 @@
 
 int test_clEnqueueCopyImageToBuffer(const struct clEnqueueCopyImageToBuffer_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clEnqueueCopyImageToBuffer(%p, %p, %p, %p, %p, %u, %u, %p, %p)\n",
                      command_queue,
                      image,
@@ -111,6 +113,8 @@
 
 int test_clEnqueueCopyBufferToImage(const struct clEnqueueCopyBufferToImage_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clEnqueueCopyBufferToImage(%p, %p, %p, %u, %p, %p, %u, %p, %p)\n",
                      command_queue,
                      buffer,
@@ -178,11 +182,13 @@
 
 int test_clEnqueueReadImage(const struct clEnqueueReadImage_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clEnqueueReadImage(%p, %p, %u, %p, %p, %u, %u, %p, %u, %p, %p)\n",
                      command_queue,
                      image,
                      data->blocking_read,
-                     data->origin,            
+                     data->origin,
                      data->region,
                      data->row_pitch,
                      data->slice_pitch,
@@ -195,11 +201,11 @@
                             image,
                             data->blocking_read,
                             data->origin,
-                            data->region, 
-                            data->row_pitch,  
-                            data->slice_pitch, 
-                            data->ptr,       
-                            data->num_events_in_wait_list,  
+                            data->region,
+                            data->row_pitch,
+                            data->slice_pitch,
+                            data->ptr,
+                            data->num_events_in_wait_list,
                             data->event_wait_list,
                             &event);
 
@@ -211,6 +217,8 @@
 
 int test_clEnqueueWriteImage(const struct clEnqueueWriteImage_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clEnqueueWriteImage(%p, %p, %u, %p, %p, %u, %u, %p, %u, %p, %p)\n",
                      command_queue,
                      image,
@@ -244,6 +252,8 @@
 
 int test_clEnqueueFillImage(const struct clEnqueueFillImage_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clEnqueueFillImage(%p, %p, %p, %p, %p, %u, %p, %p)\n",
                      command_queue,
                      image,
@@ -251,16 +261,16 @@
                      data->origin,
                      data->region,
                      data->num_events_in_wait_list,
-                     data->event_wait_list, 
+                     data->event_wait_list,
                      &event);
 
     ret_val = clEnqueueFillImage(command_queue,
-                            image,    
+                            image,
                             data->fill_color,
                             data->origin,
                             data->region,
                             data->num_events_in_wait_list,
-                            data->event_wait_list, 
+                            data->event_wait_list,
                             &event);
 
     test_icd_app_log("Value returned: %d\n", ret_val);
@@ -270,6 +280,8 @@
 }
 int test_clEnqueueCopyImage(const struct clEnqueueCopyImage_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clEnqueueCopyImage(%p, %p, %p, %p, %p, %p, %u, %p, %p)\n",
                      command_queue,
                      image,
@@ -278,7 +290,7 @@
                      data->dst_origin,
                      data->region,
                      data->num_events_in_wait_list,
-                     data->event_wait_list, 
+                     data->event_wait_list,
                      &event);
 
     ret_val = clEnqueueCopyImage(command_queue,
@@ -288,7 +300,7 @@
                             data->dst_origin,
                             data->region,
                             data->num_events_in_wait_list,
-                            data->event_wait_list, 
+                            data->event_wait_list,
                             &event);
 
     test_icd_app_log("Value returned: %d\n", ret_val);
@@ -300,6 +312,8 @@
 
 int test_clGetImageInfo(const struct clGetImageInfo_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetImageInfo(%p, %u, %u, %p, %p)\n",
                      image,
                      data->param_name,
diff --git a/test/loader_test/test_platforms.c b/test/loader_test/test_platforms.c
index d22a3d0..8296e65 100644
--- a/test/loader_test/test_platforms.c
+++ b/test/loader_test/test_platforms.c
@@ -8,7 +8,7 @@
 
 extern cl_device_id devices;
 
-int ret_val;
+extern void CL_CALLBACK setcontextdestructor_callback(cl_context _a, void* _b);
 
 struct clRetainContext_st clRetainContextData[NUM_ITEMS_clRetainContext] =
 {
@@ -20,6 +20,12 @@
     {NULL, 0, 0, NULL, NULL}
 };
 
+#ifdef CL_VERSION_3_0
+struct clSetContextDestructorCallback_st clSetContextDestructorCallbackData[NUM_ITEMS_clSetContextDestructorCallback] =
+{
+    {NULL, setcontextdestructor_callback, NULL}
+};
+#endif  // CL_VERSION_3_0
 
 struct clGetPlatformInfo_st clGetPlatformInfoData[NUM_ITEMS_clGetPlatformInfo] =
 {
@@ -45,7 +51,9 @@
 
 int test_clRetainContext(const struct clRetainContext_st* data)
 {
-    test_icd_app_log("clRetainContext(%p)\n", context); 
+    cl_int ret_val;
+
+    test_icd_app_log("clRetainContext(%p)\n", context);
 
     ret_val = clRetainContext(context);
 
@@ -55,21 +63,22 @@
 }
 
 
-
 int test_clGetContextInfo(const struct clGetContextInfo_st* data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetContextInfo(%p, %u, %u, %p, %p)\n",
                      context,
-                     data->param_name, 
+                     data->param_name,
                      data->param_value_size,
-                     data->param_value, 
-                     data->param_value_size_ret); 
+                     data->param_value,
+                     data->param_value_size_ret);
 
 
     ret_val = clGetContextInfo(context,
-            data->param_name, 
+            data->param_name,
             data->param_value_size,
-            data->param_value, 
+            data->param_value,
             data->param_value_size_ret);
 
     test_icd_app_log("Value returned: %d\n", ret_val);
@@ -77,20 +86,47 @@
     return 0;
 }
 
+
+#ifdef CL_VERSION_3_0
+int test_clSetContextDestructorCallback(
+    const struct clSetContextDestructorCallback_st* data)
+{
+    cl_int ret_val;
+
+    test_icd_app_log(
+        "clSetContextDestructorCallback(%p, %p, %p)\n",
+        context,
+        data->pfn_notify,
+        data->user_data);
+
+    ret_val = clSetContextDestructorCallback(
+        context,
+        data->pfn_notify,
+        data->user_data);
+
+    test_icd_app_log("Value returned: %d\n", ret_val);
+
+    return 0;
+}
+#endif  // CL_VERSION_3_0
+
+
 int test_clGetPlatformInfo(const struct clGetPlatformInfo_st* data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetPlatformInfo(%p, %u, %u, %p, %p)\n",
                      platform,
                      data->param_name,
                      data->param_value_size,
-                     data->param_value, 
-                     data->param_value_size_ret); 					 
+                     data->param_value,
+                     data->param_value_size_ret);
 
     ret_val = clGetPlatformInfo(platform,
             data->param_name,
             data->param_value_size,
             data->param_value,
-            data->param_value_size_ret); 
+            data->param_value_size_ret);
 
     test_icd_app_log("Value returned: %d\n", ret_val);
 
@@ -99,19 +135,21 @@
 }
 
 int test_clGetDeviceInfo(const struct clGetDeviceInfo_st* data)
-{ 
+{
+    cl_int ret_val;
+
     test_icd_app_log("clGetDeviceInfo(%p, %u, %u, %p, %p)\n",
                      devices,
-                     data->param_name, 
-                     data->param_value_size, 
-                     data->param_value, 
-                     data->param_value_size_ret);		 
+                     data->param_name,
+                     data->param_value_size,
+                     data->param_value,
+                     data->param_value_size_ret);
 
     ret_val = clGetDeviceInfo(devices,
-            data->param_name, 
-            data->param_value_size, 
-            data->param_value, 
-            data->param_value_size_ret);		 
+            data->param_name,
+            data->param_value_size,
+            data->param_value,
+            data->param_value_size_ret);
 
     test_icd_app_log("Value returned: %d\n", ret_val);
 
@@ -120,18 +158,20 @@
 
 int test_clCreateSubDevices(const struct clCreateSubDevices_st* data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clCreateSubDevices(%p, %p, %u, %p, %p)\n",
                      devices,
-                     data->properties, 
-                     data->num_entries, 
-                     &devices, 
-                     data->num_devices); 
+                     data->properties,
+                     data->num_entries,
+                     &devices,
+                     data->num_devices);
 
     ret_val = clCreateSubDevices(devices,
-            data->properties, 
+            data->properties,
             data->num_entries,
-            &devices, 
-            data->num_devices); 
+            &devices,
+            data->num_devices);
 
     test_icd_app_log("Value returned: %d\n", ret_val);
 
@@ -140,9 +180,11 @@
 
 int test_clRetainDevice(const struct clRetainDevice_st* data)
 {
-    test_icd_app_log("clRetainDevice(%p)\n", devices); 
+    cl_int ret_val;
 
-    ret_val = clRetainDevice(devices); 
+    test_icd_app_log("clRetainDevice(%p)\n", devices);
+
+    ret_val = clRetainDevice(devices);
 
     test_icd_app_log("Value returned: %d\n", ret_val);
 
@@ -153,31 +195,37 @@
 {
     int i;
 
-    for (i = 0;i<NUM_ITEMS_clRetainContext;i++) { 
-        test_clRetainContext(&clRetainContextData[i]); 
-    } 
+    for (i = 0;i<NUM_ITEMS_clRetainContext;i++) {
+        test_clRetainContext(&clRetainContextData[i]);
+    }
 
-    for (i = 0;i<NUM_ITEMS_clGetContextInfo;i++) { 
-        test_clGetContextInfo(&clGetContextInfoData[i]); 
-    } 
+#ifdef CL_VERSION_3_0
+    for (i = 0;i<NUM_ITEMS_clSetContextDestructorCallback;i++) {
+        test_clSetContextDestructorCallback(&clSetContextDestructorCallbackData[i]);
+    }
+#endif  // CL_VERSION_3_0
+
+    for (i = 0;i<NUM_ITEMS_clGetContextInfo;i++) {
+        test_clGetContextInfo(&clGetContextInfoData[i]);
+    }
 
 #if 0
-    for (i = 0;i<NUM_ITEMS_clGetPlatformInfo;i++) { 
-        test_clGetPlatformInfo(&clGetPlatformInfoData[i]); 
+    for (i = 0;i<NUM_ITEMS_clGetPlatformInfo;i++) {
+        test_clGetPlatformInfo(&clGetPlatformInfoData[i]);
     }
 #endif
 
-    for (i = 0;i<NUM_ITEMS_clGetDeviceInfo;i++) { 
-        test_clGetDeviceInfo(&clGetDeviceInfoData[i]); 
-    } 
+    for (i = 0;i<NUM_ITEMS_clGetDeviceInfo;i++) {
+        test_clGetDeviceInfo(&clGetDeviceInfoData[i]);
+    }
 
-    for (i = 0;i<NUM_ITEMS_clCreateSubDevices;i++) { 
-        test_clCreateSubDevices(&clCreateSubDevicesData[i]); 
-    } 
+    for (i = 0;i<NUM_ITEMS_clCreateSubDevices;i++) {
+        test_clCreateSubDevices(&clCreateSubDevicesData[i]);
+    }
 
-    for (i = 0;i<NUM_ITEMS_clRetainDevice;i++) { 
-        test_clRetainDevice(&clRetainDeviceData[i]); 
-    } 
+    for (i = 0;i<NUM_ITEMS_clRetainDevice;i++) {
+        test_clRetainDevice(&clRetainDeviceData[i]);
+    }
 
     return 0;
 }
diff --git a/test/loader_test/test_program_objects.c b/test/loader_test/test_program_objects.c
index 30c99a1..04395d4 100644
--- a/test/loader_test/test_program_objects.c
+++ b/test/loader_test/test_program_objects.c
@@ -7,8 +7,6 @@
 extern cl_platform_id platform;
 extern cl_device_id devices;
 
-int ret_val;
-
 extern void CL_CALLBACK program_callback(cl_program _a, void* _b);
 
 const struct clRetainProgram_st clRetainProgramData[NUM_ITEMS_clRetainProgram]=
@@ -53,6 +51,8 @@
 
 int test_clRetainProgram(const struct clRetainProgram_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clRetainProgram(%p)\n",
                     program);
 
@@ -67,6 +67,8 @@
 
 int test_clBuildProgram(const struct clBuildProgram_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clBuildProgram(%p, %u, %p, %p, %p, %p)\n",
                      program,
                      data->num_devices,
@@ -90,6 +92,8 @@
 
 int test_clCompileProgram(const struct clCompileProgram_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clCompileProgram(%p, %u, %p, %p, %u, %p, %p, %p)\n",
                      program,
                      data->num_devices,
@@ -148,6 +152,8 @@
 
 int test_clUnloadPlatformCompiler(const struct clUnloadPlatformCompiler_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clUnloadPlatformCompiler(%p)\n", platform);
 
     ret_val=clUnloadPlatformCompiler(platform);
@@ -162,7 +168,7 @@
 {
     void *return_value;
     test_icd_app_log("clGetExtensionFunctionAddressForPlatform(%p, %p)\n",
-                     platform,  
+                     platform,
                      data->func_name);
 
     return_value=clGetExtensionFunctionAddressForPlatform(platform,
@@ -176,6 +182,8 @@
 
 int test_clGetProgramInfo(const struct clGetProgramInfo_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetProgramInfo(%p, %u, %u, %p, %p)\n",
                      program,
                      data->param_name,
@@ -197,6 +205,8 @@
 
 int test_clGetProgramBuildInfo(const struct clGetProgramBuildInfo_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetProgramBuildInfo(%p, %p, %u, %u, %p, %p)\n",
                      program,
                      data->device,
@@ -224,7 +234,7 @@
 
     for (i=0;i<NUM_ITEMS_clRetainProgram;i++)   {
         test_clRetainProgram(&clRetainProgramData[i]);
-    }    
+    }
 
     for (i=0;i<NUM_ITEMS_clBuildProgram;i++)    {
         test_clBuildProgram(&clBuildProgramData[i]);
diff --git a/test/loader_test/test_sampler_objects.c b/test/loader_test/test_sampler_objects.c
index 1f2835f..7994411 100644
--- a/test/loader_test/test_sampler_objects.c
+++ b/test/loader_test/test_sampler_objects.c
@@ -3,7 +3,6 @@
 #include <platform/icd_test_log.h>
 
 extern cl_sampler  sampler;
-int ret_val;
 
 const struct clRetainSampler_st clRetainSamplerData[NUM_ITEMS_clRetainSampler]=
 {
@@ -18,6 +17,8 @@
 
 int test_clRetainSampler(const struct clRetainSampler_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clRetainSampler(%p)\n", sampler);
 
     ret_val=clRetainSampler(sampler);
@@ -29,6 +30,8 @@
 
 int test_clGetSamplerInfo(const struct clGetSamplerInfo_st *data)
 {
+    cl_int ret_val;
+
     test_icd_app_log("clGetSamplerInfo(%p, %u, %u, %p, %p)\n",
                      sampler,
                      data->param_name,