/* StarPU --- Runtime system for heterogeneous multicore architectures.
 *
 * Copyright (C) 2010-2012 University of Bordeaux
 * Copyright (C) 2012 CNRS
 * Copyright (C) 2012 Vincent Danjean <Vincent.Danjean@ens-lyon.org>
 *
 * StarPU is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or (at
 * your option) any later version.
 *
 * StarPU is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * See the GNU Lesser General Public License in COPYING.LGPL for more details.
 */

#include "socl.h"

struct _cl_icd_dispatch socl_master_dispatch = {
  soclGetPlatformIDs,
  soclGetPlatformInfo,
  soclGetDeviceIDs,
  soclGetDeviceInfo,
  soclCreateContext,
  soclCreateContextFromType,
  soclRetainContext,
  soclReleaseContext,
  soclGetContextInfo,
  soclCreateCommandQueue,
  soclRetainCommandQueue,
  soclReleaseCommandQueue,
  soclGetCommandQueueInfo,
  soclSetCommandQueueProperty,
  soclCreateBuffer,
  soclCreateImage2D,
  soclCreateImage3D,
  soclRetainMemObject,
  soclReleaseMemObject,
  soclGetSupportedImageFormats,
  soclGetMemObjectInfo,
  soclGetImageInfo,
  soclCreateSampler,
  soclRetainSampler,
  soclReleaseSampler,
  soclGetSamplerInfo,
  soclCreateProgramWithSource,
  soclCreateProgramWithBinary,
  soclRetainProgram,
  soclReleaseProgram,
  soclBuildProgram,
  soclUnloadCompiler,
  soclGetProgramInfo,
  soclGetProgramBuildInfo,
  soclCreateKernel,
  soclCreateKernelsInProgram,
  soclRetainKernel,
  soclReleaseKernel,
  soclSetKernelArg,
  soclGetKernelInfo,
  soclGetKernelWorkGroupInfo,
  soclWaitForEvents,
  soclGetEventInfo,
  soclRetainEvent,
  soclReleaseEvent,
  soclGetEventProfilingInfo,
  soclFlush,
  soclFinish,
  soclEnqueueReadBuffer,
  soclEnqueueWriteBuffer,
  soclEnqueueCopyBuffer,
  soclEnqueueReadImage,
  soclEnqueueWriteImage,
  soclEnqueueCopyImage,
  soclEnqueueCopyImageToBuffer,
  soclEnqueueCopyBufferToImage,
  soclEnqueueMapBuffer,
  soclEnqueueMapImage,
  soclEnqueueUnmapMemObject,
  soclEnqueueNDRangeKernel,
  soclEnqueueTask,
  soclEnqueueNativeKernel,
  soclEnqueueMarker,
  soclEnqueueWaitForEvents,
  soclEnqueueBarrier,
  soclGetExtensionFunctionAddress,
  (void *) NULL, //  clCreateFromGLBuffer,
  (void *) NULL, //  clCreateFromGLTexture2D,
  (void *) NULL, //  clCreateFromGLTexture3D,
  (void *) NULL, //  clCreateFromGLRenderbuffer,
  (void *) NULL, //  clGetGLObjectInfo,
  (void *) NULL, //  clGetGLTextureInfo,
  (void *) NULL, //  clEnqueueAcquireGLObjects,
  (void *) NULL, //  clEnqueueReleaseGLObjects,
  (void *) NULL, //  clGetGLContextInfoKHR,
  (void *) NULL, //
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL, //  clSetEventCallback,
  (void *) NULL, //  clCreateSubBuffer,
  (void *) NULL, //  clSetMemObjectDestructorCallback,
  (void *) NULL, //  clCreateUserEvent,
  (void *) NULL, //  clSetUserEventStatus,
  (void *) NULL, //  clEnqueueReadBufferRect,
  (void *) NULL, //  clEnqueueWriteBufferRect,
  (void *) NULL, //  clEnqueueCopyBufferRect,
  (void *) NULL, //  clCreateSubDevicesEXT,
  (void *) NULL, //  clRetainDeviceEXT,
  (void *) NULL, //  clReleaseDeviceEXT,
  (void *) NULL,
  (void *) NULL, //  clCreateSubDevices,
  (void *) NULL, //  clRetainDevice,
  (void *) NULL, //  clReleaseDevice,
  (void *) NULL, //  clCreateImage,
  (void *) NULL, //  clCreateProgramWithBuiltInKernels,
  (void *) NULL, //  clCompileProgram,
  (void *) NULL, //  clLinkProgram,
  (void *) NULL, //  clUnloadPlatformCompiler,
  (void *) NULL, //  clGetKernelArgInfo,
  (void *) NULL, //  clEnqueueFillBuffer,
  (void *) NULL, //  clEnqueueFillImage,
  (void *) NULL, //  clEnqueueMigrateMemObjects,
  soclEnqueueMarkerWithWaitList, //  clEnqueueMarkerWithWaitList,
  soclEnqueueBarrierWithWaitList, //  clEnqueueBarrierWithWaitList,
  soclGetExtensionFunctionAddressForPlatform, //  clGetExtensionFunctionAddressForPlatform,
  (void *) NULL, //  clCreateFromGLTexture,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL,
  (void *) NULL
};


struct _cl_platform_id socl_platform = {&socl_master_dispatch};

const char * __attribute__ ((aligned (16))) SOCL_PROFILE = "FULL_PROFILE";
const char * __attribute__ ((aligned (16))) SOCL_VERSION = "OpenCL 1.0 SOCL Edition (0.1.0)";
const char * __attribute__ ((aligned (16))) SOCL_PLATFORM_NAME    = "SOCL Platform";
const char * __attribute__ ((aligned (16))) SOCL_VENDOR  = "INRIA";
const char * __attribute__ ((aligned (16))) SOCL_PLATFORM_EXTENSIONS = "cl_khr_icd";
const char * __attribute__ ((aligned (16))) SOCL_PLATFORM_ICD_SUFFIX_KHR ="SOCL";


/* Command queues with profiling enabled
 * This allows us to disable StarPU profiling it
 * is equal to 0
 */
int __attribute__ ((aligned (16))) profiling_queue_count = 0;

struct _cl_device_id * socl_devices = NULL;
unsigned int socl_device_count = 0;
