/*
 * Copyright (C) 2017-2018 Intel Corporation
 *
 * SPDX-License-Identifier: MIT
 *
 */

#pragma once

#include "CL/cl.h"
#include "CL/cl_ext.h"
#include "CL/cl_ext_intel.h"
#include "CL/cl_gl.h"
#include "CL/cl_gl_ext.h"
#if defined(_WIN32)
#include <d3d10_1.h>
#include "CL/cl_dx9_media_sharing.h"
#include "CL/cl_d3d10.h"
#include "CL/cl_d3d11.h"
#define CL_DX9_MEDIA_SHARING_INTEL_EXT
#include "CL/cl_dx9_media_sharing_intel.h"
#include "runtime/os_interface/windows/windows_wrapper.h"
#else
#define CL_CONTEXT_D3D10_DEVICE_KHR 0x4014
#define CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 0x402C
#define CL_MEM_D3D10_RESOURCE_KHR 0x4015
typedef cl_uint cl_dx9_device_source_intel;
typedef cl_uint cl_dx9_device_set_intel;
typedef cl_uint cl_dx9_media_adapter_type_khr;
typedef cl_uint cl_dx9_media_adapter_set_khr;
typedef cl_uint cl_d3d10_device_source_khr;
typedef cl_uint cl_d3d10_device_set_khr;
typedef void *IDirect3DSurface9;
typedef void *ID3D10Buffer;
typedef void *ID3D10Texture2D;
typedef void *ID3D10Texture3D;
typedef unsigned int UINT;
typedef cl_uint cl_d3d11_device_source_khr;
typedef cl_uint cl_d3d11_device_set_khr;
typedef void *ID3D11Buffer;
typedef void *ID3D11Texture2D;
typedef void *ID3D11Texture3D;
typedef void *HANDLE;
#endif

typedef cl_bitfield cl_queue_properties_khr;
typedef void(CL_CALLBACK *ctxt_logging_fn)(const char *, const void *, size_t, void *);
typedef void(CL_CALLBACK *prog_logging_fn)(cl_program, void *);
typedef void(CL_CALLBACK *evnt_logging_fn)(cl_event, cl_int, void *);
typedef void(CL_CALLBACK *memobj_logging_fn)(cl_mem, void *);
typedef void(CL_CALLBACK *svmfree_logging_fn)(cl_command_queue, cl_uint, void *[], void *);

/*
*
* function pointer typedefs
*
*/

// Platform APIs
typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetPlatformIDs)(
    cl_uint numEntries,
    cl_platform_id *platforms,
    cl_uint *numPlatforms) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetPlatformInfo)(
    cl_platform_id platform,
    cl_platform_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) 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 deviceType,
    cl_uint numEntries,
    cl_device_id *devices,
    cl_uint *numDevices) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetDeviceInfo)(
    cl_device_id device,
    cl_device_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

// Context APIs
typedef CL_API_ENTRY cl_context(CL_API_CALL *KHRpfn_clCreateContext)(
    const cl_context_properties *properties,
    cl_uint numDevices,
    const cl_device_id *devices,
    ctxt_logging_fn funcNotify,
    void *userData,
    cl_int *errcodeRet) 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 deviceType,
    ctxt_logging_fn funcNotify,
    void *userData,
    cl_int *errcodeRet) 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 paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) 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 *errcodeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clRetainCommandQueue)(
    cl_command_queue commandQueue) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clReleaseCommandQueue)(
    cl_command_queue commandQueue) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetCommandQueueInfo)(
    cl_command_queue commandQueue,
    cl_command_queue_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clSetCommandQueueProperty)(
    cl_command_queue commandQueue,
    cl_command_queue_properties properties,
    cl_bool enable,
    cl_command_queue_properties *oldProperties) 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 *hostPtr,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_mem(CL_API_CALL *KHRpfn_clCreateImage2D)(
    cl_context context,
    cl_mem_flags flags,
    const cl_image_format *imageFormat,
    size_t imageWidth,
    size_t imageHeight,
    size_t imageRowPitch,
    void *hostPtr,
    cl_int *errcodeRet) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_mem(CL_API_CALL *KHRpfn_clCreateImage3D)(
    cl_context context,
    cl_mem_flags flags,
    const cl_image_format *imageFormat,
    size_t imageWidth,
    size_t imageHeight,
    size_t imageDepth,
    size_t imageRowPitch,
    size_t imageSlicePitch,
    void *hostPtr,
    cl_int *errcodeRet) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

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 imageType,
    cl_uint numEntries,
    cl_image_format *imageFormats,
    cl_uint *numImageFormats) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetMemObjectInfo)(
    cl_mem memobj,
    cl_mem_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetImageInfo)(
    cl_mem image,
    cl_image_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

// Sampler APIs
typedef CL_API_ENTRY cl_sampler(CL_API_CALL *KHRpfn_clCreateSampler)(
    cl_context context,
    cl_bool normalizedCoords,
    cl_addressing_mode addressingMode,
    cl_filter_mode filterMode,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_sampler(CL_API_CALL *KHRpfn_clCreateSamplerWithProperties)(
    cl_context context,
    const cl_sampler_properties *samplerProperties,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_mem(CL_API_CALL *KHRpfn_clCreatePipe)(
    cl_context context,
    cl_mem_flags flags,
    cl_uint pipePacketSize,
    cl_uint pipeMaxPackets,
    const cl_pipe_properties *properties,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetPipeInfo)(
    cl_mem image,
    cl_pipe_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_2_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 paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_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 *errcodeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_program(CL_API_CALL *KHRpfn_clCreateProgramWithBinary)(
    cl_context context,
    cl_uint numDevices,
    const cl_device_id *deviceList,
    const size_t *lengths,
    const unsigned char **binaries,
    cl_int *binaryStatus,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_0;

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 numDevices,
    const cl_device_id *deviceList,
    const char *options,
    prog_logging_fn funcNotify,
    void *userData) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_int(CL_API_CALL *KHRpfn_clUnloadCompiler)() CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetProgramInfo)(
    cl_program program,
    cl_program_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) 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 paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) 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 *kernelName,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clCreateKernelsInProgram)(
    cl_program program,
    cl_uint numKernels,
    cl_kernel *kernels,
    cl_uint *numKernelsRet) 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 argIndex,
    size_t argSize,
    const void *argValue) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetKernelInfo)(
    cl_kernel kernel,
    cl_kernel_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetKernelWorkGroupInfo)(
    cl_kernel kernel,
    cl_device_id device,
    cl_kernel_work_group_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

// Event Object APIs
typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clWaitForEvents)(
    cl_uint numEvents,
    const cl_event *eventList) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetEventInfo)(
    cl_event event,
    cl_event_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) 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 paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

// Flush and Finish APIs
typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clFlush)(
    cl_command_queue commandQueue) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clFinish)(
    cl_command_queue commandQueue) CL_API_SUFFIX__VERSION_1_0;

// Enqueued Commands APIs
typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueReadBuffer)(
    cl_command_queue commandQueue,
    cl_mem buffer,
    cl_bool blockingRead,
    size_t offset,
    size_t cb,
    void *ptr,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueWriteBuffer)(
    cl_command_queue commandQueue,
    cl_mem buffer,
    cl_bool blockingWrite,
    size_t offset,
    size_t cb,
    const void *ptr,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueCopyBuffer)(
    cl_command_queue commandQueue,
    cl_mem srcBuffer,
    cl_mem dstBuffer,
    size_t srcOffset,
    size_t dstOffset,
    size_t cb,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueReadImage)(
    cl_command_queue commandQueue,
    cl_mem image,
    cl_bool blockingRead,
    const size_t *origin,
    const size_t *region,
    size_t rowPitch,
    size_t slicePitch,
    void *ptr,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueWriteImage)(
    cl_command_queue commandQueue,
    cl_mem image,
    cl_bool blockingWrite,
    const size_t *origin,
    const size_t *region,
    size_t inputRowPitch,
    size_t inputSlicePitch,
    const void *ptr,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueCopyImage)(
    cl_command_queue commandQueue,
    cl_mem srcImage,
    cl_mem dstImage,
    const size_t *srcOrigin,
    const size_t *dstOrigin,
    const size_t *region,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueCopyImageToBuffer)(
    cl_command_queue commandQueue,
    cl_mem srcImage,
    cl_mem dstBuffer,
    const size_t *srcOrigin,
    const size_t *region,
    size_t dstOffset,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueCopyBufferToImage)(
    cl_command_queue commandQueue,
    cl_mem srcBuffer,
    cl_mem dstImage,
    size_t srcOffset,
    const size_t *dstOrigin,
    const size_t *region,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY void *(CL_API_CALL *KHRpfn_clEnqueueMapBuffer)(
    cl_command_queue commandQueue,
    cl_mem buffer,
    cl_bool blockingMap,
    cl_map_flags mapFlags,
    size_t offset,
    size_t cb,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event,
    cl_int *errcodeRet)CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY void *(CL_API_CALL *KHRpfn_clEnqueueMapImage)(
    cl_command_queue commandQueue,
    cl_mem image,
    cl_bool blockingMap,
    cl_map_flags mapFlags,
    const size_t *origin,
    const size_t *region,
    size_t *imageRowPitch,
    size_t *imageSlicePitch,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event,
    cl_int *errcodeRet)CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueUnmapMemObject)(
    cl_command_queue commandQueue,
    cl_mem memobj,
    void *mappedPtr,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueNDRangeKernel)(
    cl_command_queue commandQueue,
    cl_kernel kernel,
    cl_uint workDim,
    const size_t *globalWorkOffset,
    const size_t *globalWorkSize,
    const size_t *localWorkSize,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueTask)(
    cl_command_queue commandQueue,
    cl_kernel kernel,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueNativeKernel)(
    cl_command_queue commandQueue,
    void(CL_CALLBACK *userFunc)(void *),
    void *args,
    size_t cbArgs,
    cl_uint numMemObjects,
    const cl_mem *memList,
    const void **argsMemLoc,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_int(CL_API_CALL *KHRpfn_clEnqueueMarker)(
    cl_command_queue commandQueue,
    cl_event *event) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_int(CL_API_CALL *KHRpfn_clEnqueueWaitForEvents)(
    cl_command_queue commandQueue,
    cl_uint numEvents,
    const cl_event *eventList) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_int(CL_API_CALL *KHRpfn_clEnqueueBarrier)(
    cl_command_queue commandQueue) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED void *(CL_API_CALL *KHRpfn_clGetExtensionFunctionAddress)(
    const char *functionName)CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

typedef CL_API_ENTRY cl_mem(CL_API_CALL *KHRpfn_clCreateFromGLBuffer)(
    cl_context context,
    cl_mem_flags flags,
    cl_GLuint bufobj,
    cl_int *errcodeRet) 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 textureTarget,
    cl_GLint miplevel,
    cl_GLuint texture,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem(CL_API_CALL *KHRpfn_clCreateFromGLTexture2D)(
    cl_context context,
    cl_mem_flags flags,
    cl_GLenum textureTarget,
    cl_GLint miplevel,
    cl_GLuint texture,
    cl_int *errcodeRet) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

typedef CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem(CL_API_CALL *KHRpfn_clCreateFromGLTexture3D)(
    cl_context context,
    cl_mem_flags flags,
    cl_GLenum textureTarget,
    cl_GLint miplevel,
    cl_GLuint texture,
    cl_int *errcodeRet) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;

typedef CL_API_ENTRY cl_mem(CL_API_CALL *KHRpfn_clCreateFromGLRenderbuffer)(
    cl_context context,
    cl_mem_flags flags,
    cl_GLuint renderbuffer,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetGLObjectInfo)(
    cl_mem memobj,
    cl_gl_object_type *glObjectType,
    cl_GLuint *glObjectName) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetGLTextureInfo)(
    cl_mem memobj,
    cl_gl_texture_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueAcquireGLObjects)(
    cl_command_queue commandQueue,
    cl_uint numObjects,
    const cl_mem *memObjects,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueReleaseGLObjects)(
    cl_command_queue commandQueue,
    cl_uint numObjects,
    const cl_mem *memObjects,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    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 paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_0;

#ifndef _WIN32
typedef void *clGetDeviceIDsFromDX9INTEL_fn;
typedef void *clCreateFromDX9MediaSurfaceINTEL_fn;
typedef void *clEnqueueAcquireDX9ObjectsINTEL_fn;
typedef void *clEnqueueReleaseDX9ObjectsINTEL_fn;
typedef void *clGetDeviceIDsFromDX9MediaAdapterKHR_fn;
typedef void *clCreateFromDX9MediaSurfaceKHR_fn;
typedef void *clEnqueueAcquireDX9MediaSurfacesKHR_fn;
typedef void *clEnqueueReleaseDX9MediaSurfacesKHR_fn;
typedef void *clGetDeviceIDsFromD3D10KHR_fn;
typedef void *clCreateFromD3D10BufferKHR_fn;
typedef void *clCreateFromD3D10Texture2DKHR_fn;
typedef void *clCreateFromD3D10Texture3DKHR_fn;
typedef void *clEnqueueAcquireD3D10ObjectsKHR_fn;
typedef void *clEnqueueReleaseD3D10ObjectsKHR_fn;
typedef void *clGetDeviceIDsFromD3D11KHR_fn;
typedef void *clCreateFromD3D11BufferKHR_fn;
typedef void *clCreateFromD3D11Texture2DKHR_fn;
typedef void *clCreateFromD3D11Texture3DKHR_fn;
typedef void *clEnqueueAcquireD3D11ObjectsKHR_fn;
typedef void *clEnqueueReleaseD3D11ObjectsKHR_fn;
#endif

/* OpenCL 1.1 */

/* cl_kgr_gl_event */
typedef CL_API_ENTRY cl_event(CL_API_CALL *KHRpfn_clCreateEventFromGLsyncKHR)(
    cl_context context,
    cl_GLsync sync,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clSetEventCallback)(
    cl_event event,
    cl_int commandExecCallbackType,
    evnt_logging_fn pfnNotify,
    void *userData) 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 bufferCreateType,
    const void *bufferCreateInfo,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_1;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clSetMemObjectDestructorCallback)(
    cl_mem memobj,
    memobj_logging_fn pfnNotify,
    void *userData) CL_API_SUFFIX__VERSION_1_1;

typedef CL_API_ENTRY cl_event(CL_API_CALL *KHRpfn_clCreateUserEvent)(
    cl_context context,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_1;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clSetUserEventStatus)(
    cl_event event,
    cl_int executionStatus) CL_API_SUFFIX__VERSION_1_1;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueReadBufferRect)(
    cl_command_queue commandQueue,
    cl_mem buffer,
    cl_bool blockingRead,
    const size_t *bufferOffset,
    const size_t *hostOffset,
    const size_t *region,
    size_t bufferRowPitch,
    size_t bufferSlicePitch,
    size_t hostRowPitch,
    size_t hostSlicePitch,
    void *ptr,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_1;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueWriteBufferRect)(
    cl_command_queue commandQueue,
    cl_mem buffer,
    cl_bool blockingRead,
    const size_t *bufferOffset,
    const size_t *hostOffset,
    const size_t *region,
    size_t bufferRowPitch,
    size_t bufferSlicePitch,
    size_t hostRowPitch,
    size_t hostSlicePitch,
    const void *ptr,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_1;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueCopyBufferRect)(
    cl_command_queue commandQueue,
    cl_mem srcBuffer,
    cl_mem dstBuffer,
    const size_t *srcOrigin,
    const size_t *dstOrigin,
    const size_t *region,
    size_t srcRowPitch,
    size_t srcSlicePitch,
    size_t dstRowPitch,
    size_t dstSlicePitch,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_1;

/*OpenCL 1.2*/

typedef CL_API_ENTRY cl_mem(CL_API_CALL *KHRpfn_clCreateImage)(
    cl_context context,
    cl_mem_flags flags,
    const cl_image_format *imageFormat,
    const cl_image_desc *imageDesc,
    void *hostPtr,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetKernelArgInfo)(
    cl_kernel kernel,
    cl_uint argIndx,
    cl_kernel_arg_info paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueFillBuffer)(
    cl_command_queue commandQueue,
    cl_mem buffer,
    const void *pattern,
    size_t patternSize,
    size_t offset,
    size_t cb,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueFillImage)(
    cl_command_queue commandQueue,
    cl_mem image,
    const void *fillColor,
    const size_t *origin,
    const size_t *region,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueMigrateMemObjects)(
    cl_command_queue commandQueue,
    cl_uint numMemObjects,
    const cl_mem *memObjects,
    cl_mem_migration_flags flags,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueMarkerWithWaitList)(
    cl_command_queue commandQueue,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueBarrierWithWaitList)(
    cl_command_queue commandQueue,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clCreateSubDevices)(
    cl_device_id inDevice,
    const cl_device_partition_property *properties,
    cl_uint numEntries,
    cl_device_id *outDevices,
    cl_uint *numDevices) CL_API_SUFFIX__VERSION_1_2;

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;

typedef CL_API_ENTRY cl_program(CL_API_CALL *KHRpfn_clCreateProgramWithBuiltInKernels)(
    cl_context context,
    cl_uint numDevices,
    const cl_device_id *deviceList,
    const char *kernelNames,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clCompileProgram)(
    cl_program program,
    cl_uint numDevices,
    const cl_device_id *deviceList,
    const char *options,
    cl_uint numInputHeaders,
    const cl_program *inputHeaders,
    const char **headerIncludeNames,
    void(CL_CALLBACK *pfnNotify)(cl_program program, void *userData),
    void *userData) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_program(CL_API_CALL *KHRpfn_clLinkProgram)(
    cl_context context,
    cl_uint numDevices,
    const cl_device_id *deviceList,
    const char *options,
    cl_uint numInputPrograms,
    const cl_program *inputPrograms,
    void(CL_CALLBACK *pfnNotify)(cl_program program, void *userData),
    void *userData,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_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 void *(CL_API_CALL *KHRpfn_clGetExtensionFunctionAddressForPlatform)(
    cl_platform_id platform,
    const char *funcName)CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clCreateSubDevicesEXT)(
    cl_device_id inDevice,
    const cl_device_partition_property_ext *partitionProperties,
    cl_uint numEntries,
    cl_device_id *outDevices,
    cl_uint *numDevices);

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 void *KHRpfn_clCreateFromEGLImageKHR;
typedef void *KHRpfn_clEnqueueAcquireEGLObjectsKHR;
typedef void *KHRpfn_clEnqueueReleaseEGLObjectsKHR;

/*cl_khr_egl_event*/
typedef void *KHRpfn_clCreateEventFromEGLSyncKHR;

/*OpenCL2.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 *errcodeRet) 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,
    cl_uint alignment)CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY void(CL_API_CALL *KHRpfn_clSVMFree)(
    cl_context context,
    void *svmPointer) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueSVMFree)(
    cl_command_queue commandQueue,
    cl_uint numSvmPointers,
    void *svmPointers[],
    void(CL_CALLBACK *pfnFreeFunc)(cl_command_queue queue,
                                   cl_uint numSvmPointers,
                                   void *svmPointers[],
                                   void *userData),
    void *userData,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueSVMMemcpy)(
    cl_command_queue commandQueue,
    cl_bool blockingCopy,
    void *dstPtr,
    const void *srcPtr,
    size_t size,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueSVMMemFill)(
    cl_command_queue commandQueue,
    void *svmPtr,
    const void *pattern,
    size_t patternSize,
    size_t size,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_2_0;
typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueSVMMap)(
    cl_command_queue commandQueue,
    cl_bool blockingMap,
    cl_map_flags mapFlags,
    void *svmPtr,
    size_t size,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueSVMUnmap)(
    cl_command_queue commandQueue,
    void *svmPtr,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clSetKernelArgSVMPointer)(
    cl_kernel kernel,
    cl_uint argIndex,
    const void *argValue) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clSetKernelExecInfo)(
    cl_kernel kernel,
    cl_kernel_exec_info paramName,
    size_t paramValueSize,
    const void *paramValue) CL_API_SUFFIX__VERSION_2_0;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetKernelSubGroupInfoKHR)(
    cl_kernel kernel,
    cl_device_id device,
    cl_kernel_sub_group_info paramName,
    size_t inputValueSize,
    const void *inputValue,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_2_0;

/*OpenCL2.1*/
typedef CL_API_ENTRY cl_kernel(CL_API_CALL *KHRpfn_clCloneKernel)(
    cl_kernel sourceKernel,
    cl_int *errcodeRet) 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 *errcodeRet) CL_API_SUFFIX__VERSION_2_1;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clEnqueueSVMMigrateMem)(
    cl_command_queue commandQueue,
    cl_uint numSvmPointers,
    const void **svmPointers,
    const size_t *sizes,
    const cl_mem_migration_flags flags,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    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 *deviceTimestamp,
    cl_ulong *hostTimestamp) CL_API_SUFFIX__VERSION_2_1;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clGetHostTimer)(
    cl_device_id device,
    cl_ulong *hostTimestamp) 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 paramName,
    size_t inputValueSize,
    const void *inputValue,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_2_1;

typedef CL_API_ENTRY cl_int(CL_API_CALL *KHRpfn_clSetDefaultDeviceCommandQueue)(
    cl_context context,
    cl_device_id device,
    cl_command_queue commandQueue) CL_API_SUFFIX__VERSION_2_1;

/* clCreateImage */

typedef CL_API_ENTRY cl_int(CL_API_CALL *INTELpfn_clGetImageParamsINTEL)(
    cl_context context,
    const cl_image_format *imageFormat,
    const cl_image_desc *imageDesc,
    size_t *imageRowPitch,
    size_t *imageSlicePitch) CL_API_SUFFIX__VERSION_1_1;

/* Performance Counter APIs */
typedef CL_API_ENTRY cl_command_queue(CL_API_CALL *INTELpfn_clCreatePerfCountersCommandQueueINTEL)(
    cl_context context,
    cl_device_id device,
    cl_command_queue_properties properties,
    cl_uint configuration,
    cl_int *errcodeRet);

typedef CL_API_ENTRY cl_int(CL_API_CALL *INTELpfn_clSetPerformanceConfigurationINTEL)(
    cl_device_id device,
    cl_uint count,
    cl_uint *offsets,
    cl_uint *values);

/* cl_intel_accelerator */

typedef CL_API_ENTRY cl_accelerator_intel(CL_API_CALL *INTELpfn_clCreateAcceleratorINTEL)(
    cl_context context,
    cl_accelerator_type_intel acceleratorType,
    size_t descriptorSize,
    const void *descriptor,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *INTELpfn_clGetAcceleratorInfoINTEL)(
    cl_accelerator_intel accelerator,
    cl_accelerator_info_intel paramName,
    size_t paramValueSize,
    void *paramValue,
    size_t *paramValueSizeRet) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *INTELpfn_clRetainAcceleratorINTEL)(
    cl_accelerator_intel accelerator) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *INTELpfn_clReleaseAcceleratorINTEL)(
    cl_accelerator_intel accelerator) CL_API_SUFFIX__VERSION_1_2;

/* cl_intel_va_api_media_sharing */
#ifdef LIBVA
#include "CL/cl_va_api_media_sharing_intel.h"
typedef CL_API_ENTRY cl_mem(CL_API_CALL *INTELpfn_clCreateFromVA_APIMediaSurfaceINTEL)(
    cl_context context,
    cl_mem_flags flags,
    VASurfaceID *surface,
    cl_uint plane,
    cl_int *errcodeRet) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *INTELpfn_clGetDeviceIDsFromVA_APIMediaAdapterINTEL)(
    cl_platform_id platform,
    cl_va_api_device_source_intel mediaAdapterType,
    void *mediaAdapter,
    cl_va_api_device_set_intel mediaAdapterSet,
    cl_uint numEntries,
    cl_device_id *devices,
    cl_uint *numDevices) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *INTELpfn_clEnqueueAcquireVA_APIMediaSurfacesINTEL)(
    cl_command_queue commandQueue,
    cl_uint numObjects,
    const cl_mem *memObjects,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_2;

typedef CL_API_ENTRY cl_int(CL_API_CALL *INTELpfn_clEnqueueReleaseVA_APIMediaSurfacesINTEL)(
    cl_command_queue commandQueue,
    cl_uint numObjects,
    const cl_mem *memObjects,
    cl_uint numEventsInWaitList,
    const cl_event *eventWaitList,
    cl_event *event) CL_API_SUFFIX__VERSION_1_2;
#else
typedef void (*INTELpfn_clCreateFromVA_APIMediaSurfaceINTEL)();
typedef void (*INTELpfn_clGetDeviceIDsFromVA_APIMediaAdapterINTEL)();
typedef void (*INTELpfn_clEnqueueAcquireVA_APIMediaSurfacesINTEL)();
typedef void (*INTELpfn_clEnqueueReleaseVA_APIMediaSurfacesINTEL)();
#endif

/*
*
* vendor dispatch table structure
*
* note that the types in the structure KHRicdVendorDispatch mirror the function
* names listed in the string table khrIcdVendorDispatchFunctionNames
*
*/

struct SDispatchTable {
    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 */
    clGetDeviceIDsFromD3D10KHR_fn clGetDeviceIDsFromD3D10KHR;
    clCreateFromD3D10BufferKHR_fn clCreateFromD3D10BufferKHR;
    clCreateFromD3D10Texture2DKHR_fn clCreateFromD3D10Texture2DKHR;
    clCreateFromD3D10Texture3DKHR_fn clCreateFromD3D10Texture3DKHR;
    clEnqueueAcquireD3D10ObjectsKHR_fn clEnqueueAcquireD3D10ObjectsKHR;
    clEnqueueReleaseD3D10ObjectsKHR_fn 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 */
    clGetDeviceIDsFromD3D11KHR_fn clGetDeviceIDsFromD3D11KHR;
    clCreateFromD3D11BufferKHR_fn clCreateFromD3D11BufferKHR;
    clCreateFromD3D11Texture2DKHR_fn clCreateFromD3D11Texture2DKHR;
    clCreateFromD3D11Texture3DKHR_fn clCreateFromD3D11Texture3DKHR;
    clCreateFromDX9MediaSurfaceKHR_fn clCreateFromDX9MediaSurfaceKHR;
    clEnqueueAcquireD3D11ObjectsKHR_fn clEnqueueAcquireD3D11ObjectsKHR;
    clEnqueueReleaseD3D11ObjectsKHR_fn clEnqueueReleaseD3D11ObjectsKHR;

    /* cl_khr_dx9_media_sharing */
    clGetDeviceIDsFromDX9MediaAdapterKHR_fn clGetDeviceIDsFromDX9MediaAdapterKHR;
    clEnqueueAcquireDX9MediaSurfacesKHR_fn clEnqueueAcquireDX9MediaSurfacesKHR;
    clEnqueueReleaseDX9MediaSurfacesKHR_fn 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;

    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;
};

struct SCRTDispatchTable {
    // Support CRT entry point
    KHRpfn_clGetKernelArgInfo clGetKernelArgInfo;

    clGetDeviceIDsFromDX9INTEL_fn clGetDeviceIDsFromDX9INTEL;
    clCreateFromDX9MediaSurfaceINTEL_fn clCreateFromDX9MediaSurfaceINTEL;
    clEnqueueAcquireDX9ObjectsINTEL_fn clEnqueueAcquireDX9ObjectsINTEL;
    clEnqueueReleaseDX9ObjectsINTEL_fn clEnqueueReleaseDX9ObjectsINTEL;

    INTELpfn_clGetImageParamsINTEL clGetImageParamsINTEL;
    // API to expose the Performance Counters to applications
    INTELpfn_clCreatePerfCountersCommandQueueINTEL clCreatePerfCountersCommandQueueINTEL;

    // Video Analytics Accelerator
    INTELpfn_clCreateAcceleratorINTEL clCreateAcceleratorINTEL;
    INTELpfn_clGetAcceleratorInfoINTEL clGetAcceleratorInfoINTEL;
    INTELpfn_clRetainAcceleratorINTEL clRetainAcceleratorINTEL;
    INTELpfn_clReleaseAcceleratorINTEL clReleaseAcceleratorINTEL;

    void *placeholder12;
    void *placeholder13;

// VAMedia sharing extension
#ifdef LIBVA
    INTELpfn_clCreateFromVA_APIMediaSurfaceINTEL clCreateFromVA_APIMediaSurfaceINTEL;
    INTELpfn_clGetDeviceIDsFromVA_APIMediaAdapterINTEL clGetDeviceIDsFromVA_APIMediaAdapterINTEL;
    INTELpfn_clEnqueueReleaseVA_APIMediaSurfacesINTEL clEnqueueReleaseVA_APIMediaSurfacesINTEL;
    INTELpfn_clEnqueueAcquireVA_APIMediaSurfacesINTEL clEnqueueAcquireVA_APIMediaSurfacesINTEL;
#else
    void *placeholder14;
    void *placeholder15;
    void *placeholder16;
    void *placeholder17;
#endif

    void *placeholder18;
    void *placeholder19;
    void *placeholder20;
    void *placeholder21;
    // OCL Performance Counters configuration
    INTELpfn_clSetPerformanceConfigurationINTEL clSetPerformanceConfigurationINTEL;
};

extern SDispatchTable icdGlobalDispatchTable;
extern SCRTDispatchTable crtGlobalDispatchTable;

struct SEntryPointsTable {
    SDispatchTable *icdDispatch;
    SCRTDispatchTable *crtDispatch;
};

struct SEntryPointsTableData {
    SDispatchTable icdDispatch;
    SCRTDispatchTable crtDispatch;
};

extern SEntryPointsTable globalDispatchTable;
