// // 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. // // CLEvent.h: Defines the cl::Event class, which can be used to track the execution status of an // OpenCL command. #ifndef LIBANGLE_CLEVENT_H_ #define LIBANGLE_CLEVENT_H_ #include "libANGLE/CLObject.h" #include "libANGLE/renderer/CLEventImpl.h" #include "common/SynchronizedValue.h" #include namespace cl { class Event final : public _cl_event, public Object { public: // Front end entry functions, only called from OpenCL entry points cl_int setUserEventStatus(cl_int executionStatus); cl_int getInfo(EventInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const; cl_int setCallback(cl_int commandExecCallbackType, EventCB pfnNotify, void *userData); cl_int getProfilingInfo(ProfilingInfo name, size_t valueSize, void *value, size_t *valueSizeRet); public: ~Event() override; Context &getContext(); const Context &getContext() const; const CommandQueuePtr &getCommandQueue() const; cl_command_type getCommandType() const; bool wasStatusChanged() const; template T &getImpl() const; void callback(cl_int commandStatus); static EventPtrs Cast(cl_uint numEvents, const cl_event *eventList); private: using CallbackData = std::pair; using Callbacks = std::vector; Event(Context &context, cl_int &errorCode); Event(CommandQueue &queue, cl_command_type commandType, const rx::CLEventImpl::CreateFunc &createFunc, cl_int &errorCode); const ContextPtr mContext; const CommandQueuePtr mCommandQueue; const cl_command_type mCommandType; const rx::CLEventImpl::Ptr mImpl; bool mStatusWasChanged = false; // Create separate storage for each possible callback type. static_assert(CL_COMPLETE == 0 && CL_RUNNING == 1 && CL_SUBMITTED == 2, "OpenCL command execution status values are not as assumed"); angle::SynchronizedValue> mCallbacks; friend class Object; }; inline Context &Event::getContext() { return *mContext; } inline const Context &Event::getContext() const { return *mContext; } inline const CommandQueuePtr &Event::getCommandQueue() const { return mCommandQueue; } inline cl_command_type Event::getCommandType() const { return mCommandType; } inline bool Event::wasStatusChanged() const { return mStatusWasChanged; } template inline T &Event::getImpl() const { return static_cast(*mImpl); } } // namespace cl #endif // LIBANGLE_CLEVENT_H_