cl_int clGetContextInfo(cl_context context, cl_context_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) { #ifdef DBG_API std::cerr << "clGetContextInfo\n"; #endif if (!context->isA(Coal::Object::T_Context)) return CL_INVALID_CONTEXT; return context->info(param_name, param_value_size, param_value, param_value_size_ret); }
cl_program 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) { #ifdef DBG_API std::cerr << "clCreateProgramWithBinary\n"; #endif cl_int dummy_errcode; if (!errcode_ret) errcode_ret = &dummy_errcode; if (!context->isA(Coal::Object::T_Context)) { *errcode_ret = CL_INVALID_CONTEXT; return 0; } if (!num_devices || !device_list || !lengths || !binaries) { *errcode_ret = CL_INVALID_VALUE; return 0; } // Check the devices for compliance cl_uint context_num_devices = 0; cl_device_id *context_devices; *errcode_ret = context->info(CL_CONTEXT_NUM_DEVICES, sizeof(cl_uint), &context_num_devices, 0); if (*errcode_ret != CL_SUCCESS) return 0; context_devices = (cl_device_id *)std::malloc(context_num_devices * sizeof(cl_device_id)); *errcode_ret = context->info(CL_CONTEXT_DEVICES, context_num_devices * sizeof(cl_device_id), context_devices, 0); if (*errcode_ret != CL_SUCCESS) return 0; for (cl_uint i=0; i<num_devices; ++i) { bool found = false; if (!lengths[i] || !binaries[i]) { if (binary_status) binary_status[i] = CL_INVALID_VALUE; *errcode_ret = CL_INVALID_VALUE; return 0; } for (cl_uint j=0; j<context_num_devices; ++j) { if (device_list[i] == context_devices[j]) { found = true; break; } } if (!found) { *errcode_ret = CL_INVALID_DEVICE; return 0; } } // Create a program Coal::Program *program = new Coal::Program(context); *errcode_ret = CL_SUCCESS; // Init program *errcode_ret = program->loadBinaries(binaries, lengths, binary_status, num_devices, (Coal::DeviceInterface * const*)device_list); if (*errcode_ret != CL_SUCCESS) { delete program; return 0; } return (cl_program)program; }