EnqueueNDRangeKernelBuilder::EnqueueNDRangeKernelBuilder( Context &Ctx, Device &Dev, cl_kernel Kern, unsigned WorkDimensions, const size_t *GlobalWorkSizes) : CommandBuilder(CommandBuilder::EnqueueNDRangeKernelBuilder, Ctx), Dev(Dev), WorkDimensions(0) { if(!Kern) NotifyError(CL_INVALID_KERNEL, "cannot enqueue an invalid kernel"); else this->Kern = llvm::cast<Kernel>(Kern); if(!this->Kern->IsBuiltFor(Dev)) NotifyError(CL_INVALID_PROGRAM_EXECUTABLE, "kernel not built for current device"); if(this->Kern->GetContext() != Ctx) NotifyError(CL_INVALID_CONTEXT, "cannot enqueue a kernel into a command queue with " "a different context"); if(!this->Kern->AreAllArgsSpecified()) NotifyError(CL_INVALID_KERNEL_ARGS, "not all kernel arguments have been specified"); if(WorkDimensions < 1 || WorkDimensions > Dev.GetMaxWorkItemDimensions()) NotifyError(CL_INVALID_WORK_DIMENSION, "given work dimensions is out of range"); else this->WorkDimensions = WorkDimensions; if(!GlobalWorkSizes) NotifyError(CL_INVALID_GLOBAL_WORK_SIZE, "invalid global work size given"); else for(unsigned I = 0; I < WorkDimensions; ++I) { if(GlobalWorkSizes[I] == 0 || GlobalWorkSizes[I] > Dev.GetSizeTypeMax()) { NotifyError(CL_INVALID_GLOBAL_WORK_SIZE, "out of range global work size given"); break; } this->GlobalWorkSizes.push_back(GlobalWorkSizes[I]); } }