// // 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. // // CLContext.h: Defines the cl::Context class, which manages OpenCL objects such as command-queues, // memory, program and kernel objects and for executing kernels on one or more devices. #ifndef LIBANGLE_CLCONTEXT_H_ #define LIBANGLE_CLCONTEXT_H_ #include "libANGLE/CLDevice.h" #include "libANGLE/CLPlatform.h" #include "libANGLE/renderer/CLContextImpl.h" namespace cl { class Context final : public _cl_context, public Object { public: // Front end entry functions, only called from OpenCL entry points static bool IsValidAndVersionOrNewer(const _cl_context *context, cl_uint major, cl_uint minor); cl_int getInfo(ContextInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const; cl_command_queue createCommandQueueWithProperties(cl_device_id device, const cl_queue_properties *properties, cl_int &errorCode); cl_command_queue createCommandQueue(cl_device_id device, CommandQueueProperties properties, cl_int &errorCode); cl_mem createBuffer(const cl_mem_properties *properties, MemFlags flags, size_t size, void *hostPtr, cl_int &errorCode); cl_mem createImage(const cl_mem_properties *properties, MemFlags flags, const cl_image_format *format, const cl_image_desc *desc, void *hostPtr, cl_int &errorCode); cl_mem createImage2D(MemFlags flags, const cl_image_format *format, size_t width, size_t height, size_t rowPitch, void *hostPtr, cl_int &errorCode); cl_mem createImage3D(MemFlags flags, const cl_image_format *format, size_t width, size_t height, size_t depth, size_t rowPitch, size_t slicePitch, void *hostPtr, cl_int &errorCode); cl_int getSupportedImageFormats(MemFlags flags, MemObjectType imageType, cl_uint numEntries, cl_image_format *imageFormats, cl_uint *numImageFormats); cl_sampler createSamplerWithProperties(const cl_sampler_properties *properties, cl_int &errorCode); cl_sampler createSampler(cl_bool normalizedCoords, AddressingMode addressingMode, FilterMode filterMode, cl_int &errorCode); cl_program createProgramWithSource(cl_uint count, const char **strings, const size_t *lengths, cl_int &errorCode); cl_program createProgramWithIL(const void *il, size_t length, cl_int &errorCode); cl_program createProgramWithBinary(cl_uint numDevices, const cl_device_id *devices, const size_t *lengths, const unsigned char **binaries, cl_int *binaryStatus, cl_int &errorCode); cl_program createProgramWithBuiltInKernels(cl_uint numDevices, const cl_device_id *devices, const char *kernelNames, cl_int &errorCode); cl_program linkProgram(cl_uint numDevices, const cl_device_id *deviceList, const char *options, cl_uint numInputPrograms, const cl_program *inputPrograms, ProgramCB pfnNotify, void *userData, cl_int &errorCode); cl_event createUserEvent(cl_int &errorCode); cl_int waitForEvents(cl_uint numEvents, const cl_event *eventList); public: using PropArray = std::vector; ~Context() override; const Platform &getPlatform() const noexcept; const DevicePtrs &getDevices() const; bool hasDevice(const _cl_device_id *device) const; template T &getImpl() const; bool supportsImages() const; bool supportsIL() const; bool supportsBuiltInKernel(const std::string &name) const; static void CL_CALLBACK ErrorCallback(const char *errinfo, const void *privateInfo, size_t cb, void *userData); private: Context(Platform &platform, PropArray &&properties, DevicePtrs &&devices, ContextErrorCB notify, void *userData, bool userSync, cl_int &errorCode); Context(Platform &platform, PropArray &&properties, DeviceType deviceType, ContextErrorCB notify, void *userData, bool userSync, cl_int &errorCode); Platform &mPlatform; const PropArray mProperties; const ContextErrorCB mNotify; void *const mUserData; const rx::CLContextImpl::Ptr mImpl; const DevicePtrs mDevices; friend class Object; }; inline bool Context::IsValidAndVersionOrNewer(const _cl_context *context, cl_uint major, cl_uint minor) { return IsValid(context) && context->cast().getPlatform().isVersionOrNewer(major, minor); } inline const Platform &Context::getPlatform() const noexcept { return mPlatform; } inline const DevicePtrs &Context::getDevices() const { return mDevices; } inline bool Context::hasDevice(const _cl_device_id *device) const { return std::find(mDevices.cbegin(), mDevices.cend(), device) != mDevices.cend(); } template inline T &Context::getImpl() const { return static_cast(*mImpl); } inline bool Context::supportsImages() const { return (std::find_if(mDevices.cbegin(), mDevices.cend(), [](const DevicePtr &ptr) { return ptr->getInfo().imageSupport == CL_TRUE; }) != mDevices.cend()); } inline bool Context::supportsIL() const { return (std::find_if(mDevices.cbegin(), mDevices.cend(), [](const DevicePtr &ptr) { return !ptr->getInfo().IL_Version.empty(); }) != mDevices.cend()); } inline bool Context::supportsBuiltInKernel(const std::string &name) const { return (std::find_if(mDevices.cbegin(), mDevices.cend(), [&](const DevicePtr &ptr) { return ptr->supportsBuiltInKernel(name); }) != mDevices.cend()); } } // namespace cl #endif // LIBANGLE_CLCONTEXT_H_