123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788 |
- #include "bullet/MiniCL/cl.h"
- #define __PHYSICS_COMMON_H__ 1
- #ifdef _WIN32
- #include "bullet/BulletMultiThreaded/Win32ThreadSupport.h"
- #endif
- #include "bullet/BulletMultiThreaded/PlatformDefinitions.h"
- #ifdef USE_PTHREADS
- #include "bullet/BulletMultiThreaded/PosixThreadSupport.h"
- #endif
- #include "bullet/BulletMultiThreaded/SequentialThreadSupport.h"
- #include "MiniCLTaskScheduler.h"
- #include "MiniCLTask/MiniCLTask.h"
- #include "bullet/LinearMath/btMinMax.h"
- #include <stdio.h>
- #include <stddef.h>
- static const char* spPlatformID = "MiniCL, SCEA";
- static const char* spDriverVersion= "1.0";
- 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
- {
- if(platforms != NULL)
- {
- if(num_entries <= 0)
- {
- return CL_INVALID_VALUE;
- }
- *((const char**)platforms) = spPlatformID;
- }
- if(num_platforms != NULL)
- {
- *num_platforms = 1;
- }
- 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
- {
- char* pId = (char*)platform;
- if(strcmp(pId, spPlatformID))
- {
- return CL_INVALID_PLATFORM;
- }
- switch(param_name)
- {
- case CL_PLATFORM_VERSION:
- {
- if(param_value_size < (strlen(spDriverVersion) + 1))
- {
- return CL_INVALID_VALUE;
- }
- strcpy((char*)param_value, spDriverVersion);
- if(param_value_size_ret != NULL)
- {
- *param_value_size_ret = strlen(spDriverVersion) + 1;
- }
- break;
- }
- case CL_PLATFORM_NAME:
- case CL_PLATFORM_VENDOR :
- if(param_value_size < (strlen(spPlatformID) + 1))
- {
- return CL_INVALID_VALUE;
- }
- strcpy((char*)param_value, spPlatformID);
- if(param_value_size_ret != NULL)
- {
- *param_value_size_ret = strlen(spPlatformID) + 1;
- }
- break;
- default :
- return CL_INVALID_VALUE;
- }
- return CL_SUCCESS;
- }
- 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
- {
- switch (param_name)
- {
- case CL_DEVICE_NAME:
- {
- char deviceName[] = "MiniCL CPU";
- unsigned int nameLen = (unsigned int)strlen(deviceName)+1;
- btAssert(param_value_size>strlen(deviceName));
- if (nameLen < param_value_size)
- {
- const char* cpuName = "MiniCL CPU";
- sprintf((char*)param_value,"%s",cpuName);
- } else
- {
- printf("error: param_value_size should be at least %d, but it is %zu\n",nameLen,param_value_size);
- return CL_INVALID_VALUE;
- }
- break;
- }
- case CL_DEVICE_TYPE:
- {
- if (param_value_size>=sizeof(cl_device_type))
- {
- cl_device_type* deviceType = (cl_device_type*)param_value;
- *deviceType = CL_DEVICE_TYPE_CPU;
- } else
- {
- printf("error: param_value_size should be at least %zu\n",sizeof(cl_device_type));
- return CL_INVALID_VALUE;
- }
- break;
- }
- case CL_DEVICE_MAX_COMPUTE_UNITS:
- {
- if (param_value_size>=sizeof(cl_uint))
- {
- cl_uint* numUnits = (cl_uint*)param_value;
- *numUnits= 4;
- } else
- {
- printf("error: param_value_size should be at least %zu\n",sizeof(cl_uint));
- return CL_INVALID_VALUE;
- }
- break;
- }
- case CL_DEVICE_MAX_WORK_ITEM_SIZES:
- {
- size_t workitem_size[3];
- if (param_value_size>=sizeof(workitem_size))
- {
- size_t* workItemSize = (size_t*)param_value;
- workItemSize[0] = 64;
- workItemSize[1] = 24;
- workItemSize[2] = 16;
- } else
- {
- printf("error: param_value_size should be at least %zu\n",sizeof(cl_uint));
- return CL_INVALID_VALUE;
- }
- break;
- }
- case CL_DEVICE_MAX_CLOCK_FREQUENCY:
- {
- cl_uint* clock_frequency = (cl_uint*)param_value;
- *clock_frequency = 3*1024;
- break;
- }
- case CL_DEVICE_VENDOR :
- {
- if(param_value_size < (strlen(spPlatformID) + 1))
- {
- return CL_INVALID_VALUE;
- }
- strcpy((char*)param_value, spPlatformID);
- if(param_value_size_ret != NULL)
- {
- *param_value_size_ret = strlen(spPlatformID) + 1;
- }
- break;
- }
- case CL_DRIVER_VERSION:
- {
- if(param_value_size < (strlen(spDriverVersion) + 1))
- {
- return CL_INVALID_VALUE;
- }
- strcpy((char*)param_value, spDriverVersion);
- if(param_value_size_ret != NULL)
- {
- *param_value_size_ret = strlen(spDriverVersion) + 1;
- }
- break;
- }
- case CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:
- {
- cl_uint* maxDimensions = (cl_uint*)param_value;
- *maxDimensions = 1;
- break;
- }
- case CL_DEVICE_MAX_WORK_GROUP_SIZE:
- {
- cl_uint* maxWorkGroupSize = (cl_uint*)param_value;
- *maxWorkGroupSize = 128;
- break;
- }
- case CL_DEVICE_ADDRESS_BITS:
- {
- cl_uint* addressBits = (cl_uint*)param_value;
- *addressBits= 32;
- break;
- }
- case CL_DEVICE_MAX_MEM_ALLOC_SIZE:
- {
- cl_ulong* maxMemAlloc = (cl_ulong*)param_value;
- *maxMemAlloc= 512*1024*1024;
- break;
- }
- case CL_DEVICE_GLOBAL_MEM_SIZE:
- {
- cl_ulong* maxMemAlloc = (cl_ulong*)param_value;
- *maxMemAlloc= 1024*1024*1024;
- break;
- }
- case CL_DEVICE_ERROR_CORRECTION_SUPPORT:
- {
- cl_bool* error_correction_support = (cl_bool*)param_value;
- *error_correction_support = CL_FALSE;
- break;
- }
- case CL_DEVICE_LOCAL_MEM_TYPE:
- {
- cl_device_local_mem_type* local_mem_type = (cl_device_local_mem_type*)param_value;
- *local_mem_type = CL_GLOBAL;
- break;
- }
- case CL_DEVICE_LOCAL_MEM_SIZE:
- {
- cl_ulong* localmem = (cl_ulong*) param_value;
- *localmem = 32*1024;
- break;
- }
- case CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:
- {
- cl_ulong* localmem = (cl_ulong*) param_value;
- *localmem = 64*1024;
- break;
- }
- case CL_DEVICE_QUEUE_PROPERTIES:
- {
- cl_command_queue_properties* queueProp = (cl_command_queue_properties*) param_value;
- memset(queueProp,0,param_value_size);
- break;
- }
- case CL_DEVICE_IMAGE_SUPPORT:
- {
- cl_bool* imageSupport = (cl_bool*) param_value;
- *imageSupport = CL_FALSE;
- break;
- }
- case CL_DEVICE_MAX_WRITE_IMAGE_ARGS:
- case CL_DEVICE_MAX_READ_IMAGE_ARGS:
- {
- cl_uint* imageArgs = (cl_uint*) param_value;
- *imageArgs = 0;
- break;
- }
- case CL_DEVICE_IMAGE3D_MAX_DEPTH:
- case CL_DEVICE_IMAGE3D_MAX_HEIGHT:
- case CL_DEVICE_IMAGE2D_MAX_HEIGHT:
- case CL_DEVICE_IMAGE3D_MAX_WIDTH:
- case CL_DEVICE_IMAGE2D_MAX_WIDTH:
- {
- size_t* maxSize = (size_t*) param_value;
- *maxSize = 0;
- break;
- }
- case CL_DEVICE_EXTENSIONS:
- {
- char* extensions = (char*) param_value;
- *extensions = 0;
- break;
- }
- case CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE:
- case CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT:
- case CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG:
- case CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT:
- case CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT:
- case CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR:
- {
- cl_uint* width = (cl_uint*) param_value;
- *width = 1;
- break;
- }
-
- default:
- {
- printf("error: unsupported param_name:%d\n",param_name);
- }
- }
- return 0;
- }
- CL_API_ENTRY cl_int CL_API_CALL clReleaseMemObject(cl_mem ) CL_API_SUFFIX__VERSION_1_0
- {
- return 0;
- }
- CL_API_ENTRY cl_int CL_API_CALL clReleaseCommandQueue(cl_command_queue ) CL_API_SUFFIX__VERSION_1_0
- {
- return 0;
- }
- CL_API_ENTRY cl_int CL_API_CALL clReleaseProgram(cl_program ) CL_API_SUFFIX__VERSION_1_0
- {
- return 0;
- }
- CL_API_ENTRY cl_int CL_API_CALL clReleaseKernel(cl_kernel ) CL_API_SUFFIX__VERSION_1_0
- {
- return 0;
- }
- CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadBuffer(cl_command_queue command_queue ,
- cl_mem buffer ,
- cl_bool ,
- size_t offset ,
- size_t cb ,
- void * ptr ,
- cl_uint ,
- const cl_event * ,
- cl_event * ) CL_API_SUFFIX__VERSION_1_0
- {
- MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue;
-
- scheduler->flush();
- memcpy(ptr,(char*)buffer + offset,cb);
- return 0;
- }
- CL_API_ENTRY cl_int clGetProgramBuildInfo(cl_program ,
- cl_device_id ,
- cl_program_build_info ,
- size_t ,
- void * ,
- size_t * ) CL_API_SUFFIX__VERSION_1_0
- {
- return 0;
- }
- CL_API_ENTRY cl_program
- clCreateProgramWithSource(cl_context context ,
- cl_uint ,
- const char ** ,
- const size_t * ,
- cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0
- {
- *errcode_ret = CL_SUCCESS;
- return (cl_program)context;
- }
- CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteBuffer(cl_command_queue command_queue ,
- cl_mem buffer ,
- cl_bool ,
- size_t offset,
- size_t cb ,
- const void * ptr ,
- cl_uint ,
- const cl_event * ,
- cl_event * ) CL_API_SUFFIX__VERSION_1_0
- {
- MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue;
-
- scheduler->flush();
- memcpy((char*)buffer + offset, ptr,cb);
- return 0;
- }
- CL_API_ENTRY cl_int CL_API_CALL clFlush(cl_command_queue command_queue)
- {
- MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue;
-
- scheduler->flush();
- return 0;
- }
- CL_API_ENTRY cl_int CL_API_CALL clEnqueueNDRangeKernel(cl_command_queue ,
- cl_kernel clKernel ,
- cl_uint work_dim ,
- const size_t * ,
- const size_t * global_work_size ,
- const size_t * ,
- cl_uint ,
- const cl_event * ,
- cl_event * ) CL_API_SUFFIX__VERSION_1_0
- {
-
- MiniCLKernel* kernel = (MiniCLKernel*) clKernel;
- for (unsigned int ii=0;ii<work_dim;ii++)
- {
- int maxTask = kernel->m_scheduler->getMaxNumOutstandingTasks();
- int numWorkItems = global_work_size[ii];
- int numWorkItemsPerTask = numWorkItems / maxTask;
- if (!numWorkItemsPerTask) numWorkItemsPerTask = 1;
- for (int t=0;t<numWorkItems;)
- {
-
- int endIndex = (t+numWorkItemsPerTask) < numWorkItems ? t+numWorkItemsPerTask : numWorkItems;
- kernel->m_scheduler->issueTask(t, endIndex, kernel);
- t = endIndex;
- }
- }
- return 0;
- }
- #define LOCAL_BUF_SIZE 32768
- static int sLocalMemBuf[LOCAL_BUF_SIZE * 4 + 16];
- static int* spLocalBufCurr = NULL;
- static int sLocalBufUsed = LOCAL_BUF_SIZE;
- static void* localBufMalloc(int size)
- {
- int size16 = (size + 15) >> 4;
- if((sLocalBufUsed + size16) > LOCAL_BUF_SIZE)
- {
- spLocalBufCurr = sLocalMemBuf;
- while((size_t)spLocalBufCurr & 0x0F) spLocalBufCurr++;
- sLocalBufUsed = 0;
- }
- void* ret = spLocalBufCurr;
- spLocalBufCurr += size16 * 4;
- sLocalBufUsed += size;
- return ret;
- }
- CL_API_ENTRY cl_int CL_API_CALL clSetKernelArg(cl_kernel clKernel ,
- cl_uint arg_index ,
- size_t arg_size ,
- const void * arg_value ) CL_API_SUFFIX__VERSION_1_0
- {
- MiniCLKernel* kernel = (MiniCLKernel* ) clKernel;
- btAssert(arg_size <= MINICL_MAX_ARGLENGTH);
- if (arg_index>MINI_CL_MAX_ARG)
- {
- printf("error: clSetKernelArg arg_index (%u) exceeds %u\n",arg_index,MINI_CL_MAX_ARG);
- } else
- {
- if (arg_size>MINICL_MAX_ARGLENGTH)
-
- {
- printf("error: clSetKernelArg argdata too large: %zu (maximum is %zu)\n",arg_size,MINICL_MAX_ARGLENGTH);
- }
- else
- {
- if(arg_value == NULL)
- {
- void* ptr = localBufMalloc(arg_size);
- kernel->m_argData[arg_index] = ptr;
- }
- else
- {
- memcpy(&(kernel->m_argData[arg_index]), arg_value, arg_size);
- }
- kernel->m_argSizes[arg_index] = arg_size;
- if(arg_index >= kernel->m_numArgs)
- {
- kernel->m_numArgs = arg_index + 1;
- kernel->updateLauncher();
- }
- }
- }
- return 0;
- }
- 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
- {
- MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) program;
- int nameLen = strlen(kernel_name);
- if(nameLen >= MINI_CL_MAX_KERNEL_NAME)
- {
- *errcode_ret = CL_INVALID_KERNEL_NAME;
- return NULL;
- }
- MiniCLKernel* kernel = new MiniCLKernel();
- strcpy(kernel->m_name, kernel_name);
- kernel->m_numArgs = 0;
-
-
-
-
-
-
-
-
- kernel->m_scheduler = scheduler;
- if(kernel->registerSelf() == NULL)
- {
- *errcode_ret = CL_INVALID_KERNEL_NAME;
- delete kernel;
- return NULL;
- }
- else
- {
- *errcode_ret = CL_SUCCESS;
- }
- return (cl_kernel)kernel;
- }
- CL_API_ENTRY cl_int CL_API_CALL clBuildProgram(cl_program ,
- cl_uint ,
- const cl_device_id * ,
- const char * ,
- void (*pfn_notify)(cl_program , void * ),
- void * ) CL_API_SUFFIX__VERSION_1_0
- {
- return CL_SUCCESS;
- }
- CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithBinary(cl_context context ,
- cl_uint ,
- const cl_device_id * ,
- const size_t * ,
- const unsigned char ** ,
- cl_int * ,
- cl_int * ) CL_API_SUFFIX__VERSION_1_0
- {
- return (cl_program)context;
- }
- CL_API_ENTRY cl_mem CL_API_CALL clCreateBuffer(cl_context ,
- cl_mem_flags flags ,
- size_t size,
- void * host_ptr ,
- cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0
- {
- cl_mem buf = (cl_mem)malloc(size);
- if ((flags&CL_MEM_COPY_HOST_PTR) && host_ptr)
- {
- memcpy(buf,host_ptr,size);
- }
- *errcode_ret = 0;
- return buf;
- }
- CL_API_ENTRY cl_command_queue CL_API_CALL clCreateCommandQueue(cl_context context ,
- cl_device_id ,
- cl_command_queue_properties ,
- cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0
- {
- *errcode_ret = 0;
- return (cl_command_queue) context;
- }
- extern CL_API_ENTRY cl_int CL_API_CALL clGetContextInfo(cl_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
- {
- switch (param_name)
- {
- case CL_CONTEXT_DEVICES:
- {
- if (!param_value_size)
- {
- *param_value_size_ret = 13;
- } else
- {
- const char* testName = "MiniCL_Test.";
- sprintf((char*)param_value,"%s",testName);
- }
- break;
- };
- default:
- {
- printf("unsupported\n");
- }
- }
-
- return 0;
- }
- CL_API_ENTRY cl_context CL_API_CALL clCreateContextFromType(const cl_context_properties * ,
- cl_device_type device_type ,
- void (*pfn_notify)(const char *, const void *, size_t, void *) ,
- void * ,
- cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0
- {
- int maxNumOutstandingTasks = 4;
- gMiniCLNumOutstandingTasks = maxNumOutstandingTasks;
- const int maxNumOfThreadSupports = 8;
- static int sUniqueThreadSupportIndex = 0;
- static const char* sUniqueThreadSupportName[maxNumOfThreadSupports] =
- {
- "MiniCL_0", "MiniCL_1", "MiniCL_2", "MiniCL_3", "MiniCL_4", "MiniCL_5", "MiniCL_6", "MiniCL_7"
- };
- btThreadSupportInterface* threadSupport = 0;
- if (device_type==CL_DEVICE_TYPE_DEBUG)
- {
- SequentialThreadSupport::SequentialThreadConstructionInfo stc("MiniCL",processMiniCLTask,createMiniCLLocalStoreMemory);
- threadSupport = new SequentialThreadSupport(stc);
- } else
- {
- #if _WIN32
- btAssert(sUniqueThreadSupportIndex < maxNumOfThreadSupports);
- const char* bla = "MiniCL";
- threadSupport = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo(
- sUniqueThreadSupportName[sUniqueThreadSupportIndex++],
- processMiniCLTask,
- createMiniCLLocalStoreMemory,
- maxNumOutstandingTasks));
- #else
- #ifdef USE_PTHREADS
- PosixThreadSupport::ThreadConstructionInfo constructionInfo("PosixThreads",
- processMiniCLTask,
- createMiniCLLocalStoreMemory,
- maxNumOutstandingTasks);
- threadSupport = new PosixThreadSupport(constructionInfo);
- #else
-
- SequentialThreadSupport::SequentialThreadConstructionInfo stc("MiniCL",processMiniCLTask,createMiniCLLocalStoreMemory);
- threadSupport = new SequentialThreadSupport(stc);
- #endif
- #endif
- }
-
-
- MiniCLTaskScheduler* scheduler = new MiniCLTaskScheduler(threadSupport,maxNumOutstandingTasks);
- *errcode_ret = 0;
- return (cl_context)scheduler;
- }
- CL_API_ENTRY cl_int CL_API_CALL
- clGetDeviceIDs(cl_platform_id ,
- cl_device_type ,
- cl_uint ,
- cl_device_id * ,
- cl_uint * ) CL_API_SUFFIX__VERSION_1_0
- {
- return 0;
- }
- CL_API_ENTRY cl_context CL_API_CALL
- clCreateContext(const cl_context_properties * properties ,
- cl_uint num_devices ,
- const cl_device_id * devices ,
- void (*pfn_notify)(const char *, const void *, size_t, void *),
- void * user_data ,
- cl_int * errcode_ret ) CL_API_SUFFIX__VERSION_1_0
- {
-
- return clCreateContextFromType(properties,CL_DEVICE_TYPE_ALL,pfn_notify,user_data,errcode_ret);
- }
- CL_API_ENTRY cl_int CL_API_CALL clReleaseContext(cl_context context ) CL_API_SUFFIX__VERSION_1_0
- {
- MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) context;
-
- btThreadSupportInterface* threadSupport = scheduler->getThreadSupportInterface();
- delete scheduler;
- delete threadSupport;
-
- return 0;
- }
- extern CL_API_ENTRY cl_int CL_API_CALL
- clFinish(cl_command_queue command_queue ) CL_API_SUFFIX__VERSION_1_0
- {
- MiniCLTaskScheduler* scheduler = (MiniCLTaskScheduler*) command_queue;
-
- scheduler->flush();
- return CL_SUCCESS;
- }
- extern CL_API_ENTRY cl_int CL_API_CALL
- clGetProgramInfo(cl_program ,
- cl_program_info ,
- size_t ,
- void * ,
- size_t * ) CL_API_SUFFIX__VERSION_1_0
- {
- return 0;
- }
- extern CL_API_ENTRY cl_int CL_API_CALL
- clGetKernelWorkGroupInfo(cl_kernel kernel ,
- cl_device_id ,
- cl_kernel_work_group_info wgi,
- size_t sz ,
- void * ptr ,
- size_t * ) CL_API_SUFFIX__VERSION_1_0
- {
- if((wgi == CL_KERNEL_WORK_GROUP_SIZE)
- &&(sz == sizeof(size_t))
- &&(ptr != NULL))
- {
- MiniCLKernel* miniCLKernel = (MiniCLKernel*)kernel;
- MiniCLTaskScheduler* scheduler = miniCLKernel->m_scheduler;
- *((size_t*)ptr) = scheduler->getMaxNumOutstandingTasks();
- return CL_SUCCESS;
- }
- else
- {
- return CL_INVALID_VALUE;
- }
- }
|