// // Copyright 2021 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // CLKernel.h: Defines the cl::Kernel class, which is a function declared in an OpenCL program. #ifndef LIBANGLE_CLKERNEL_H_ #define LIBANGLE_CLKERNEL_H_ #include "libANGLE/CLObject.h" #include "libANGLE/renderer/CLKernelImpl.h" namespace cl { class Kernel final : public _cl_kernel, public Object { public: // Front end entry functions, only called from OpenCL entry points cl_int setArg(cl_uint argIndex, size_t argSize, const void *argValue); cl_int getInfo(KernelInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const; cl_int getWorkGroupInfo(cl_device_id device, KernelWorkGroupInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const; cl_int getArgInfo(cl_uint argIndex, KernelArgInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const; public: ~Kernel() override; const Program &getProgram() const; const rx::CLKernelImpl::Info &getInfo() const; template T &getImpl() const; private: Kernel(Program &program, const char *name, cl_int &errorCode); Kernel(Program &program, const rx::CLKernelImpl::CreateFunc &createFunc, cl_int &errorCode); const ProgramPtr mProgram; const rx::CLKernelImpl::Ptr mImpl; const rx::CLKernelImpl::Info mInfo; friend class Object; friend class Program; }; inline const Program &Kernel::getProgram() const { return *mProgram; } inline const rx::CLKernelImpl::Info &Kernel::getInfo() const { return mInfo; } template inline T &Kernel::getImpl() const { return static_cast(*mImpl); } } // namespace cl #endif // LIBANGLE_CLKERNEL_H_