Create directory tree, fix warnings, cmake improvements (#58)
authorBen Ashbaugh <ben.ashbaugh@intel.com>
Tue, 7 May 2019 14:13:17 +0000 (07:13 -0700)
committerKedar Patil <kepatil@nvidia.com>
Tue, 7 May 2019 14:13:17 +0000 (19:43 +0530)
* fix make test

* include CTest and wrap tests with BUILD_TESTING

* move loader files to their own directory

* create specific directories for Windows and Linux

* cmake improvements

* fix path to map file for linux build

* add definition for CL_TARGET_OPENCL_VERSION

* fix warnings

* don't use target_link_options for cmake compatibility

* remove SHARED from a few cmake files

35 files changed:
CMakeLists.txt
OpenCL.def [deleted file]
OpenCL.rc [deleted file]
icd.c [deleted file]
icd.h [deleted file]
icd_dispatch.c [deleted file]
icd_dispatch.h [deleted file]
icd_exports.map [deleted file]
icd_linux.c [deleted file]
icd_windows.c [deleted file]
icd_windows_hkr.c [deleted file]
icd_windows_hkr.h [deleted file]
loader/icd.c [new file with mode: 0644]
loader/icd.h [new file with mode: 0644]
loader/icd_dispatch.c [new file with mode: 0644]
loader/icd_dispatch.h [new file with mode: 0644]
loader/linux/icd_exports.map [new file with mode: 0644]
loader/linux/icd_linux.c [new file with mode: 0644]
loader/windows/OpenCL.def [new file with mode: 0644]
loader/windows/OpenCL.rc [new file with mode: 0644]
loader/windows/icd_windows.c [new file with mode: 0644]
loader/windows/icd_windows_hkr.c [new file with mode: 0644]
loader/windows/icd_windows_hkr.h [new file with mode: 0644]
test/CMakeLists.txt
test/driver_stub/CMakeLists.txt
test/loader_test/main.c
test/loader_test/param_struct.h
test/loader_test/test_buffer_object.c
test/loader_test/test_image_objects.c
test/log/CMakeLists.txt [new file with mode: 0644]
test/log/Makefile [new file with mode: 0644]
test/log/icd_test_log.c [new file with mode: 0644]
test/platform/CMakeLists.txt [deleted file]
test/platform/Makefile [deleted file]
test/platform/icd_test_log.c [deleted file]

index 68cc1966da49200b3aa0814857b84ef32d6d9791..c7509169a2846cb711e083e1ee8be66c559a6437 100644 (file)
@@ -1,6 +1,7 @@
-cmake_minimum_required (VERSION 2.6)
+cmake_minimum_required (VERSION 2.8.11)
 
 project (OPENCL_ICD_LOADER)
+find_package (Threads REQUIRED)
 
 # The option below allows building the ICD Loader library as a shared library
 # (ON, default) or a static library (OFF).
@@ -32,27 +33,31 @@ project (OPENCL_ICD_LOADER)
 # advance. Use it with discretion.
 option (BUILD_SHARED_LIBS "Build shared libs" ON)
 
-set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
-set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
-
-set (OPENCL_ICD_LOADER_SOURCES icd.c icd_dispatch.c)
+set (OPENCL_ICD_LOADER_SOURCES
+    loader/icd.c
+    loader/icd_dispatch.c)
 
 if (WIN32)
-    list (APPEND OPENCL_ICD_LOADER_SOURCES icd_windows.c icd_windows_hkr.c OpenCL.def OpenCL.rc)
-    include_directories ($ENV{DXSDK_DIR}/Include)
+    list (APPEND OPENCL_ICD_LOADER_SOURCES 
+        loader/windows/icd_windows.c
+        loader/windows/icd_windows_hkr.c
+        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
+    # only required in rare cases.
+    if (DEFINED ENV{DXSDK_DIR})
+        include_directories ($ENV{DXSDK_DIR}/Include)
+    endif ()
 else ()
-    list (APPEND OPENCL_ICD_LOADER_SOURCES icd_linux.c icd_exports.map)
-endif ()
-
-# Change this to point to a directory containing OpenCL header directory "CL"
-# OR copy OpenCL headers to ./inc/CL/
-if (NOT DEFINED OPENCL_INCLUDE_DIRS)
-    set (OPENCL_INCLUDE_DIRS ./inc)
+    list (APPEND OPENCL_ICD_LOADER_SOURCES
+        loader/linux/icd_linux.c
+        loader/linux/icd_exports.map)
 endif ()
 
-include_directories (${OPENCL_INCLUDE_DIRS})
+set (OPENCL_ICD_LOADER_HEADERS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/inc CACHE PATH "Path to OpenCL Headers")
 
-add_library (OpenCL SHARED ${OPENCL_ICD_LOADER_SOURCES})
+add_library (OpenCL ${OPENCL_ICD_LOADER_SOURCES})
 set_target_properties (OpenCL PROPERTIES VERSION "1.2" SOVERSION "1")
 
 if (WIN32)
@@ -69,13 +74,25 @@ if (WIN32)
     endif()
 else()
     if (APPLE)
-        set_target_properties (OpenCL PROPERTIES LINK_FLAGS "-pthread")
+        target_link_libraries (OpenCL ${CMAKE_THREAD_LIBS_INIT})
     else ()
-        set_target_properties (OpenCL PROPERTIES LINK_FLAGS "-pthread -Wl,--version-script -Wl,${PROJECT_SOURCE_DIR}/icd_exports.map")
+        set_target_properties (OpenCL PROPERTIES LINK_FLAGS "-Wl,--version-script -Wl,${CMAKE_CURRENT_SOURCE_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)
+
+target_include_directories (OpenCL PRIVATE loader)
 target_link_libraries (OpenCL ${CMAKE_DL_LIBS})
 
-enable_testing()
-add_subdirectory (test)
+include (CTest)
+if (BUILD_TESTING)
+    add_subdirectory (test)
+endif()
+
+install (TARGETS OpenCL
+    RUNTIME DESTINATION bin
+    ARCHIVE DESTINATION lib
+    LIBRARY DESTINATION lib)
diff --git a/OpenCL.def b/OpenCL.def
deleted file mode 100644 (file)
index 98abc9b..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-;
-; Copyright (c) 2016-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.
-
-EXPORTS
-
-;
-; Note:
-;
-; 1. Functions are grouped into blocks according to the OpenCL API version they
-; were introduced in.
-;
-; 2. Function blocks are sorted in ascending order of the API version.
-;
-; 3. Functions within a block are sorted alphabetically.
-;
-
-; OpenCL 1.0 API
-clBuildProgram
-clCreateBuffer
-clCreateCommandQueue
-clCreateContext
-clCreateContextFromType
-clCreateFromGLBuffer
-clCreateFromGLRenderbuffer
-clCreateFromGLTexture2D
-clCreateFromGLTexture3D
-clCreateImage2D
-clCreateImage3D
-clCreateKernel
-clCreateKernelsInProgram
-clCreateProgramWithBinary
-clCreateProgramWithSource
-clCreateSampler
-clEnqueueAcquireGLObjects
-clEnqueueBarrier
-clEnqueueCopyBuffer
-clEnqueueCopyBufferToImage
-clEnqueueCopyImage
-clEnqueueCopyImageToBuffer
-clEnqueueMapBuffer
-clEnqueueMapImage
-clEnqueueMarker
-clEnqueueNDRangeKernel
-clEnqueueNativeKernel
-clEnqueueReadBuffer
-clEnqueueReadImage
-clEnqueueReleaseGLObjects
-clEnqueueTask
-clEnqueueUnmapMemObject
-clEnqueueWaitForEvents
-clEnqueueWriteBuffer
-clEnqueueWriteImage
-clFinish
-clFlush
-clGetCommandQueueInfo
-clGetContextInfo
-clGetDeviceIDs
-clGetDeviceInfo
-clGetEventInfo
-clGetEventProfilingInfo
-clGetExtensionFunctionAddress
-clGetGLObjectInfo
-clGetGLTextureInfo
-clGetImageInfo
-clGetKernelInfo
-clGetKernelWorkGroupInfo
-clGetMemObjectInfo
-clGetPlatformIDs
-clGetPlatformInfo
-clGetProgramBuildInfo
-clGetProgramInfo
-clGetSamplerInfo
-clGetSupportedImageFormats
-clReleaseCommandQueue
-clReleaseContext
-clReleaseEvent
-clReleaseKernel
-clReleaseMemObject
-clReleaseProgram
-clReleaseSampler
-clRetainCommandQueue
-clRetainContext
-clRetainEvent
-clRetainKernel
-clRetainMemObject
-clRetainProgram
-clRetainSampler
-clSetCommandQueueProperty
-clSetKernelArg
-clUnloadCompiler
-clWaitForEvents
-
-; OpenCL 1.1 API
-clCreateSubBuffer
-clCreateUserEvent
-clEnqueueCopyBufferRect
-clEnqueueReadBufferRect
-clEnqueueWriteBufferRect
-clSetEventCallback
-clSetMemObjectDestructorCallback
-clSetUserEventStatus
-
-; OpenCL 1.2 API
-clCompileProgram
-clCreateFromGLTexture
-clCreateImage
-clCreateProgramWithBuiltInKernels
-clCreateSubDevices
-clEnqueueBarrierWithWaitList
-clEnqueueFillBuffer
-clEnqueueFillImage
-clEnqueueMarkerWithWaitList
-clEnqueueMigrateMemObjects
-clGetExtensionFunctionAddressForPlatform
-clGetKernelArgInfo
-clLinkProgram
-clReleaseDevice
-clRetainDevice
-clUnloadPlatformCompiler
-
-; OpenCL 2.0 API
-clCreateCommandQueueWithProperties
-clCreatePipe
-clCreateSamplerWithProperties
-clEnqueueSVMFree
-clEnqueueSVMMap
-clEnqueueSVMMemcpy
-clEnqueueSVMMemFill
-clEnqueueSVMUnmap
-clGetPipeInfo
-clSetKernelArgSVMPointer
-clSetKernelExecInfo
-clSVMAlloc
-clSVMFree
-
-; OpenCL 2.1 API
-clCloneKernel
-clCreateProgramWithIL
-clEnqueueSVMMigrateMem
-clGetDeviceAndHostTimer
-clGetHostTimer
-clGetKernelSubGroupInfo
-clSetDefaultDeviceCommandQueue
-
-; OpenCL 2.2 API
-clSetProgramReleaseCallback
-clSetProgramSpecializationConstant
-
diff --git a/OpenCL.rc b/OpenCL.rc
deleted file mode 100644 (file)
index 561e6ba..0000000
--- a/OpenCL.rc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2016-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 <windows.h>
-
-#ifdef RC_INVOKED
-
-VS_VERSION_INFO VERSIONINFO
-FILEVERSION    2,2,1,0
-PRODUCTVERSION 2,2,1,0
-FILETYPE       VFT_DLL
-
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904E4"
-        BEGIN
-            VALUE "FileDescription" ,"OpenCL Client DLL"
-            VALUE "ProductName"     ,"Khronos OpenCL ICD"
-            VALUE "LegalCopyright"  ,"Copyright \251 The Khronos Group Inc 2016-2019"
-            VALUE "FileVersion"     ,"2.2.1.0"
-            VALUE "CompanyName"     ,"Khronos Group"
-            VALUE "InternalName"    ,"OpenCL"
-            VALUE "OriginalFilename","OpenCL.dll"
-        END
-    END
-
-    BLOCK "VarFileInfo"
-    BEGIN
-        // extend this line for localized versions
-        VALUE "Translation", 0x0409, 0x04E4
-    END
-END
-
-#endif
-
diff --git a/icd.c b/icd.c
deleted file mode 100644 (file)
index 8e142c4..0000000
--- a/icd.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (c) 2016-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 "icd.h"
-#include "icd_dispatch.h"
-#include <stdlib.h>
-#include <string.h>
-
-KHRicdVendor *khrIcdVendors = NULL;
-
-// entrypoint to initialize the ICD and add all vendors
-void khrIcdInitialize(void)
-{
-    // enumerate vendors present on the system
-    khrIcdOsVendorsEnumerateOnce();
-}
-
-void khrIcdVendorAdd(const char *libraryName)
-{
-    void *library = NULL;
-    cl_int result = CL_SUCCESS;
-    pfn_clGetExtensionFunctionAddress p_clGetExtensionFunctionAddress = NULL;
-    pfn_clIcdGetPlatformIDs p_clIcdGetPlatformIDs = NULL;
-    cl_uint i = 0;
-    cl_uint platformCount = 0;
-    cl_platform_id *platforms = NULL;
-    KHRicdVendor *vendorIterator = NULL;
-
-    // require that the library name be valid
-    if (!libraryName) 
-    {
-        goto Done;
-    }
-    KHR_ICD_TRACE("attempting to add vendor %s...\n", libraryName);
-
-    // load its library and query its function pointers
-    library = khrIcdOsLibraryLoad(libraryName);
-    if (!library)
-    {
-        KHR_ICD_TRACE("failed to load library %s\n", libraryName);
-        goto Done;
-    }
-
-    // ensure that we haven't already loaded this vendor
-    for (vendorIterator = khrIcdVendors; vendorIterator; vendorIterator = vendorIterator->next)
-    {
-        if (vendorIterator->library == library)
-        {
-            KHR_ICD_TRACE("already loaded vendor %s, nothing to do here\n", libraryName);
-            goto Done;
-        }
-    }
-
-    // get the library's clGetExtensionFunctionAddress pointer
-    p_clGetExtensionFunctionAddress = (pfn_clGetExtensionFunctionAddress)(size_t)khrIcdOsLibraryGetFunctionAddress(library, "clGetExtensionFunctionAddress");
-    if (!p_clGetExtensionFunctionAddress)
-    {
-        KHR_ICD_TRACE("failed to get function address clGetExtensionFunctionAddress\n");
-        goto Done;
-    }
-
-    // use that function to get the clIcdGetPlatformIDsKHR function pointer
-    p_clIcdGetPlatformIDs = (pfn_clIcdGetPlatformIDs)(size_t)p_clGetExtensionFunctionAddress("clIcdGetPlatformIDsKHR");
-    if (!p_clIcdGetPlatformIDs)
-    {
-        KHR_ICD_TRACE("failed to get extension function address clIcdGetPlatformIDsKHR\n");
-        goto Done;
-    }
-
-    // query the number of platforms available and allocate space to store them
-    result = p_clIcdGetPlatformIDs(0, NULL, &platformCount);
-    if (CL_SUCCESS != result)
-    {
-        KHR_ICD_TRACE("failed clIcdGetPlatformIDs\n");
-        goto Done;
-    }
-    platforms = (cl_platform_id *)malloc(platformCount * sizeof(cl_platform_id) );
-    if (!platforms)
-    {
-        KHR_ICD_TRACE("failed to allocate memory\n");
-        goto Done;
-    }
-    memset(platforms, 0, platformCount * sizeof(cl_platform_id) );
-    result = p_clIcdGetPlatformIDs(platformCount, platforms, NULL);
-    if (CL_SUCCESS != result)
-    {
-        KHR_ICD_TRACE("failed clIcdGetPlatformIDs\n");
-        goto Done;
-    }
-
-    // for each platform, add it
-    for (i = 0; i < platformCount; ++i)
-    {
-        KHRicdVendor* vendor = NULL;
-        char *suffix;
-        size_t suffixSize;
-
-        // call clGetPlatformInfo on the returned platform to get the suffix
-        if (!platforms[i])
-        {
-            continue;
-        }
-        result = platforms[i]->dispatch->clGetPlatformInfo(
-            platforms[i],
-            CL_PLATFORM_ICD_SUFFIX_KHR,
-            0,
-            NULL,
-            &suffixSize);
-        if (CL_SUCCESS != result)
-        {
-            continue;
-        }
-        suffix = (char *)malloc(suffixSize);
-        if (!suffix)
-        {
-            continue;
-        }
-        result = platforms[i]->dispatch->clGetPlatformInfo(
-            platforms[i],
-            CL_PLATFORM_ICD_SUFFIX_KHR,
-            suffixSize,
-            suffix,
-            NULL);            
-        if (CL_SUCCESS != result)
-        {
-            free(suffix);
-            continue;
-        }
-
-        // allocate a structure for the vendor
-        vendor = (KHRicdVendor*)malloc(sizeof(*vendor) );
-        if (!vendor) 
-        {
-            free(suffix);
-            KHR_ICD_TRACE("failed to allocate memory\n");
-            continue;
-        }
-        memset(vendor, 0, sizeof(*vendor) );
-
-        // populate vendor data
-        vendor->library = khrIcdOsLibraryLoad(libraryName);
-        if (!vendor->library) 
-        {
-            free(suffix);
-            free(vendor);
-            KHR_ICD_TRACE("failed get platform handle to library\n");
-            continue;
-        }
-        vendor->clGetExtensionFunctionAddress = p_clGetExtensionFunctionAddress;
-        vendor->platform = platforms[i];
-        vendor->suffix = suffix;
-
-        // add this vendor to the list of vendors at the tail
-        {
-            KHRicdVendor **prevNextPointer = NULL;
-            for (prevNextPointer = &khrIcdVendors; *prevNextPointer; prevNextPointer = &( (*prevNextPointer)->next) );
-            *prevNextPointer = vendor;
-        }
-
-        KHR_ICD_TRACE("successfully added vendor %s with suffix %s\n", libraryName, suffix);
-
-    }
-
-Done:
-
-    if (library)
-    {
-        khrIcdOsLibraryUnload(library);
-    }
-    if (platforms)
-    {
-        free(platforms);
-    }
-}
-
-void khrIcdContextPropertiesGetPlatform(const cl_context_properties *properties, cl_platform_id *outPlatform)
-{
-    if (properties == NULL && khrIcdVendors != NULL)
-    {
-        *outPlatform = khrIcdVendors[0].platform;
-    }
-    else
-    {
-        const cl_context_properties *property = (cl_context_properties *)NULL;
-        *outPlatform = NULL;
-        for (property = properties; property && property[0]; property += 2)
-        {
-            if ((cl_context_properties)CL_CONTEXT_PLATFORM == property[0])
-            {
-                *outPlatform = (cl_platform_id)property[1];
-            }
-        }
-    }
-}
-
diff --git a/icd.h b/icd.h
deleted file mode 100644 (file)
index a1b6969..0000000
--- a/icd.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (c) 2016-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.
- */
-
-#ifndef _ICD_H_
-#define _ICD_H_
-
-#ifndef CL_USE_DEPRECATED_OPENCL_1_0_APIS
-#define CL_USE_DEPRECATED_OPENCL_1_0_APIS
-#endif
-
-#ifndef CL_USE_DEPRECATED_OPENCL_1_1_APIS
-#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
-#endif
-
-#ifndef CL_USE_DEPRECATED_OPENCL_1_2_APIS
-#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
-#endif
-
-#include <CL/cl.h>
-#include <CL/cl_ext.h>
-
-#ifdef _WIN32
-#include <tchar.h>
-#endif
-
-/*
- * type definitions
- */
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *pfn_clIcdGetPlatformIDs)(
-    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 *pfn_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;
-
-typedef CL_API_ENTRY void *(CL_API_CALL *pfn_clGetExtensionFunctionAddress)(
-    const char *function_name)  CL_API_SUFFIX__VERSION_1_0;
-
-typedef struct KHRicdVendorRec KHRicdVendor;
-
-/* 
- * KHRicdVendor
- *
- * Data for a single ICD vendor platform.
- */
-struct KHRicdVendorRec
-{
-    // the loaded library object (true type varies on Linux versus Windows)
-    void *library;
-
-    // the extension suffix for this platform
-    char *suffix;
-
-    // function pointer to the ICD platform IDs extracted from the library
-    pfn_clGetExtensionFunctionAddress clGetExtensionFunctionAddress;
-
-    // the platform retrieved from clGetIcdPlatformIDsKHR
-    cl_platform_id platform;
-
-    // next vendor in the list vendors
-    KHRicdVendor *next;
-};
-
-// the global state
-extern KHRicdVendor * khrIcdVendors;
-
-/* 
- * khrIcd interface
- */
-
-// read vendors from system configuration and store the data
-// loaded into khrIcdState.  this will call the OS-specific
-// function khrIcdEnumerateVendors.  this is called at every
-// dispatch function which may be a valid first call into the
-// API (e.g, getPlatformIDs, etc).
-void khrIcdInitialize(void);
-
-// go through the list of vendors (in /etc/OpenCL.conf or through 
-// the registry) and call khrIcdVendorAdd for each vendor encountered
-// n.b, this call is OS-specific
-void khrIcdOsVendorsEnumerateOnce(void);
-
-// add a vendor's implementation to the list of libraries
-void khrIcdVendorAdd(const char *libraryName);
-
-// dynamically load a library.  returns NULL on failure
-// n.b, this call is OS-specific
-void *khrIcdOsLibraryLoad(const char *libraryName);
-
-// get a function pointer from a loaded library.  returns NULL on failure.
-// n.b, this call is OS-specific
-void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName);
-
-// unload a library.
-// n.b, this call is OS-specific
-void khrIcdOsLibraryUnload(void *library);
-
-// parse properties and determine the platform to use from them
-void khrIcdContextPropertiesGetPlatform(
-    const cl_context_properties *properties, 
-    cl_platform_id *outPlatform);
-
-// internal tracing macros
-#if 0
-    #include <stdio.h>
-    #define KHR_ICD_TRACE(...) \
-    do \
-    { \
-        fprintf(stderr, "KHR ICD trace at %s:%d: ", __FILE__, __LINE__); \
-        fprintf(stderr, __VA_ARGS__); \
-    } while (0)
-#ifdef _WIN32
-#define KHR_ICD_WIDE_TRACE(...) \
-    do \
-    { \
-        fwprintf(stderr, L"KHR ICD trace at %hs:%d: ", __FILE__, __LINE__); \
-        fwprintf(stderr, __VA_ARGS__); \
-    } while (0)
-#else
-#define KHR_ICD_WIDE_TRACE(...)
-#endif
-    #define KHR_ICD_ASSERT(x) \
-    do \
-    { \
-        if (!(x)) \
-        { \
-            fprintf(stderr, "KHR ICD assert at %s:%d: %s failed", __FILE__, __LINE__, #x); \
-        } \
-    } while (0)
-#else
-    #define KHR_ICD_TRACE(...)
-    #define KHR_ICD_WIDE_TRACE(...)
-    #define KHR_ICD_ASSERT(x)
-#endif
-
-// if handle is NULL then return invalid_handle_error_code
-#define KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(handle,invalid_handle_error_code) \
-    do \
-    { \
-        if (!handle) \
-        { \
-            return invalid_handle_error_code; \
-        } \
-    } while (0)
-
-// if handle is NULL then set errcode_ret to invalid_handle_error and return NULL 
-// (NULL being an invalid handle)
-#define KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(handle,invalid_handle_error) \
-    do \
-    { \
-        if (!handle) \
-        { \
-            if (errcode_ret) \
-            { \
-                *errcode_ret = invalid_handle_error; \
-            } \
-            return NULL; \
-        } \
-    } while (0)
-
-
-#endif
-
diff --git a/icd_dispatch.c b/icd_dispatch.c
deleted file mode 100644 (file)
index df967cb..0000000
+++ /dev/null
@@ -1,2674 +0,0 @@
-/*
- * Copyright (c) 2012-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 "icd_dispatch.h"
-#include "icd.h"
-#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
-{
-    KHRicdVendor* vendor = NULL;
-    cl_uint i;
-
-    // initialize the platforms (in case they have not been already)
-    khrIcdInitialize();
-
-    if (!num_entries && platforms)
-    {
-        return CL_INVALID_VALUE;
-    }
-    if (!platforms && !num_platforms)
-    {
-        return CL_INVALID_VALUE;
-    }
-    // set num_platforms to 0 and set all platform pointers to NULL
-    if (num_platforms) 
-    {
-        *num_platforms = 0;
-    }
-    for (i = 0; i < num_entries && platforms; ++i) 
-    {
-        platforms[i] = NULL;
-    }
-    // return error if we have no platforms
-    if (!khrIcdVendors)
-    {
-        return CL_PLATFORM_NOT_FOUND_KHR;
-    }
-    // otherwise enumerate all platforms
-    for (vendor = khrIcdVendors; vendor; vendor = vendor->next)
-    {
-        if (num_entries && platforms)
-        {
-            *(platforms++) = vendor->platform;
-            --num_entries;
-        }
-        if (num_platforms)
-        {
-            ++(*num_platforms);
-        }
-    }
-    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
-{
-    // 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);
-}
-
-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();    
-
-    // 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
-
-    // This is not an ICD-aware extension, so call into the implementation
-    // to get the extension function address.
-
-    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, NULL);
-    return platform->dispatch->clGetExtensionFunctionAddressForPlatform(
-        platform,
-        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);
-}
-
-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
-{
-    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
-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_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
-{
-    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);
-}
-
-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_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);
-}
-
-
diff --git a/icd_dispatch.h b/icd_dispatch.h
deleted file mode 100644 (file)
index 22af335..0000000
+++ /dev/null
@@ -1,1511 +0,0 @@
-/*
- * Copyright (c) 2016-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.
- */
-
-#ifndef _ICD_DISPATCH_H_
-#define _ICD_DISPATCH_H_
-
-#ifndef CL_USE_DEPRECATED_OPENCL_1_0_APIS
-#define CL_USE_DEPRECATED_OPENCL_1_0_APIS
-#endif
-
-#ifndef CL_USE_DEPRECATED_OPENCL_1_1_APIS
-#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
-#endif
-
-#ifndef CL_USE_DEPRECATED_OPENCL_1_2_APIS
-#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
-#endif
-
-#ifndef CL_USE_DEPRECATED_OPENCL_2_0_APIS
-#define CL_USE_DEPRECATED_OPENCL_2_0_APIS
-#endif
-
-// cl.h
-#include <CL/cl.h>
-
-// cl_gl.h and required files
-#ifdef _WIN32
-#include <windows.h>
-#include <d3d9.h>
-#include <d3d10_1.h>
-#include <CL/cl_d3d10.h>
-#include <CL/cl_d3d11.h>
-#include <CL/cl_dx9_media_sharing.h>
-#endif
-#include <CL/cl_gl.h>
-#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;
-};
-
-/*
- *
- * vendor dispatch table structure
- *
- */
-
-struct _cl_platform_id
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-struct _cl_device_id
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-struct _cl_context
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-struct _cl_command_queue
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-struct _cl_mem
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-struct _cl_program
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-struct _cl_kernel
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-struct _cl_event
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-struct _cl_sampler
-{
-    KHRicdVendorDispatch *dispatch;
-};
-
-#endif // _ICD_DISPATCH_H_
-
diff --git a/icd_exports.map b/icd_exports.map
deleted file mode 100644 (file)
index c716a39..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2016-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.
- */
-
-OPENCL_1.0 {
-    global:
-        clBuildProgram;
-        clCreateBuffer;
-        clCreateCommandQueue;
-        clCreateContext;
-        clCreateContextFromType;
-        clCreateFromGLBuffer;
-        clCreateFromGLRenderbuffer;
-        clCreateFromGLTexture2D;
-        clCreateFromGLTexture3D;
-        clCreateImage2D;
-        clCreateImage3D;
-        clCreateKernel;
-        clCreateKernelsInProgram;
-        clCreateProgramWithBinary;
-        clCreateProgramWithSource;
-        clCreateSampler;
-        clEnqueueAcquireGLObjects;
-        clEnqueueBarrier;
-        clEnqueueCopyBuffer;
-        clEnqueueCopyBufferToImage;
-        clEnqueueCopyImage;
-        clEnqueueCopyImageToBuffer;
-        clEnqueueMapBuffer;
-        clEnqueueMapImage;
-        clEnqueueMarker;
-        clEnqueueNDRangeKernel;
-        clEnqueueNativeKernel;
-        clEnqueueReadBuffer;
-        clEnqueueReadImage;
-        clEnqueueReleaseGLObjects;
-        clEnqueueTask;
-        clEnqueueUnmapMemObject;
-        clEnqueueWaitForEvents;
-        clEnqueueWriteBuffer;
-        clEnqueueWriteImage;
-        clFinish;
-        clFlush;
-        clGetCommandQueueInfo;
-        clGetContextInfo;
-        clGetDeviceIDs;
-        clGetDeviceInfo;
-        clGetEventInfo;
-        clGetEventProfilingInfo;
-        clGetExtensionFunctionAddress;
-        clGetGLObjectInfo;
-        clGetGLTextureInfo;
-        clGetImageInfo;
-        clGetKernelInfo;
-        clGetKernelWorkGroupInfo;
-        clGetMemObjectInfo;
-        clGetPlatformIDs;
-        clGetPlatformInfo;
-        clGetProgramBuildInfo;
-        clGetProgramInfo;
-        clGetSamplerInfo;
-        clGetSupportedImageFormats;
-        clReleaseCommandQueue;
-        clReleaseContext;
-        clReleaseEvent;
-        clReleaseKernel;
-        clReleaseMemObject;
-        clReleaseProgram;
-        clReleaseSampler;
-        clRetainCommandQueue;
-        clRetainContext;
-        clRetainEvent;
-        clRetainKernel;
-        clRetainMemObject;
-        clRetainProgram;
-        clRetainSampler;
-        clSetCommandQueueProperty;
-        clSetKernelArg;
-        clUnloadCompiler;
-        clWaitForEvents;
-
-    local:
-        /* Everything else is local to ICD. */
-        *;
-};
-
-OPENCL_1.1 {
-    global:
-        clCreateSubBuffer;
-        clCreateUserEvent;
-        clEnqueueCopyBufferRect;
-        clEnqueueReadBufferRect;
-        clEnqueueWriteBufferRect;
-        clSetEventCallback;
-        clSetMemObjectDestructorCallback;
-        clSetUserEventStatus;
-} OPENCL_1.0;
-
-OPENCL_1.2 {
-    global:
-        clCompileProgram;
-        clCreateFromGLTexture;
-        clCreateImage;
-        clCreateProgramWithBuiltInKernels;
-        clCreateSubDevices;
-        clEnqueueBarrierWithWaitList;
-        clEnqueueFillBuffer;
-        clEnqueueFillImage;
-        clEnqueueMarkerWithWaitList;
-        clEnqueueMigrateMemObjects;
-        clGetExtensionFunctionAddressForPlatform;
-        clGetKernelArgInfo;
-        clLinkProgram;
-        clReleaseDevice;
-        clRetainDevice;
-        clUnloadPlatformCompiler;
-} OPENCL_1.1;
-
-OPENCL_2.0 {
-    global:
-        clCreateCommandQueueWithProperties;
-        clCreatePipe;
-        clGetPipeInfo;
-        clSVMAlloc;
-        clSVMFree;
-        clEnqueueSVMFree;
-        clEnqueueSVMMemcpy;
-        clEnqueueSVMMemFill;
-        clEnqueueSVMMap;
-        clEnqueueSVMUnmap;
-        clCreateSamplerWithProperties;
-        clSetKernelArgSVMPointer;
-        clSetKernelExecInfo;
-} OPENCL_1.2;
-
-OPENCL_2.1 {
-    global:
-        clCloneKernel;
-        clCreateProgramWithIL;
-        clEnqueueSVMMigrateMem;
-        clGetDeviceAndHostTimer;
-        clGetHostTimer;
-        clGetKernelSubGroupInfo;
-        clSetDefaultDeviceCommandQueue;
-} OPENCL_2.0;
-
-OPENCL_2.2 {
-    global:
-        clSetProgramReleaseCallback;
-        clSetProgramSpecializationConstant;
-} OPENCL_2.1;
diff --git a/icd_linux.c b/icd_linux.c
deleted file mode 100644 (file)
index f6bb7b6..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2016-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 "icd.h"
-#include <dlfcn.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <pthread.h>
-
-static pthread_once_t initialized = PTHREAD_ONCE_INIT;
-
-/*
- * 
- * Vendor enumeration functions
- *
- */
-
-// go through the list of vendors in the two configuration files
-void khrIcdOsVendorsEnumerate(void)
-{
-    DIR *dir = NULL;
-    struct dirent *dirEntry = NULL;
-#ifdef __ANDROID__
-    char *vendorPath = "/system/vendor/Khronos/OpenCL/vendors/";
-#else
-    char *vendorPath = "/etc/OpenCL/vendors/";
-#endif // ANDROID
-
-    // open the directory
-    dir = opendir(vendorPath);
-    if (NULL == dir) 
-    {
-        KHR_ICD_TRACE("Failed to open path %s\n", vendorPath);
-        goto Cleanup;
-    }
-
-    // attempt to load all files in the directory
-    for (dirEntry = readdir(dir); dirEntry; dirEntry = readdir(dir) )
-    {
-        switch(dirEntry->d_type)
-        {
-        case DT_UNKNOWN:
-        case DT_REG:
-        case DT_LNK:
-            {
-                const char* extension = ".icd";
-                FILE *fin = NULL;
-                char* fileName = NULL;
-                char* buffer = NULL;
-                long bufferSize = 0;
-
-                // make sure the file name ends in .icd
-                if (strlen(extension) > strlen(dirEntry->d_name) )
-                {
-                    break;
-                }
-                if (strcmp(dirEntry->d_name + strlen(dirEntry->d_name) - strlen(extension), extension) ) 
-                {
-                    break;
-                }
-
-                // allocate space for the full path of the vendor library name
-                fileName = malloc(strlen(dirEntry->d_name) + strlen(vendorPath) + 1);
-                if (!fileName) 
-                {
-                    KHR_ICD_TRACE("Failed allocate space for ICD file path\n");
-                    break;
-                }
-                sprintf(fileName, "%s%s", vendorPath, dirEntry->d_name);
-
-                // open the file and read its contents
-                fin = fopen(fileName, "r");
-                if (!fin)
-                {
-                    free(fileName);
-                    break;
-                }
-                fseek(fin, 0, SEEK_END);
-                bufferSize = ftell(fin);
-
-                buffer = malloc(bufferSize+1);
-                if (!buffer)
-                {
-                    free(fileName);
-                    fclose(fin);
-                    break;
-                }                
-                memset(buffer, 0, bufferSize+1);
-                fseek(fin, 0, SEEK_SET);                       
-                if (bufferSize != (long)fread(buffer, 1, bufferSize, fin) )
-                {
-                    free(fileName);
-                    free(buffer);
-                    fclose(fin);
-                    break;
-                }
-                // ignore a newline at the end of the file
-                if (buffer[bufferSize-1] == '\n') buffer[bufferSize-1] = '\0';
-
-                // load the string read from the file
-                khrIcdVendorAdd(buffer);
-                
-                free(fileName);
-                free(buffer);
-                fclose(fin);
-            }
-            break;
-        default:
-            break;
-        }
-    }
-
-Cleanup:
-
-    // free resources and exit
-    if (dir) 
-    {
-        closedir(dir);
-    }
-}
-
-// go through the list of vendors only once
-void khrIcdOsVendorsEnumerateOnce(void)
-{
-    pthread_once(&initialized, khrIcdOsVendorsEnumerate);
-}
-
-/*
- * 
- * Dynamic library loading functions
- *
- */
-
-// dynamically load a library.  returns NULL on failure
-void *khrIcdOsLibraryLoad(const char *libraryName)
-{
-    return dlopen (libraryName, RTLD_NOW);
-}
-
-// get a function pointer from a loaded library.  returns NULL on failure.
-void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName)
-{
-    return dlsym(library, functionName);
-}
-
-// unload a library
-void khrIcdOsLibraryUnload(void *library)
-{
-    dlclose(library);
-}
-
diff --git a/icd_windows.c b/icd_windows.c
deleted file mode 100644 (file)
index 5f89085..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 2016-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 "icd.h"
-#include "icd_windows_hkr.h"
-#include <stdio.h>
-#include <windows.h>
-#include <winreg.h>
-
-static INIT_ONCE initialized = INIT_ONCE_STATIC_INIT;
-
-/*
- * 
- * Vendor enumeration functions
- *
- */
-
-// go through the list of vendors in the registry and call khrIcdVendorAdd 
-// for each vendor encountered
-BOOL CALLBACK khrIcdOsVendorsEnumerate(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContext)
-{
-    LONG result;
-    const char* platformsName = "SOFTWARE\\Khronos\\OpenCL\\Vendors";
-    HKEY platformsKey = NULL;
-    DWORD dwIndex;
-
-    if (!khrIcdOsVendorsEnumerateHKR())
-    {
-        KHR_ICD_TRACE("Failed to enumerate HKR entries, continuing\n");
-    }
-
-    KHR_ICD_TRACE("Opening key HKLM\\%s...\n", platformsName);
-    result = RegOpenKeyExA(
-        HKEY_LOCAL_MACHINE,
-        platformsName,
-        0,
-        KEY_READ,
-        &platformsKey);
-    if (ERROR_SUCCESS != result)
-    {
-        KHR_ICD_TRACE("Failed to open platforms key %s, continuing\n", platformsName);
-        return TRUE;
-    }
-
-    // for each value
-    for (dwIndex = 0;; ++dwIndex)
-    {
-        char cszLibraryName[1024] = {0};
-        DWORD dwLibraryNameSize = sizeof(cszLibraryName);
-        DWORD dwLibraryNameType = 0;     
-        DWORD dwValue = 0;
-        DWORD dwValueSize = sizeof(dwValue);
-
-        // read the value name
-        KHR_ICD_TRACE("Reading value %d...\n", dwIndex);
-        result = RegEnumValueA(
-              platformsKey,
-              dwIndex,
-              cszLibraryName,
-              &dwLibraryNameSize,
-              NULL,
-              &dwLibraryNameType,
-              (LPBYTE)&dwValue,
-              &dwValueSize);
-        // if RegEnumKeyEx fails, we are done with the enumeration
-        if (ERROR_SUCCESS != result) 
-        {
-            KHR_ICD_TRACE("Failed to read value %d, done reading key.\n", dwIndex);
-            break;
-        }
-        KHR_ICD_TRACE("Value %s found...\n", cszLibraryName);
-        
-        // Require that the value be a DWORD and equal zero
-        if (REG_DWORD != dwLibraryNameType)  
-        {
-            KHR_ICD_TRACE("Value not a DWORD, skipping\n");
-            continue;
-        }
-        if (dwValue)
-        {
-            KHR_ICD_TRACE("Value not zero, skipping\n");
-            continue;
-        }
-
-        // add the library
-        khrIcdVendorAdd(cszLibraryName);
-    }
-
-    result = RegCloseKey(platformsKey);
-    if (ERROR_SUCCESS != result)
-    {
-        KHR_ICD_TRACE("Failed to close platforms key %s, ignoring\n", platformsName);
-    }
-       
-    return TRUE;
-}
-
-// go through the list of vendors only once
-void khrIcdOsVendorsEnumerateOnce()
-{
-    InitOnceExecuteOnce(&initialized, khrIcdOsVendorsEnumerate, NULL, NULL);
-}
-/*
- * 
- * Dynamic library loading functions
- *
- */
-
-// dynamically load a library.  returns NULL on failure
-void *khrIcdOsLibraryLoad(const char *libraryName)
-{
-    return (void *)LoadLibraryA(libraryName);
-}
-
-// get a function pointer from a loaded library.  returns NULL on failure.
-void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName)
-{
-    if (!library || !functionName)
-    {
-        return NULL;
-    }
-    return GetProcAddress( (HMODULE)library, functionName);
-}
-
-// unload a library.
-void khrIcdOsLibraryUnload(void *library)
-{
-    FreeLibrary( (HMODULE)library);
-}
-
diff --git a/icd_windows_hkr.c b/icd_windows_hkr.c
deleted file mode 100644 (file)
index 5f6c534..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * 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 "icd.h"
-#include "icd_windows_hkr.h"
-#include <windows.h>
-#include <cfgmgr32.h>
-#include <assert.h>
-#include <stdbool.h>
-#include <initguid.h>
-#include <Devpkey.h>
-#include <devguid.h>
-
- // This GUID was only added to devguid.h on Windows SDK v10.0.16232 which
- // corresponds to Windows 10 Redstone 3 (Windows 10 Fall Creators Update).
-DEFINE_GUID(OCL_GUID_DEVCLASS_SOFTWARECOMPONENT, 0x5c4c3332, 0x344d, 0x483c, 0x87, 0x39, 0x25, 0x9e, 0x93, 0x4c, 0x9c, 0xc8);
-
-typedef enum
-{
-    ProbeFailure,
-    PendingReboot,
-    Valid
-} DeviceProbeResult;
-
-#define KHR_SAFE_RELEASE(mem)       \
-    do                              \
-    {                               \
-        free(mem);                  \
-        mem = NULL;                 \
-    } while (0)
-
-static const char OPENCL_REG_SUB_KEY[] = "OpenCLDriverName";
-
-#ifndef _WIN64
-static const char OPENCL_REG_SUB_KEY_WOW[] = "OpenCLDriverNameWow";
-#endif
-
-// Do not free the memory returned by this function.
-static const char* GetOpenCLRegKeyName(void)
-{
-#ifdef _WIN64
-    return OPENCL_REG_SUB_KEY;
-#else
-    // The suffix/substring "WoW" is meaningful only when a 32-bit
-    // application is running on a 64-bit Windows OS. A 32-bit application
-    // running on a 32-bit OS uses non-WoW names.
-    BOOL is_wow64;
-    if (IsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64)
-    {
-        return OPENCL_REG_SUB_KEY_WOW;
-    }
-
-    return OPENCL_REG_SUB_KEY;
-#endif
-}
-
-static bool ReadOpenCLKey(DEVINST dnDevNode)
-{
-    HKEY hkey = 0;
-    CONFIGRET ret;
-    bool bRet = false;
-    DWORD dwLibraryNameType = 0;
-    char *cszOclPath = NULL;
-    DWORD dwOclPathSize = 0;
-    LSTATUS result;
-
-    ret = CM_Open_DevNode_Key(
-        dnDevNode,
-        KEY_QUERY_VALUE,
-        0,
-        RegDisposition_OpenExisting,
-        &hkey,
-        CM_REGISTRY_SOFTWARE);
-
-    if (CR_SUCCESS != ret)
-    {
-        KHR_ICD_TRACE("Failed with ret 0x%x\n", ret);
-        goto out;
-    }
-    else
-    {
-        result = RegQueryValueExA(
-            hkey,
-            GetOpenCLRegKeyName(),
-            NULL,
-            &dwLibraryNameType,
-            NULL,
-            &dwOclPathSize);
-
-        if (ERROR_SUCCESS != result)
-        {
-            KHR_ICD_TRACE("Failed to open sub key 0x%x\n", result);
-            goto out;
-        }
-
-        cszOclPath = malloc(dwOclPathSize);
-        if (NULL == cszOclPath)
-        {
-            KHR_ICD_TRACE("Failed to allocate %u bytes for registry value\n", dwOclPathSize);
-            goto out;
-        }
-
-        result = RegQueryValueExA(
-            hkey,
-            OPENCL_REG_SUB_KEY,
-            NULL,
-            &dwLibraryNameType,
-            (LPBYTE)cszOclPath,
-            &dwOclPathSize);
-        if (ERROR_SUCCESS != result)
-        {
-            KHR_ICD_TRACE("Failed to open sub key 0x%x\n", result);
-            goto out;
-        }
-
-        if (REG_SZ != dwLibraryNameType)
-        {
-            KHR_ICD_TRACE("Unexpected registry entry 0x%x! continuing\n", dwLibraryNameType);
-            goto out;
-        }
-
-        KHR_ICD_TRACE("    Path: %s\n", cszOclPath);
-
-        khrIcdVendorAdd(cszOclPath);
-
-        bRet = true;
-    }
-
-out:
-    free(cszOclPath);
-
-    if (hkey)
-    {
-        result = RegCloseKey(hkey);
-        if (ERROR_SUCCESS != result)
-        {
-            KHR_ICD_TRACE("WARNING: failed to close hkey 0x%x\n", result);
-        }
-    }
-
-    return bRet;
-}
-
-static DeviceProbeResult ProbeDevice(DEVINST devnode)
-{
-    CONFIGRET ret;
-    ULONG ulStatus;
-    ULONG ulProblem;
-
-    ret = CM_Get_DevNode_Status(
-        &ulStatus,
-        &ulProblem,
-        devnode,
-        0);
-
-    if (CR_SUCCESS != ret)
-    {
-        KHR_ICD_TRACE("    WARNING: failed to probe the status of the device 0x%x\n", ret);
-        return ProbeFailure;
-    }
-
-    //
-    // Careful here, we need to check 2 scenarios:
-    // 1. DN_NEED_RESTART
-    //    status flag indicates that a reboot is needed when an _already started_
-    //    device cannot be stopped. This covers devices that are still started with their
-    //    old KMD (because they couldn't be stopped/restarted) while the UMD is updated
-    //    and possibly out of sync.
-    //
-    // 2.  Status & DN_HAS_PROBLEM  && Problem == CM_PROB_NEED_RESTART
-    //     indicates that a reboot is needed when a _stopped device_ cannot be (re)started.
-    //
-    if (((ulStatus & DN_HAS_PROBLEM) && ulProblem == CM_PROB_NEED_RESTART) ||
-          ulStatus & DN_NEED_RESTART)
-    {
-        KHR_ICD_TRACE("    WARNING: device is pending reboot (0x%x), skipping...\n", ulStatus);
-        return PendingReboot;
-    }
-
-    return Valid;
-}
-
-// Tries to look for the OpenCL key under the display devices and
-// if not found, falls back to software component devices.
-bool khrIcdOsVendorsEnumerateHKR(void)
-{
-    CONFIGRET ret;
-    int iret;
-    bool foundOpenCLKey = false;
-    DEVINST devinst = 0;
-    DEVINST devchild = 0;
-    wchar_t *deviceIdList = NULL;
-    ULONG szBuffer = 0;
-
-    OLECHAR display_adapter_guid_str[MAX_GUID_STRING_LEN];
-    ULONG ulFlags = CM_GETIDLIST_FILTER_CLASS |
-                    CM_GETIDLIST_FILTER_PRESENT;
-
-    iret = StringFromGUID2(
-        &GUID_DEVCLASS_DISPLAY,
-        display_adapter_guid_str,
-        MAX_GUID_STRING_LEN);
-
-    if (MAX_GUID_STRING_LEN != iret)
-    {
-        KHR_ICD_TRACE("StringFromGUID2 failed with %d\n", iret);
-        goto out;
-    }
-
-    // Paranoia: we might have a new device added to the list between the call
-    // to CM_Get_Device_ID_List_Size() and the call to CM_Get_Device_ID_List().
-    do
-    {
-        ret = CM_Get_Device_ID_List_SizeW(
-            &szBuffer,
-            display_adapter_guid_str,
-            ulFlags);
-
-        if (CR_SUCCESS != ret)
-        {
-            KHR_ICD_TRACE("CM_Get_Device_ID_List_size failed with 0x%x\n", ret);
-            break;
-        }
-
-        // "pulLen [out] Receives a value representing the required buffer
-        //  size, in characters."
-        //  So we need to allocate the right size in bytes but we still need
-        //  to keep szBuffer as it was returned from CM_Get_Device_ID_List_Size so
-        //  the call to CM_Get_Device_ID_List will receive the correct size.
-        deviceIdList = malloc(szBuffer * sizeof(wchar_t));
-        if (NULL == deviceIdList)
-        {
-            KHR_ICD_TRACE("Failed to allocate %u bytes for device ID strings\n", szBuffer);
-            break;
-        }
-
-        ret = CM_Get_Device_ID_ListW(
-            display_adapter_guid_str,
-            deviceIdList,
-            szBuffer,
-            ulFlags);
-
-        if (CR_SUCCESS != ret)
-        {
-            KHR_ICD_TRACE("CM_Get_Device_ID_List failed with 0x%x\n", ret);
-            KHR_SAFE_RELEASE(deviceIdList);
-        }
-    } while (CR_BUFFER_SMALL == ret);
-
-    if (NULL == deviceIdList)
-    {
-        goto out;
-    }
-
-    for (PWSTR deviceId = deviceIdList; *deviceId; deviceId += wcslen(deviceId) + 1)
-    {
-        DEVPROPTYPE devpropType;
-
-        KHR_ICD_WIDE_TRACE(L"Device ID: %ls\n", deviceId);
-
-        ret = CM_Locate_DevNodeW(&devinst, deviceId, 0);
-        if (CR_SUCCESS == ret)
-        {
-            KHR_ICD_TRACE("    devinst: %d\n", devinst);
-        }
-        else
-        {
-            KHR_ICD_TRACE("CM_Locate_DevNode failed with 0x%x\n", ret);
-            continue;
-        }
-
-        if (ProbeDevice(devinst) != Valid)
-        {
-            continue;
-        }
-
-        KHR_ICD_TRACE("    Trying to look for the key in the display adapter HKR...\n");
-        if (ReadOpenCLKey(devinst))
-        {
-            foundOpenCLKey = true;
-            continue;
-        }
-
-        KHR_ICD_TRACE("    Could not find the key, proceeding to children software components...\n");
-
-        ret = CM_Get_Child(
-            &devchild,
-            devinst,
-            0);
-
-        if (CR_SUCCESS != ret)
-        {
-            KHR_ICD_TRACE("    CM_Get_Child returned 0x%x, skipping children...\n", ret);
-        }
-        else
-        {
-            do
-            {
-                wchar_t deviceInstanceID[MAX_DEVICE_ID_LEN] = { 0 };
-                GUID guid;
-                ULONG szGuid = sizeof(guid);
-
-                KHR_ICD_TRACE("    devchild: %d\n", devchild);
-                ret = CM_Get_Device_IDW(
-                    devchild,
-                    deviceInstanceID,
-                    sizeof(deviceInstanceID),
-                    0);
-
-                if (CR_SUCCESS != ret)
-                {
-                    KHR_ICD_TRACE("    CM_Get_Device_ID returned 0x%x, skipping device...\n", ret);
-                    continue;
-                }
-                else
-                {
-                    KHR_ICD_WIDE_TRACE(L"    deviceInstanceID: %ls\n", deviceInstanceID);
-                }
-
-                ret = CM_Get_DevNode_PropertyW(
-                    devchild,
-                    &DEVPKEY_Device_ClassGuid,
-                    &devpropType,
-                    (PBYTE)&guid,
-                    &szGuid,
-                    0);
-
-                if (CR_SUCCESS != ret ||
-                    !IsEqualGUID(&OCL_GUID_DEVCLASS_SOFTWARECOMPONENT, &guid))
-                {
-                    continue;
-                }
-
-                if (ProbeDevice(devchild) != Valid)
-                {
-                    continue;
-                }
-
-                if (ReadOpenCLKey(devchild))
-                {
-                    foundOpenCLKey = true;
-                    break;
-                }
-            } while (CM_Get_Sibling(&devchild, devchild, 0) == CR_SUCCESS);
-        }
-    }
-
-out:
-    free(deviceIdList);
-    return foundOpenCLKey;
-}
diff --git a/icd_windows_hkr.h b/icd_windows_hkr.h
deleted file mode 100644 (file)
index 698fe5a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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>
-
-bool khrIcdOsVendorsEnumerateHKR(void);
diff --git a/loader/icd.c b/loader/icd.c
new file mode 100644 (file)
index 0000000..8e142c4
--- /dev/null
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2016-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 "icd.h"
+#include "icd_dispatch.h"
+#include <stdlib.h>
+#include <string.h>
+
+KHRicdVendor *khrIcdVendors = NULL;
+
+// entrypoint to initialize the ICD and add all vendors
+void khrIcdInitialize(void)
+{
+    // enumerate vendors present on the system
+    khrIcdOsVendorsEnumerateOnce();
+}
+
+void khrIcdVendorAdd(const char *libraryName)
+{
+    void *library = NULL;
+    cl_int result = CL_SUCCESS;
+    pfn_clGetExtensionFunctionAddress p_clGetExtensionFunctionAddress = NULL;
+    pfn_clIcdGetPlatformIDs p_clIcdGetPlatformIDs = NULL;
+    cl_uint i = 0;
+    cl_uint platformCount = 0;
+    cl_platform_id *platforms = NULL;
+    KHRicdVendor *vendorIterator = NULL;
+
+    // require that the library name be valid
+    if (!libraryName) 
+    {
+        goto Done;
+    }
+    KHR_ICD_TRACE("attempting to add vendor %s...\n", libraryName);
+
+    // load its library and query its function pointers
+    library = khrIcdOsLibraryLoad(libraryName);
+    if (!library)
+    {
+        KHR_ICD_TRACE("failed to load library %s\n", libraryName);
+        goto Done;
+    }
+
+    // ensure that we haven't already loaded this vendor
+    for (vendorIterator = khrIcdVendors; vendorIterator; vendorIterator = vendorIterator->next)
+    {
+        if (vendorIterator->library == library)
+        {
+            KHR_ICD_TRACE("already loaded vendor %s, nothing to do here\n", libraryName);
+            goto Done;
+        }
+    }
+
+    // get the library's clGetExtensionFunctionAddress pointer
+    p_clGetExtensionFunctionAddress = (pfn_clGetExtensionFunctionAddress)(size_t)khrIcdOsLibraryGetFunctionAddress(library, "clGetExtensionFunctionAddress");
+    if (!p_clGetExtensionFunctionAddress)
+    {
+        KHR_ICD_TRACE("failed to get function address clGetExtensionFunctionAddress\n");
+        goto Done;
+    }
+
+    // use that function to get the clIcdGetPlatformIDsKHR function pointer
+    p_clIcdGetPlatformIDs = (pfn_clIcdGetPlatformIDs)(size_t)p_clGetExtensionFunctionAddress("clIcdGetPlatformIDsKHR");
+    if (!p_clIcdGetPlatformIDs)
+    {
+        KHR_ICD_TRACE("failed to get extension function address clIcdGetPlatformIDsKHR\n");
+        goto Done;
+    }
+
+    // query the number of platforms available and allocate space to store them
+    result = p_clIcdGetPlatformIDs(0, NULL, &platformCount);
+    if (CL_SUCCESS != result)
+    {
+        KHR_ICD_TRACE("failed clIcdGetPlatformIDs\n");
+        goto Done;
+    }
+    platforms = (cl_platform_id *)malloc(platformCount * sizeof(cl_platform_id) );
+    if (!platforms)
+    {
+        KHR_ICD_TRACE("failed to allocate memory\n");
+        goto Done;
+    }
+    memset(platforms, 0, platformCount * sizeof(cl_platform_id) );
+    result = p_clIcdGetPlatformIDs(platformCount, platforms, NULL);
+    if (CL_SUCCESS != result)
+    {
+        KHR_ICD_TRACE("failed clIcdGetPlatformIDs\n");
+        goto Done;
+    }
+
+    // for each platform, add it
+    for (i = 0; i < platformCount; ++i)
+    {
+        KHRicdVendor* vendor = NULL;
+        char *suffix;
+        size_t suffixSize;
+
+        // call clGetPlatformInfo on the returned platform to get the suffix
+        if (!platforms[i])
+        {
+            continue;
+        }
+        result = platforms[i]->dispatch->clGetPlatformInfo(
+            platforms[i],
+            CL_PLATFORM_ICD_SUFFIX_KHR,
+            0,
+            NULL,
+            &suffixSize);
+        if (CL_SUCCESS != result)
+        {
+            continue;
+        }
+        suffix = (char *)malloc(suffixSize);
+        if (!suffix)
+        {
+            continue;
+        }
+        result = platforms[i]->dispatch->clGetPlatformInfo(
+            platforms[i],
+            CL_PLATFORM_ICD_SUFFIX_KHR,
+            suffixSize,
+            suffix,
+            NULL);            
+        if (CL_SUCCESS != result)
+        {
+            free(suffix);
+            continue;
+        }
+
+        // allocate a structure for the vendor
+        vendor = (KHRicdVendor*)malloc(sizeof(*vendor) );
+        if (!vendor) 
+        {
+            free(suffix);
+            KHR_ICD_TRACE("failed to allocate memory\n");
+            continue;
+        }
+        memset(vendor, 0, sizeof(*vendor) );
+
+        // populate vendor data
+        vendor->library = khrIcdOsLibraryLoad(libraryName);
+        if (!vendor->library) 
+        {
+            free(suffix);
+            free(vendor);
+            KHR_ICD_TRACE("failed get platform handle to library\n");
+            continue;
+        }
+        vendor->clGetExtensionFunctionAddress = p_clGetExtensionFunctionAddress;
+        vendor->platform = platforms[i];
+        vendor->suffix = suffix;
+
+        // add this vendor to the list of vendors at the tail
+        {
+            KHRicdVendor **prevNextPointer = NULL;
+            for (prevNextPointer = &khrIcdVendors; *prevNextPointer; prevNextPointer = &( (*prevNextPointer)->next) );
+            *prevNextPointer = vendor;
+        }
+
+        KHR_ICD_TRACE("successfully added vendor %s with suffix %s\n", libraryName, suffix);
+
+    }
+
+Done:
+
+    if (library)
+    {
+        khrIcdOsLibraryUnload(library);
+    }
+    if (platforms)
+    {
+        free(platforms);
+    }
+}
+
+void khrIcdContextPropertiesGetPlatform(const cl_context_properties *properties, cl_platform_id *outPlatform)
+{
+    if (properties == NULL && khrIcdVendors != NULL)
+    {
+        *outPlatform = khrIcdVendors[0].platform;
+    }
+    else
+    {
+        const cl_context_properties *property = (cl_context_properties *)NULL;
+        *outPlatform = NULL;
+        for (property = properties; property && property[0]; property += 2)
+        {
+            if ((cl_context_properties)CL_CONTEXT_PLATFORM == property[0])
+            {
+                *outPlatform = (cl_platform_id)property[1];
+            }
+        }
+    }
+}
+
diff --git a/loader/icd.h b/loader/icd.h
new file mode 100644 (file)
index 0000000..a1b6969
--- /dev/null
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2016-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.
+ */
+
+#ifndef _ICD_H_
+#define _ICD_H_
+
+#ifndef CL_USE_DEPRECATED_OPENCL_1_0_APIS
+#define CL_USE_DEPRECATED_OPENCL_1_0_APIS
+#endif
+
+#ifndef CL_USE_DEPRECATED_OPENCL_1_1_APIS
+#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
+#endif
+
+#ifndef CL_USE_DEPRECATED_OPENCL_1_2_APIS
+#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
+#endif
+
+#include <CL/cl.h>
+#include <CL/cl_ext.h>
+
+#ifdef _WIN32
+#include <tchar.h>
+#endif
+
+/*
+ * type definitions
+ */
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *pfn_clIcdGetPlatformIDs)(
+    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 *pfn_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;
+
+typedef CL_API_ENTRY void *(CL_API_CALL *pfn_clGetExtensionFunctionAddress)(
+    const char *function_name)  CL_API_SUFFIX__VERSION_1_0;
+
+typedef struct KHRicdVendorRec KHRicdVendor;
+
+/* 
+ * KHRicdVendor
+ *
+ * Data for a single ICD vendor platform.
+ */
+struct KHRicdVendorRec
+{
+    // the loaded library object (true type varies on Linux versus Windows)
+    void *library;
+
+    // the extension suffix for this platform
+    char *suffix;
+
+    // function pointer to the ICD platform IDs extracted from the library
+    pfn_clGetExtensionFunctionAddress clGetExtensionFunctionAddress;
+
+    // the platform retrieved from clGetIcdPlatformIDsKHR
+    cl_platform_id platform;
+
+    // next vendor in the list vendors
+    KHRicdVendor *next;
+};
+
+// the global state
+extern KHRicdVendor * khrIcdVendors;
+
+/* 
+ * khrIcd interface
+ */
+
+// read vendors from system configuration and store the data
+// loaded into khrIcdState.  this will call the OS-specific
+// function khrIcdEnumerateVendors.  this is called at every
+// dispatch function which may be a valid first call into the
+// API (e.g, getPlatformIDs, etc).
+void khrIcdInitialize(void);
+
+// go through the list of vendors (in /etc/OpenCL.conf or through 
+// the registry) and call khrIcdVendorAdd for each vendor encountered
+// n.b, this call is OS-specific
+void khrIcdOsVendorsEnumerateOnce(void);
+
+// add a vendor's implementation to the list of libraries
+void khrIcdVendorAdd(const char *libraryName);
+
+// dynamically load a library.  returns NULL on failure
+// n.b, this call is OS-specific
+void *khrIcdOsLibraryLoad(const char *libraryName);
+
+// get a function pointer from a loaded library.  returns NULL on failure.
+// n.b, this call is OS-specific
+void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName);
+
+// unload a library.
+// n.b, this call is OS-specific
+void khrIcdOsLibraryUnload(void *library);
+
+// parse properties and determine the platform to use from them
+void khrIcdContextPropertiesGetPlatform(
+    const cl_context_properties *properties, 
+    cl_platform_id *outPlatform);
+
+// internal tracing macros
+#if 0
+    #include <stdio.h>
+    #define KHR_ICD_TRACE(...) \
+    do \
+    { \
+        fprintf(stderr, "KHR ICD trace at %s:%d: ", __FILE__, __LINE__); \
+        fprintf(stderr, __VA_ARGS__); \
+    } while (0)
+#ifdef _WIN32
+#define KHR_ICD_WIDE_TRACE(...) \
+    do \
+    { \
+        fwprintf(stderr, L"KHR ICD trace at %hs:%d: ", __FILE__, __LINE__); \
+        fwprintf(stderr, __VA_ARGS__); \
+    } while (0)
+#else
+#define KHR_ICD_WIDE_TRACE(...)
+#endif
+    #define KHR_ICD_ASSERT(x) \
+    do \
+    { \
+        if (!(x)) \
+        { \
+            fprintf(stderr, "KHR ICD assert at %s:%d: %s failed", __FILE__, __LINE__, #x); \
+        } \
+    } while (0)
+#else
+    #define KHR_ICD_TRACE(...)
+    #define KHR_ICD_WIDE_TRACE(...)
+    #define KHR_ICD_ASSERT(x)
+#endif
+
+// if handle is NULL then return invalid_handle_error_code
+#define KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(handle,invalid_handle_error_code) \
+    do \
+    { \
+        if (!handle) \
+        { \
+            return invalid_handle_error_code; \
+        } \
+    } while (0)
+
+// if handle is NULL then set errcode_ret to invalid_handle_error and return NULL 
+// (NULL being an invalid handle)
+#define KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(handle,invalid_handle_error) \
+    do \
+    { \
+        if (!handle) \
+        { \
+            if (errcode_ret) \
+            { \
+                *errcode_ret = invalid_handle_error; \
+            } \
+            return NULL; \
+        } \
+    } while (0)
+
+
+#endif
+
diff --git a/loader/icd_dispatch.c b/loader/icd_dispatch.c
new file mode 100644 (file)
index 0000000..df967cb
--- /dev/null
@@ -0,0 +1,2674 @@
+/*
+ * Copyright (c) 2012-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 "icd_dispatch.h"
+#include "icd.h"
+#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
+{
+    KHRicdVendor* vendor = NULL;
+    cl_uint i;
+
+    // initialize the platforms (in case they have not been already)
+    khrIcdInitialize();
+
+    if (!num_entries && platforms)
+    {
+        return CL_INVALID_VALUE;
+    }
+    if (!platforms && !num_platforms)
+    {
+        return CL_INVALID_VALUE;
+    }
+    // set num_platforms to 0 and set all platform pointers to NULL
+    if (num_platforms) 
+    {
+        *num_platforms = 0;
+    }
+    for (i = 0; i < num_entries && platforms; ++i) 
+    {
+        platforms[i] = NULL;
+    }
+    // return error if we have no platforms
+    if (!khrIcdVendors)
+    {
+        return CL_PLATFORM_NOT_FOUND_KHR;
+    }
+    // otherwise enumerate all platforms
+    for (vendor = khrIcdVendors; vendor; vendor = vendor->next)
+    {
+        if (num_entries && platforms)
+        {
+            *(platforms++) = vendor->platform;
+            --num_entries;
+        }
+        if (num_platforms)
+        {
+            ++(*num_platforms);
+        }
+    }
+    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
+{
+    // 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);
+}
+
+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();    
+
+    // 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
+
+    // This is not an ICD-aware extension, so call into the implementation
+    // to get the extension function address.
+
+    KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(platform, NULL);
+    return platform->dispatch->clGetExtensionFunctionAddressForPlatform(
+        platform,
+        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);
+}
+
+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
+{
+    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
+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_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
+{
+    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);
+}
+
+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_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);
+}
+
+
diff --git a/loader/icd_dispatch.h b/loader/icd_dispatch.h
new file mode 100644 (file)
index 0000000..22af335
--- /dev/null
@@ -0,0 +1,1511 @@
+/*
+ * Copyright (c) 2016-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.
+ */
+
+#ifndef _ICD_DISPATCH_H_
+#define _ICD_DISPATCH_H_
+
+#ifndef CL_USE_DEPRECATED_OPENCL_1_0_APIS
+#define CL_USE_DEPRECATED_OPENCL_1_0_APIS
+#endif
+
+#ifndef CL_USE_DEPRECATED_OPENCL_1_1_APIS
+#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
+#endif
+
+#ifndef CL_USE_DEPRECATED_OPENCL_1_2_APIS
+#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
+#endif
+
+#ifndef CL_USE_DEPRECATED_OPENCL_2_0_APIS
+#define CL_USE_DEPRECATED_OPENCL_2_0_APIS
+#endif
+
+// cl.h
+#include <CL/cl.h>
+
+// cl_gl.h and required files
+#ifdef _WIN32
+#include <windows.h>
+#include <d3d9.h>
+#include <d3d10_1.h>
+#include <CL/cl_d3d10.h>
+#include <CL/cl_d3d11.h>
+#include <CL/cl_dx9_media_sharing.h>
+#endif
+#include <CL/cl_gl.h>
+#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;
+};
+
+/*
+ *
+ * vendor dispatch table structure
+ *
+ */
+
+struct _cl_platform_id
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+struct _cl_device_id
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+struct _cl_context
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+struct _cl_command_queue
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+struct _cl_mem
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+struct _cl_program
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+struct _cl_kernel
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+struct _cl_event
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+struct _cl_sampler
+{
+    KHRicdVendorDispatch *dispatch;
+};
+
+#endif // _ICD_DISPATCH_H_
+
diff --git a/loader/linux/icd_exports.map b/loader/linux/icd_exports.map
new file mode 100644 (file)
index 0000000..c716a39
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2016-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.
+ */
+
+OPENCL_1.0 {
+    global:
+        clBuildProgram;
+        clCreateBuffer;
+        clCreateCommandQueue;
+        clCreateContext;
+        clCreateContextFromType;
+        clCreateFromGLBuffer;
+        clCreateFromGLRenderbuffer;
+        clCreateFromGLTexture2D;
+        clCreateFromGLTexture3D;
+        clCreateImage2D;
+        clCreateImage3D;
+        clCreateKernel;
+        clCreateKernelsInProgram;
+        clCreateProgramWithBinary;
+        clCreateProgramWithSource;
+        clCreateSampler;
+        clEnqueueAcquireGLObjects;
+        clEnqueueBarrier;
+        clEnqueueCopyBuffer;
+        clEnqueueCopyBufferToImage;
+        clEnqueueCopyImage;
+        clEnqueueCopyImageToBuffer;
+        clEnqueueMapBuffer;
+        clEnqueueMapImage;
+        clEnqueueMarker;
+        clEnqueueNDRangeKernel;
+        clEnqueueNativeKernel;
+        clEnqueueReadBuffer;
+        clEnqueueReadImage;
+        clEnqueueReleaseGLObjects;
+        clEnqueueTask;
+        clEnqueueUnmapMemObject;
+        clEnqueueWaitForEvents;
+        clEnqueueWriteBuffer;
+        clEnqueueWriteImage;
+        clFinish;
+        clFlush;
+        clGetCommandQueueInfo;
+        clGetContextInfo;
+        clGetDeviceIDs;
+        clGetDeviceInfo;
+        clGetEventInfo;
+        clGetEventProfilingInfo;
+        clGetExtensionFunctionAddress;
+        clGetGLObjectInfo;
+        clGetGLTextureInfo;
+        clGetImageInfo;
+        clGetKernelInfo;
+        clGetKernelWorkGroupInfo;
+        clGetMemObjectInfo;
+        clGetPlatformIDs;
+        clGetPlatformInfo;
+        clGetProgramBuildInfo;
+        clGetProgramInfo;
+        clGetSamplerInfo;
+        clGetSupportedImageFormats;
+        clReleaseCommandQueue;
+        clReleaseContext;
+        clReleaseEvent;
+        clReleaseKernel;
+        clReleaseMemObject;
+        clReleaseProgram;
+        clReleaseSampler;
+        clRetainCommandQueue;
+        clRetainContext;
+        clRetainEvent;
+        clRetainKernel;
+        clRetainMemObject;
+        clRetainProgram;
+        clRetainSampler;
+        clSetCommandQueueProperty;
+        clSetKernelArg;
+        clUnloadCompiler;
+        clWaitForEvents;
+
+    local:
+        /* Everything else is local to ICD. */
+        *;
+};
+
+OPENCL_1.1 {
+    global:
+        clCreateSubBuffer;
+        clCreateUserEvent;
+        clEnqueueCopyBufferRect;
+        clEnqueueReadBufferRect;
+        clEnqueueWriteBufferRect;
+        clSetEventCallback;
+        clSetMemObjectDestructorCallback;
+        clSetUserEventStatus;
+} OPENCL_1.0;
+
+OPENCL_1.2 {
+    global:
+        clCompileProgram;
+        clCreateFromGLTexture;
+        clCreateImage;
+        clCreateProgramWithBuiltInKernels;
+        clCreateSubDevices;
+        clEnqueueBarrierWithWaitList;
+        clEnqueueFillBuffer;
+        clEnqueueFillImage;
+        clEnqueueMarkerWithWaitList;
+        clEnqueueMigrateMemObjects;
+        clGetExtensionFunctionAddressForPlatform;
+        clGetKernelArgInfo;
+        clLinkProgram;
+        clReleaseDevice;
+        clRetainDevice;
+        clUnloadPlatformCompiler;
+} OPENCL_1.1;
+
+OPENCL_2.0 {
+    global:
+        clCreateCommandQueueWithProperties;
+        clCreatePipe;
+        clGetPipeInfo;
+        clSVMAlloc;
+        clSVMFree;
+        clEnqueueSVMFree;
+        clEnqueueSVMMemcpy;
+        clEnqueueSVMMemFill;
+        clEnqueueSVMMap;
+        clEnqueueSVMUnmap;
+        clCreateSamplerWithProperties;
+        clSetKernelArgSVMPointer;
+        clSetKernelExecInfo;
+} OPENCL_1.2;
+
+OPENCL_2.1 {
+    global:
+        clCloneKernel;
+        clCreateProgramWithIL;
+        clEnqueueSVMMigrateMem;
+        clGetDeviceAndHostTimer;
+        clGetHostTimer;
+        clGetKernelSubGroupInfo;
+        clSetDefaultDeviceCommandQueue;
+} OPENCL_2.0;
+
+OPENCL_2.2 {
+    global:
+        clSetProgramReleaseCallback;
+        clSetProgramSpecializationConstant;
+} OPENCL_2.1;
diff --git a/loader/linux/icd_linux.c b/loader/linux/icd_linux.c
new file mode 100644 (file)
index 0000000..f6bb7b6
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2016-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 "icd.h"
+#include <dlfcn.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <pthread.h>
+
+static pthread_once_t initialized = PTHREAD_ONCE_INIT;
+
+/*
+ * 
+ * Vendor enumeration functions
+ *
+ */
+
+// go through the list of vendors in the two configuration files
+void khrIcdOsVendorsEnumerate(void)
+{
+    DIR *dir = NULL;
+    struct dirent *dirEntry = NULL;
+#ifdef __ANDROID__
+    char *vendorPath = "/system/vendor/Khronos/OpenCL/vendors/";
+#else
+    char *vendorPath = "/etc/OpenCL/vendors/";
+#endif // ANDROID
+
+    // open the directory
+    dir = opendir(vendorPath);
+    if (NULL == dir) 
+    {
+        KHR_ICD_TRACE("Failed to open path %s\n", vendorPath);
+        goto Cleanup;
+    }
+
+    // attempt to load all files in the directory
+    for (dirEntry = readdir(dir); dirEntry; dirEntry = readdir(dir) )
+    {
+        switch(dirEntry->d_type)
+        {
+        case DT_UNKNOWN:
+        case DT_REG:
+        case DT_LNK:
+            {
+                const char* extension = ".icd";
+                FILE *fin = NULL;
+                char* fileName = NULL;
+                char* buffer = NULL;
+                long bufferSize = 0;
+
+                // make sure the file name ends in .icd
+                if (strlen(extension) > strlen(dirEntry->d_name) )
+                {
+                    break;
+                }
+                if (strcmp(dirEntry->d_name + strlen(dirEntry->d_name) - strlen(extension), extension) ) 
+                {
+                    break;
+                }
+
+                // allocate space for the full path of the vendor library name
+                fileName = malloc(strlen(dirEntry->d_name) + strlen(vendorPath) + 1);
+                if (!fileName) 
+                {
+                    KHR_ICD_TRACE("Failed allocate space for ICD file path\n");
+                    break;
+                }
+                sprintf(fileName, "%s%s", vendorPath, dirEntry->d_name);
+
+                // open the file and read its contents
+                fin = fopen(fileName, "r");
+                if (!fin)
+                {
+                    free(fileName);
+                    break;
+                }
+                fseek(fin, 0, SEEK_END);
+                bufferSize = ftell(fin);
+
+                buffer = malloc(bufferSize+1);
+                if (!buffer)
+                {
+                    free(fileName);
+                    fclose(fin);
+                    break;
+                }                
+                memset(buffer, 0, bufferSize+1);
+                fseek(fin, 0, SEEK_SET);                       
+                if (bufferSize != (long)fread(buffer, 1, bufferSize, fin) )
+                {
+                    free(fileName);
+                    free(buffer);
+                    fclose(fin);
+                    break;
+                }
+                // ignore a newline at the end of the file
+                if (buffer[bufferSize-1] == '\n') buffer[bufferSize-1] = '\0';
+
+                // load the string read from the file
+                khrIcdVendorAdd(buffer);
+                
+                free(fileName);
+                free(buffer);
+                fclose(fin);
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+Cleanup:
+
+    // free resources and exit
+    if (dir) 
+    {
+        closedir(dir);
+    }
+}
+
+// go through the list of vendors only once
+void khrIcdOsVendorsEnumerateOnce(void)
+{
+    pthread_once(&initialized, khrIcdOsVendorsEnumerate);
+}
+
+/*
+ * 
+ * Dynamic library loading functions
+ *
+ */
+
+// dynamically load a library.  returns NULL on failure
+void *khrIcdOsLibraryLoad(const char *libraryName)
+{
+    return dlopen (libraryName, RTLD_NOW);
+}
+
+// get a function pointer from a loaded library.  returns NULL on failure.
+void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName)
+{
+    return dlsym(library, functionName);
+}
+
+// unload a library
+void khrIcdOsLibraryUnload(void *library)
+{
+    dlclose(library);
+}
+
diff --git a/loader/windows/OpenCL.def b/loader/windows/OpenCL.def
new file mode 100644 (file)
index 0000000..98abc9b
--- /dev/null
@@ -0,0 +1,162 @@
+;
+; Copyright (c) 2016-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.
+
+EXPORTS
+
+;
+; Note:
+;
+; 1. Functions are grouped into blocks according to the OpenCL API version they
+; were introduced in.
+;
+; 2. Function blocks are sorted in ascending order of the API version.
+;
+; 3. Functions within a block are sorted alphabetically.
+;
+
+; OpenCL 1.0 API
+clBuildProgram
+clCreateBuffer
+clCreateCommandQueue
+clCreateContext
+clCreateContextFromType
+clCreateFromGLBuffer
+clCreateFromGLRenderbuffer
+clCreateFromGLTexture2D
+clCreateFromGLTexture3D
+clCreateImage2D
+clCreateImage3D
+clCreateKernel
+clCreateKernelsInProgram
+clCreateProgramWithBinary
+clCreateProgramWithSource
+clCreateSampler
+clEnqueueAcquireGLObjects
+clEnqueueBarrier
+clEnqueueCopyBuffer
+clEnqueueCopyBufferToImage
+clEnqueueCopyImage
+clEnqueueCopyImageToBuffer
+clEnqueueMapBuffer
+clEnqueueMapImage
+clEnqueueMarker
+clEnqueueNDRangeKernel
+clEnqueueNativeKernel
+clEnqueueReadBuffer
+clEnqueueReadImage
+clEnqueueReleaseGLObjects
+clEnqueueTask
+clEnqueueUnmapMemObject
+clEnqueueWaitForEvents
+clEnqueueWriteBuffer
+clEnqueueWriteImage
+clFinish
+clFlush
+clGetCommandQueueInfo
+clGetContextInfo
+clGetDeviceIDs
+clGetDeviceInfo
+clGetEventInfo
+clGetEventProfilingInfo
+clGetExtensionFunctionAddress
+clGetGLObjectInfo
+clGetGLTextureInfo
+clGetImageInfo
+clGetKernelInfo
+clGetKernelWorkGroupInfo
+clGetMemObjectInfo
+clGetPlatformIDs
+clGetPlatformInfo
+clGetProgramBuildInfo
+clGetProgramInfo
+clGetSamplerInfo
+clGetSupportedImageFormats
+clReleaseCommandQueue
+clReleaseContext
+clReleaseEvent
+clReleaseKernel
+clReleaseMemObject
+clReleaseProgram
+clReleaseSampler
+clRetainCommandQueue
+clRetainContext
+clRetainEvent
+clRetainKernel
+clRetainMemObject
+clRetainProgram
+clRetainSampler
+clSetCommandQueueProperty
+clSetKernelArg
+clUnloadCompiler
+clWaitForEvents
+
+; OpenCL 1.1 API
+clCreateSubBuffer
+clCreateUserEvent
+clEnqueueCopyBufferRect
+clEnqueueReadBufferRect
+clEnqueueWriteBufferRect
+clSetEventCallback
+clSetMemObjectDestructorCallback
+clSetUserEventStatus
+
+; OpenCL 1.2 API
+clCompileProgram
+clCreateFromGLTexture
+clCreateImage
+clCreateProgramWithBuiltInKernels
+clCreateSubDevices
+clEnqueueBarrierWithWaitList
+clEnqueueFillBuffer
+clEnqueueFillImage
+clEnqueueMarkerWithWaitList
+clEnqueueMigrateMemObjects
+clGetExtensionFunctionAddressForPlatform
+clGetKernelArgInfo
+clLinkProgram
+clReleaseDevice
+clRetainDevice
+clUnloadPlatformCompiler
+
+; OpenCL 2.0 API
+clCreateCommandQueueWithProperties
+clCreatePipe
+clCreateSamplerWithProperties
+clEnqueueSVMFree
+clEnqueueSVMMap
+clEnqueueSVMMemcpy
+clEnqueueSVMMemFill
+clEnqueueSVMUnmap
+clGetPipeInfo
+clSetKernelArgSVMPointer
+clSetKernelExecInfo
+clSVMAlloc
+clSVMFree
+
+; OpenCL 2.1 API
+clCloneKernel
+clCreateProgramWithIL
+clEnqueueSVMMigrateMem
+clGetDeviceAndHostTimer
+clGetHostTimer
+clGetKernelSubGroupInfo
+clSetDefaultDeviceCommandQueue
+
+; OpenCL 2.2 API
+clSetProgramReleaseCallback
+clSetProgramSpecializationConstant
+
diff --git a/loader/windows/OpenCL.rc b/loader/windows/OpenCL.rc
new file mode 100644 (file)
index 0000000..561e6ba
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2016-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 <windows.h>
+
+#ifdef RC_INVOKED
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION    2,2,1,0
+PRODUCTVERSION 2,2,1,0
+FILETYPE       VFT_DLL
+
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904E4"
+        BEGIN
+            VALUE "FileDescription" ,"OpenCL Client DLL"
+            VALUE "ProductName"     ,"Khronos OpenCL ICD"
+            VALUE "LegalCopyright"  ,"Copyright \251 The Khronos Group Inc 2016-2019"
+            VALUE "FileVersion"     ,"2.2.1.0"
+            VALUE "CompanyName"     ,"Khronos Group"
+            VALUE "InternalName"    ,"OpenCL"
+            VALUE "OriginalFilename","OpenCL.dll"
+        END
+    END
+
+    BLOCK "VarFileInfo"
+    BEGIN
+        // extend this line for localized versions
+        VALUE "Translation", 0x0409, 0x04E4
+    END
+END
+
+#endif
+
diff --git a/loader/windows/icd_windows.c b/loader/windows/icd_windows.c
new file mode 100644 (file)
index 0000000..5f89085
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2016-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 "icd.h"
+#include "icd_windows_hkr.h"
+#include <stdio.h>
+#include <windows.h>
+#include <winreg.h>
+
+static INIT_ONCE initialized = INIT_ONCE_STATIC_INIT;
+
+/*
+ * 
+ * Vendor enumeration functions
+ *
+ */
+
+// go through the list of vendors in the registry and call khrIcdVendorAdd 
+// for each vendor encountered
+BOOL CALLBACK khrIcdOsVendorsEnumerate(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContext)
+{
+    LONG result;
+    const char* platformsName = "SOFTWARE\\Khronos\\OpenCL\\Vendors";
+    HKEY platformsKey = NULL;
+    DWORD dwIndex;
+
+    if (!khrIcdOsVendorsEnumerateHKR())
+    {
+        KHR_ICD_TRACE("Failed to enumerate HKR entries, continuing\n");
+    }
+
+    KHR_ICD_TRACE("Opening key HKLM\\%s...\n", platformsName);
+    result = RegOpenKeyExA(
+        HKEY_LOCAL_MACHINE,
+        platformsName,
+        0,
+        KEY_READ,
+        &platformsKey);
+    if (ERROR_SUCCESS != result)
+    {
+        KHR_ICD_TRACE("Failed to open platforms key %s, continuing\n", platformsName);
+        return TRUE;
+    }
+
+    // for each value
+    for (dwIndex = 0;; ++dwIndex)
+    {
+        char cszLibraryName[1024] = {0};
+        DWORD dwLibraryNameSize = sizeof(cszLibraryName);
+        DWORD dwLibraryNameType = 0;     
+        DWORD dwValue = 0;
+        DWORD dwValueSize = sizeof(dwValue);
+
+        // read the value name
+        KHR_ICD_TRACE("Reading value %d...\n", dwIndex);
+        result = RegEnumValueA(
+              platformsKey,
+              dwIndex,
+              cszLibraryName,
+              &dwLibraryNameSize,
+              NULL,
+              &dwLibraryNameType,
+              (LPBYTE)&dwValue,
+              &dwValueSize);
+        // if RegEnumKeyEx fails, we are done with the enumeration
+        if (ERROR_SUCCESS != result) 
+        {
+            KHR_ICD_TRACE("Failed to read value %d, done reading key.\n", dwIndex);
+            break;
+        }
+        KHR_ICD_TRACE("Value %s found...\n", cszLibraryName);
+        
+        // Require that the value be a DWORD and equal zero
+        if (REG_DWORD != dwLibraryNameType)  
+        {
+            KHR_ICD_TRACE("Value not a DWORD, skipping\n");
+            continue;
+        }
+        if (dwValue)
+        {
+            KHR_ICD_TRACE("Value not zero, skipping\n");
+            continue;
+        }
+
+        // add the library
+        khrIcdVendorAdd(cszLibraryName);
+    }
+
+    result = RegCloseKey(platformsKey);
+    if (ERROR_SUCCESS != result)
+    {
+        KHR_ICD_TRACE("Failed to close platforms key %s, ignoring\n", platformsName);
+    }
+       
+    return TRUE;
+}
+
+// go through the list of vendors only once
+void khrIcdOsVendorsEnumerateOnce()
+{
+    InitOnceExecuteOnce(&initialized, khrIcdOsVendorsEnumerate, NULL, NULL);
+}
+/*
+ * 
+ * Dynamic library loading functions
+ *
+ */
+
+// dynamically load a library.  returns NULL on failure
+void *khrIcdOsLibraryLoad(const char *libraryName)
+{
+    return (void *)LoadLibraryA(libraryName);
+}
+
+// get a function pointer from a loaded library.  returns NULL on failure.
+void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName)
+{
+    if (!library || !functionName)
+    {
+        return NULL;
+    }
+    return GetProcAddress( (HMODULE)library, functionName);
+}
+
+// unload a library.
+void khrIcdOsLibraryUnload(void *library)
+{
+    FreeLibrary( (HMODULE)library);
+}
+
diff --git a/loader/windows/icd_windows_hkr.c b/loader/windows/icd_windows_hkr.c
new file mode 100644 (file)
index 0000000..5f6c534
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ * 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 "icd.h"
+#include "icd_windows_hkr.h"
+#include <windows.h>
+#include <cfgmgr32.h>
+#include <assert.h>
+#include <stdbool.h>
+#include <initguid.h>
+#include <Devpkey.h>
+#include <devguid.h>
+
+ // This GUID was only added to devguid.h on Windows SDK v10.0.16232 which
+ // corresponds to Windows 10 Redstone 3 (Windows 10 Fall Creators Update).
+DEFINE_GUID(OCL_GUID_DEVCLASS_SOFTWARECOMPONENT, 0x5c4c3332, 0x344d, 0x483c, 0x87, 0x39, 0x25, 0x9e, 0x93, 0x4c, 0x9c, 0xc8);
+
+typedef enum
+{
+    ProbeFailure,
+    PendingReboot,
+    Valid
+} DeviceProbeResult;
+
+#define KHR_SAFE_RELEASE(mem)       \
+    do                              \
+    {                               \
+        free(mem);                  \
+        mem = NULL;                 \
+    } while (0)
+
+static const char OPENCL_REG_SUB_KEY[] = "OpenCLDriverName";
+
+#ifndef _WIN64
+static const char OPENCL_REG_SUB_KEY_WOW[] = "OpenCLDriverNameWow";
+#endif
+
+// Do not free the memory returned by this function.
+static const char* GetOpenCLRegKeyName(void)
+{
+#ifdef _WIN64
+    return OPENCL_REG_SUB_KEY;
+#else
+    // The suffix/substring "WoW" is meaningful only when a 32-bit
+    // application is running on a 64-bit Windows OS. A 32-bit application
+    // running on a 32-bit OS uses non-WoW names.
+    BOOL is_wow64;
+    if (IsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64)
+    {
+        return OPENCL_REG_SUB_KEY_WOW;
+    }
+
+    return OPENCL_REG_SUB_KEY;
+#endif
+}
+
+static bool ReadOpenCLKey(DEVINST dnDevNode)
+{
+    HKEY hkey = 0;
+    CONFIGRET ret;
+    bool bRet = false;
+    DWORD dwLibraryNameType = 0;
+    char *cszOclPath = NULL;
+    DWORD dwOclPathSize = 0;
+    LSTATUS result;
+
+    ret = CM_Open_DevNode_Key(
+        dnDevNode,
+        KEY_QUERY_VALUE,
+        0,
+        RegDisposition_OpenExisting,
+        &hkey,
+        CM_REGISTRY_SOFTWARE);
+
+    if (CR_SUCCESS != ret)
+    {
+        KHR_ICD_TRACE("Failed with ret 0x%x\n", ret);
+        goto out;
+    }
+    else
+    {
+        result = RegQueryValueExA(
+            hkey,
+            GetOpenCLRegKeyName(),
+            NULL,
+            &dwLibraryNameType,
+            NULL,
+            &dwOclPathSize);
+
+        if (ERROR_SUCCESS != result)
+        {
+            KHR_ICD_TRACE("Failed to open sub key 0x%x\n", result);
+            goto out;
+        }
+
+        cszOclPath = malloc(dwOclPathSize);
+        if (NULL == cszOclPath)
+        {
+            KHR_ICD_TRACE("Failed to allocate %u bytes for registry value\n", dwOclPathSize);
+            goto out;
+        }
+
+        result = RegQueryValueExA(
+            hkey,
+            OPENCL_REG_SUB_KEY,
+            NULL,
+            &dwLibraryNameType,
+            (LPBYTE)cszOclPath,
+            &dwOclPathSize);
+        if (ERROR_SUCCESS != result)
+        {
+            KHR_ICD_TRACE("Failed to open sub key 0x%x\n", result);
+            goto out;
+        }
+
+        if (REG_SZ != dwLibraryNameType)
+        {
+            KHR_ICD_TRACE("Unexpected registry entry 0x%x! continuing\n", dwLibraryNameType);
+            goto out;
+        }
+
+        KHR_ICD_TRACE("    Path: %s\n", cszOclPath);
+
+        khrIcdVendorAdd(cszOclPath);
+
+        bRet = true;
+    }
+
+out:
+    free(cszOclPath);
+
+    if (hkey)
+    {
+        result = RegCloseKey(hkey);
+        if (ERROR_SUCCESS != result)
+        {
+            KHR_ICD_TRACE("WARNING: failed to close hkey 0x%x\n", result);
+        }
+    }
+
+    return bRet;
+}
+
+static DeviceProbeResult ProbeDevice(DEVINST devnode)
+{
+    CONFIGRET ret;
+    ULONG ulStatus;
+    ULONG ulProblem;
+
+    ret = CM_Get_DevNode_Status(
+        &ulStatus,
+        &ulProblem,
+        devnode,
+        0);
+
+    if (CR_SUCCESS != ret)
+    {
+        KHR_ICD_TRACE("    WARNING: failed to probe the status of the device 0x%x\n", ret);
+        return ProbeFailure;
+    }
+
+    //
+    // Careful here, we need to check 2 scenarios:
+    // 1. DN_NEED_RESTART
+    //    status flag indicates that a reboot is needed when an _already started_
+    //    device cannot be stopped. This covers devices that are still started with their
+    //    old KMD (because they couldn't be stopped/restarted) while the UMD is updated
+    //    and possibly out of sync.
+    //
+    // 2.  Status & DN_HAS_PROBLEM  && Problem == CM_PROB_NEED_RESTART
+    //     indicates that a reboot is needed when a _stopped device_ cannot be (re)started.
+    //
+    if (((ulStatus & DN_HAS_PROBLEM) && ulProblem == CM_PROB_NEED_RESTART) ||
+          ulStatus & DN_NEED_RESTART)
+    {
+        KHR_ICD_TRACE("    WARNING: device is pending reboot (0x%x), skipping...\n", ulStatus);
+        return PendingReboot;
+    }
+
+    return Valid;
+}
+
+// Tries to look for the OpenCL key under the display devices and
+// if not found, falls back to software component devices.
+bool khrIcdOsVendorsEnumerateHKR(void)
+{
+    CONFIGRET ret;
+    int iret;
+    bool foundOpenCLKey = false;
+    DEVINST devinst = 0;
+    DEVINST devchild = 0;
+    wchar_t *deviceIdList = NULL;
+    ULONG szBuffer = 0;
+
+    OLECHAR display_adapter_guid_str[MAX_GUID_STRING_LEN];
+    ULONG ulFlags = CM_GETIDLIST_FILTER_CLASS |
+                    CM_GETIDLIST_FILTER_PRESENT;
+
+    iret = StringFromGUID2(
+        &GUID_DEVCLASS_DISPLAY,
+        display_adapter_guid_str,
+        MAX_GUID_STRING_LEN);
+
+    if (MAX_GUID_STRING_LEN != iret)
+    {
+        KHR_ICD_TRACE("StringFromGUID2 failed with %d\n", iret);
+        goto out;
+    }
+
+    // Paranoia: we might have a new device added to the list between the call
+    // to CM_Get_Device_ID_List_Size() and the call to CM_Get_Device_ID_List().
+    do
+    {
+        ret = CM_Get_Device_ID_List_SizeW(
+            &szBuffer,
+            display_adapter_guid_str,
+            ulFlags);
+
+        if (CR_SUCCESS != ret)
+        {
+            KHR_ICD_TRACE("CM_Get_Device_ID_List_size failed with 0x%x\n", ret);
+            break;
+        }
+
+        // "pulLen [out] Receives a value representing the required buffer
+        //  size, in characters."
+        //  So we need to allocate the right size in bytes but we still need
+        //  to keep szBuffer as it was returned from CM_Get_Device_ID_List_Size so
+        //  the call to CM_Get_Device_ID_List will receive the correct size.
+        deviceIdList = malloc(szBuffer * sizeof(wchar_t));
+        if (NULL == deviceIdList)
+        {
+            KHR_ICD_TRACE("Failed to allocate %u bytes for device ID strings\n", szBuffer);
+            break;
+        }
+
+        ret = CM_Get_Device_ID_ListW(
+            display_adapter_guid_str,
+            deviceIdList,
+            szBuffer,
+            ulFlags);
+
+        if (CR_SUCCESS != ret)
+        {
+            KHR_ICD_TRACE("CM_Get_Device_ID_List failed with 0x%x\n", ret);
+            KHR_SAFE_RELEASE(deviceIdList);
+        }
+    } while (CR_BUFFER_SMALL == ret);
+
+    if (NULL == deviceIdList)
+    {
+        goto out;
+    }
+
+    for (PWSTR deviceId = deviceIdList; *deviceId; deviceId += wcslen(deviceId) + 1)
+    {
+        DEVPROPTYPE devpropType;
+
+        KHR_ICD_WIDE_TRACE(L"Device ID: %ls\n", deviceId);
+
+        ret = CM_Locate_DevNodeW(&devinst, deviceId, 0);
+        if (CR_SUCCESS == ret)
+        {
+            KHR_ICD_TRACE("    devinst: %d\n", devinst);
+        }
+        else
+        {
+            KHR_ICD_TRACE("CM_Locate_DevNode failed with 0x%x\n", ret);
+            continue;
+        }
+
+        if (ProbeDevice(devinst) != Valid)
+        {
+            continue;
+        }
+
+        KHR_ICD_TRACE("    Trying to look for the key in the display adapter HKR...\n");
+        if (ReadOpenCLKey(devinst))
+        {
+            foundOpenCLKey = true;
+            continue;
+        }
+
+        KHR_ICD_TRACE("    Could not find the key, proceeding to children software components...\n");
+
+        ret = CM_Get_Child(
+            &devchild,
+            devinst,
+            0);
+
+        if (CR_SUCCESS != ret)
+        {
+            KHR_ICD_TRACE("    CM_Get_Child returned 0x%x, skipping children...\n", ret);
+        }
+        else
+        {
+            do
+            {
+                wchar_t deviceInstanceID[MAX_DEVICE_ID_LEN] = { 0 };
+                GUID guid;
+                ULONG szGuid = sizeof(guid);
+
+                KHR_ICD_TRACE("    devchild: %d\n", devchild);
+                ret = CM_Get_Device_IDW(
+                    devchild,
+                    deviceInstanceID,
+                    sizeof(deviceInstanceID),
+                    0);
+
+                if (CR_SUCCESS != ret)
+                {
+                    KHR_ICD_TRACE("    CM_Get_Device_ID returned 0x%x, skipping device...\n", ret);
+                    continue;
+                }
+                else
+                {
+                    KHR_ICD_WIDE_TRACE(L"    deviceInstanceID: %ls\n", deviceInstanceID);
+                }
+
+                ret = CM_Get_DevNode_PropertyW(
+                    devchild,
+                    &DEVPKEY_Device_ClassGuid,
+                    &devpropType,
+                    (PBYTE)&guid,
+                    &szGuid,
+                    0);
+
+                if (CR_SUCCESS != ret ||
+                    !IsEqualGUID(&OCL_GUID_DEVCLASS_SOFTWARECOMPONENT, &guid))
+                {
+                    continue;
+                }
+
+                if (ProbeDevice(devchild) != Valid)
+                {
+                    continue;
+                }
+
+                if (ReadOpenCLKey(devchild))
+                {
+                    foundOpenCLKey = true;
+                    break;
+                }
+            } while (CM_Get_Sibling(&devchild, devchild, 0) == CR_SUCCESS);
+        }
+    }
+
+out:
+    free(deviceIdList);
+    return foundOpenCLKey;
+}
diff --git a/loader/windows/icd_windows_hkr.h b/loader/windows/icd_windows_hkr.h
new file mode 100644 (file)
index 0000000..698fe5a
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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>
+
+bool khrIcdOsVendorsEnumerateHKR(void);
index ed84476d94a398683d050a9f9f9a25d8c012d831..a15899588847e90466500373f6d3f172693b827b 100644 (file)
@@ -1,7 +1,7 @@
 include_directories (./inc)
 
-add_subdirectory (platform)
+add_subdirectory (log)
 add_subdirectory (driver_stub)
 add_subdirectory (loader_test)
 
-add_test (OPENCL_ICD_LOADER_TEST ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/icd_loader_test)
+add_test (NAME opencl_icd_loader_test COMMAND icd_loader_test)
index 13048172fb6f7a7e9a4da8c1d918193b39be438b..47b3bd273e0c4e710536b43739f94b37c8addb52 100644 (file)
@@ -5,6 +5,6 @@ if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
     list (APPEND OPENCL_DRIVER_STUB_SOURCES driver_stub.def)
 endif ()
 
-add_library (OpenCLDriverStub SHARED ${OPENCL_DRIVER_STUB_SOURCES})
+add_library (OpenCLDriverStub ${OPENCL_DRIVER_STUB_SOURCES})
 
 target_link_libraries (OpenCLDriverStub IcdLog)
index a933946faef7b43d68849fef31ae06402d44d331..1d783d16bf109e7a78b60f8e6bf2d2e0fae873d5 100644 (file)
@@ -11,11 +11,10 @@ extern int test_buffer_object();
 extern int test_program_objects();
 extern int test_image_objects();
 extern int test_sampler_objects();
-extern int initialize_log();
-extern int test_icd_match();
-
 extern int test_OpenGL_share();
-extern int test_Direct3D10_share();
+extern int test_release_calls();
+
+extern int test_icd_match();
 
 int main(int argc, char **argv)
 {
@@ -31,9 +30,8 @@ int main(int argc, char **argv)
     test_image_objects();
     test_sampler_objects();
     test_OpenGL_share();
-
-//    test_Direct3D10_share();
     test_release_calls();
+
     test_icd_close_app_log();
     test_icd_close_stub_log();
     
index e5f8ed45c915b99d9d0fcbbbab73259b388abf7b..06a1f2bf803d05e75bf198890d758c0955bfea94 100644 (file)
@@ -760,7 +760,7 @@ struct clGetKernelWorkGroupInfo_st
 struct clEnqueueMigrateMemObjects_st 
 {
     cl_command_queue command_queue;
-    size_t num_mem_objects;
+    cl_uint num_mem_objects;
     const cl_mem *mem_objects;
     cl_mem_migration_flags flags;
     cl_uint num_events_in_wait_list;
index 85a2178c6495ec16e4d81af9a0d502fbaef37978..1710e8800657171f98782f5453c286067bfcd591 100644 (file)
@@ -1,3 +1,5 @@
+#include <stdlib.h>
+
 #include <CL/cl.h>
 #include "param_struct.h"
 #include <platform/icd_test_log.h>
index 0c47d1300f256d2bdb1743d054309ae897b5dc59..f399451310677a06e432a9c8c57af9c5a0efcb82 100644 (file)
@@ -1,3 +1,5 @@
+#include <stdlib.h>
+
 #include <CL/cl.h>
 #include "param_struct.h"
 #include <platform/icd_test_log.h>
diff --git a/test/log/CMakeLists.txt b/test/log/CMakeLists.txt
new file mode 100644 (file)
index 0000000..93dea6c
--- /dev/null
@@ -0,0 +1,4 @@
+add_library (IcdLog icd_test_log.c)
+if (WIN32)
+    target_compile_definitions (IcdLog PRIVATE _CRT_SECURE_NO_WARNINGS)
+endif()
diff --git a/test/log/Makefile b/test/log/Makefile
new file mode 100644 (file)
index 0000000..8cfb38d
--- /dev/null
@@ -0,0 +1,15 @@
+# Set this if system does not have OpenCL headers in standard include directory
+CL_HEADER_PATH := ../../
+
+.PHONY: clean
+
+CFLAGS := -I${CL_HEADER_PATH}
+CFLAGS += -fPIC
+
+OUTDIR := ../../bin
+
+${OUTDIR}/libIcdLog.so: icd_test_log.c
+       ${CC} ${CFLAGS} -shared -Wl,-soname,libIcdLog.so -o $@ $^
+
+clean:
+       rm -f ${OUTDIR}/libIcdLog.so
diff --git a/test/log/icd_test_log.c b/test/log/icd_test_log.c
new file mode 100644 (file)
index 0000000..cd7cc7d
--- /dev/null
@@ -0,0 +1,103 @@
+#include<sys/stat.h>
+#include<stdlib.h>
+#include<stdio.h>
+#include<stdarg.h>
+#include<CL/cl.h>
+#include<platform/icd_test_log.h>
+
+#define APP_LOG_FILE  "icd_test_app_log.txt"
+#define STUB_LOG_FILE "icd_test_stub_log.txt"
+
+static FILE *app_log_file;
+static FILE *stub_log_file;
+
+int test_icd_initialize_app_log(void)
+{
+    app_log_file = fopen(APP_LOG_FILE, "w");
+    if (!app_log_file) {
+               printf("Unable to open file %s\n", APP_LOG_FILE);
+        return -1;
+    }
+    
+    return 0;
+}
+
+void test_icd_close_app_log(void)
+{
+    fclose(app_log_file);
+}
+
+void test_icd_app_log(const char *format, ...)
+{
+    va_list args;
+    va_start(args, format);
+    vfprintf(app_log_file, format, args);
+    va_end(args);
+}
+
+int test_icd_initialize_stub_log(void)
+{
+       stub_log_file = fopen(STUB_LOG_FILE, "w");
+    if (!stub_log_file) {
+               printf("Unable to open file %s\n", STUB_LOG_FILE);
+        return -1;
+    }
+    
+    return 0;
+
+}
+
+void test_icd_close_stub_log(void)
+{
+    fclose(stub_log_file);
+}
+
+void test_icd_stub_log(const char *format, ...)
+{
+    va_list args;
+    va_start(args, format);
+    vfprintf(stub_log_file, format, args);
+    va_end(args);
+}
+
+static char *test_icd_get_log(const char *filename)
+{
+    struct stat statbuf;
+    FILE *fp;
+    char *source = NULL;
+
+    fp = fopen(filename, "rb");
+
+    if (fp) {
+        size_t fsize = 0;
+        stat(filename, &statbuf);
+        fsize = statbuf.st_size;
+        source = (char *)malloc(fsize+1); // +1 for NULL terminator
+        if (source) {
+            if (fsize) {
+                if (fread(source, fsize, 1, fp) != 1) {
+                    free(source);
+                    source = NULL;
+                } else {
+                    source[fsize] = '\0';
+                }
+            } else {
+                // Don't fail when fsize = 0, just return empty string
+                source[fsize] = '\0';
+            }
+        }
+        fclose(fp);
+    }
+
+    return source;
+}
+
+char *test_icd_get_app_log(void)
+{
+    return test_icd_get_log(APP_LOG_FILE);
+}
+
+char *test_icd_get_stub_log(void)
+{
+    return test_icd_get_log(STUB_LOG_FILE);
+}
diff --git a/test/platform/CMakeLists.txt b/test/platform/CMakeLists.txt
deleted file mode 100644 (file)
index b35ca93..0000000
+++ /dev/null
@@ -1 +0,0 @@
-add_library (IcdLog SHARED icd_test_log.c)
diff --git a/test/platform/Makefile b/test/platform/Makefile
deleted file mode 100644 (file)
index 8cfb38d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# Set this if system does not have OpenCL headers in standard include directory
-CL_HEADER_PATH := ../../
-
-.PHONY: clean
-
-CFLAGS := -I${CL_HEADER_PATH}
-CFLAGS += -fPIC
-
-OUTDIR := ../../bin
-
-${OUTDIR}/libIcdLog.so: icd_test_log.c
-       ${CC} ${CFLAGS} -shared -Wl,-soname,libIcdLog.so -o $@ $^
-
-clean:
-       rm -f ${OUTDIR}/libIcdLog.so
diff --git a/test/platform/icd_test_log.c b/test/platform/icd_test_log.c
deleted file mode 100644 (file)
index cd7cc7d..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-#include<sys/stat.h>
-#include<stdlib.h>
-#include<stdio.h>
-#include<stdarg.h>
-#include<CL/cl.h>
-#include<platform/icd_test_log.h>
-
-#define APP_LOG_FILE  "icd_test_app_log.txt"
-#define STUB_LOG_FILE "icd_test_stub_log.txt"
-
-static FILE *app_log_file;
-static FILE *stub_log_file;
-
-int test_icd_initialize_app_log(void)
-{
-    app_log_file = fopen(APP_LOG_FILE, "w");
-    if (!app_log_file) {
-               printf("Unable to open file %s\n", APP_LOG_FILE);
-        return -1;
-    }
-    
-    return 0;
-}
-
-void test_icd_close_app_log(void)
-{
-    fclose(app_log_file);
-}
-
-void test_icd_app_log(const char *format, ...)
-{
-    va_list args;
-    va_start(args, format);
-    vfprintf(app_log_file, format, args);
-    va_end(args);
-}
-
-int test_icd_initialize_stub_log(void)
-{
-       stub_log_file = fopen(STUB_LOG_FILE, "w");
-    if (!stub_log_file) {
-               printf("Unable to open file %s\n", STUB_LOG_FILE);
-        return -1;
-    }
-    
-    return 0;
-
-}
-
-void test_icd_close_stub_log(void)
-{
-    fclose(stub_log_file);
-}
-
-void test_icd_stub_log(const char *format, ...)
-{
-    va_list args;
-    va_start(args, format);
-    vfprintf(stub_log_file, format, args);
-    va_end(args);
-}
-
-static char *test_icd_get_log(const char *filename)
-{
-    struct stat statbuf;
-    FILE *fp;
-    char *source = NULL;
-
-    fp = fopen(filename, "rb");
-
-    if (fp) {
-        size_t fsize = 0;
-        stat(filename, &statbuf);
-        fsize = statbuf.st_size;
-        source = (char *)malloc(fsize+1); // +1 for NULL terminator
-        if (source) {
-            if (fsize) {
-                if (fread(source, fsize, 1, fp) != 1) {
-                    free(source);
-                    source = NULL;
-                } else {
-                    source[fsize] = '\0';
-                }
-            } else {
-                // Don't fail when fsize = 0, just return empty string
-                source[fsize] = '\0';
-            }
-        }
-        fclose(fp);
-    }
-
-    return source;
-}
-
-char *test_icd_get_app_log(void)
-{
-    return test_icd_get_log(APP_LOG_FILE);
-}
-
-char *test_icd_get_stub_log(void)
-{
-    return test_icd_get_log(STUB_LOG_FILE);
-}