xref: /aosp_15_r20/external/angle/src/libANGLE/CLEvent.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // CLEvent.cpp: Implements the cl::Event class.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLEvent.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLCommandQueue.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLContext.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include <cstring>
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace cl
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker 
setUserEventStatus(cl_int executionStatus)19*8975f5c5SAndroid Build Coastguard Worker angle::Result Event::setUserEventStatus(cl_int executionStatus)
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImpl->setUserEventStatus(executionStatus));
22*8975f5c5SAndroid Build Coastguard Worker     mStatusWasChanged = true;
23*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
24*8975f5c5SAndroid Build Coastguard Worker }
25*8975f5c5SAndroid Build Coastguard Worker 
getInfo(EventInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const26*8975f5c5SAndroid Build Coastguard Worker angle::Result Event::getInfo(EventInfo name,
27*8975f5c5SAndroid Build Coastguard Worker                              size_t valueSize,
28*8975f5c5SAndroid Build Coastguard Worker                              void *value,
29*8975f5c5SAndroid Build Coastguard Worker                              size_t *valueSizeRet) const
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker     cl_int execStatus     = 0;
32*8975f5c5SAndroid Build Coastguard Worker     cl_uint valUInt       = 0u;
33*8975f5c5SAndroid Build Coastguard Worker     void *valPointer      = nullptr;
34*8975f5c5SAndroid Build Coastguard Worker     const void *copyValue = nullptr;
35*8975f5c5SAndroid Build Coastguard Worker     size_t copySize       = 0u;
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     switch (name)
38*8975f5c5SAndroid Build Coastguard Worker     {
39*8975f5c5SAndroid Build Coastguard Worker         case EventInfo::CommandQueue:
40*8975f5c5SAndroid Build Coastguard Worker             valPointer = CommandQueue::CastNative(mCommandQueue.get());
41*8975f5c5SAndroid Build Coastguard Worker             copyValue  = &valPointer;
42*8975f5c5SAndroid Build Coastguard Worker             copySize   = sizeof(valPointer);
43*8975f5c5SAndroid Build Coastguard Worker             break;
44*8975f5c5SAndroid Build Coastguard Worker         case EventInfo::CommandType:
45*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mCommandType;
46*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mCommandType);
47*8975f5c5SAndroid Build Coastguard Worker             break;
48*8975f5c5SAndroid Build Coastguard Worker         case EventInfo::ReferenceCount:
49*8975f5c5SAndroid Build Coastguard Worker             valUInt   = getRefCount();
50*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
51*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
52*8975f5c5SAndroid Build Coastguard Worker             break;
53*8975f5c5SAndroid Build Coastguard Worker         case EventInfo::CommandExecutionStatus:
54*8975f5c5SAndroid Build Coastguard Worker         {
55*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(mImpl->getCommandExecutionStatus(execStatus));
56*8975f5c5SAndroid Build Coastguard Worker             copyValue = &execStatus;
57*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(execStatus);
58*8975f5c5SAndroid Build Coastguard Worker             break;
59*8975f5c5SAndroid Build Coastguard Worker         }
60*8975f5c5SAndroid Build Coastguard Worker         case EventInfo::Context:
61*8975f5c5SAndroid Build Coastguard Worker             valPointer = mContext->getNative();
62*8975f5c5SAndroid Build Coastguard Worker             copyValue  = &valPointer;
63*8975f5c5SAndroid Build Coastguard Worker             copySize   = sizeof(valPointer);
64*8975f5c5SAndroid Build Coastguard Worker             break;
65*8975f5c5SAndroid Build Coastguard Worker         default:
66*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
67*8975f5c5SAndroid Build Coastguard Worker     }
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker     if (value != nullptr)
70*8975f5c5SAndroid Build Coastguard Worker     {
71*8975f5c5SAndroid Build Coastguard Worker         // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
72*8975f5c5SAndroid Build Coastguard Worker         // as described in the Event Queries table and param_value is not NULL.
73*8975f5c5SAndroid Build Coastguard Worker         if (valueSize < copySize)
74*8975f5c5SAndroid Build Coastguard Worker         {
75*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
76*8975f5c5SAndroid Build Coastguard Worker         }
77*8975f5c5SAndroid Build Coastguard Worker         if (copyValue != nullptr)
78*8975f5c5SAndroid Build Coastguard Worker         {
79*8975f5c5SAndroid Build Coastguard Worker             std::memcpy(value, copyValue, copySize);
80*8975f5c5SAndroid Build Coastguard Worker         }
81*8975f5c5SAndroid Build Coastguard Worker     }
82*8975f5c5SAndroid Build Coastguard Worker     if (valueSizeRet != nullptr)
83*8975f5c5SAndroid Build Coastguard Worker     {
84*8975f5c5SAndroid Build Coastguard Worker         *valueSizeRet = copySize;
85*8975f5c5SAndroid Build Coastguard Worker     }
86*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
87*8975f5c5SAndroid Build Coastguard Worker }
88*8975f5c5SAndroid Build Coastguard Worker 
setCallback(cl_int commandExecCallbackType,EventCB pfnNotify,void * userData)89*8975f5c5SAndroid Build Coastguard Worker angle::Result Event::setCallback(cl_int commandExecCallbackType, EventCB pfnNotify, void *userData)
90*8975f5c5SAndroid Build Coastguard Worker {
91*8975f5c5SAndroid Build Coastguard Worker     auto callbacks = mCallbacks.synchronize();
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     // Spec mentions that the callback will be called when the execution status of the event is
94*8975f5c5SAndroid Build Coastguard Worker     // equal to past the status specified by commandExecCallbackType
95*8975f5c5SAndroid Build Coastguard Worker     cl_int currentStatus;
96*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImpl->getCommandExecutionStatus(currentStatus));
97*8975f5c5SAndroid Build Coastguard Worker     if (currentStatus <= commandExecCallbackType)
98*8975f5c5SAndroid Build Coastguard Worker     {
99*8975f5c5SAndroid Build Coastguard Worker         pfnNotify(this, commandExecCallbackType, userData);
100*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
101*8975f5c5SAndroid Build Coastguard Worker     }
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker     // Only when required register a single callback with the back end for each callback type.
104*8975f5c5SAndroid Build Coastguard Worker     if ((*callbacks)[commandExecCallbackType].empty())
105*8975f5c5SAndroid Build Coastguard Worker     {
106*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(mImpl->setCallback(*this, commandExecCallbackType));
107*8975f5c5SAndroid Build Coastguard Worker         // This event has to be retained until the callback is called.
108*8975f5c5SAndroid Build Coastguard Worker         retain();
109*8975f5c5SAndroid Build Coastguard Worker     }
110*8975f5c5SAndroid Build Coastguard Worker     (*callbacks)[commandExecCallbackType].emplace_back(pfnNotify, userData);
111*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker 
getProfilingInfo(ProfilingInfo name,size_t valueSize,void * value,size_t * valueSizeRet)114*8975f5c5SAndroid Build Coastguard Worker angle::Result Event::getProfilingInfo(ProfilingInfo name,
115*8975f5c5SAndroid Build Coastguard Worker                                       size_t valueSize,
116*8975f5c5SAndroid Build Coastguard Worker                                       void *value,
117*8975f5c5SAndroid Build Coastguard Worker                                       size_t *valueSizeRet)
118*8975f5c5SAndroid Build Coastguard Worker {
119*8975f5c5SAndroid Build Coastguard Worker     return mImpl->getProfilingInfo(name, valueSize, value, valueSizeRet);
120*8975f5c5SAndroid Build Coastguard Worker }
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker Event::~Event() = default;
123*8975f5c5SAndroid Build Coastguard Worker 
callback(cl_int commandStatus)124*8975f5c5SAndroid Build Coastguard Worker void Event::callback(cl_int commandStatus)
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker     ASSERT(commandStatus >= 0 && commandStatus < 3);
127*8975f5c5SAndroid Build Coastguard Worker     const Callbacks callbacks = std::move(mCallbacks->at(commandStatus));
128*8975f5c5SAndroid Build Coastguard Worker     for (const CallbackData &data : callbacks)
129*8975f5c5SAndroid Build Coastguard Worker     {
130*8975f5c5SAndroid Build Coastguard Worker         data.first(this, commandStatus, data.second);
131*8975f5c5SAndroid Build Coastguard Worker     }
132*8975f5c5SAndroid Build Coastguard Worker     // This event can be released after the callback was called.
133*8975f5c5SAndroid Build Coastguard Worker     if (release())
134*8975f5c5SAndroid Build Coastguard Worker     {
135*8975f5c5SAndroid Build Coastguard Worker         delete this;
136*8975f5c5SAndroid Build Coastguard Worker     }
137*8975f5c5SAndroid Build Coastguard Worker }
138*8975f5c5SAndroid Build Coastguard Worker 
Cast(cl_uint numEvents,const cl_event * eventList)139*8975f5c5SAndroid Build Coastguard Worker EventPtrs Event::Cast(cl_uint numEvents, const cl_event *eventList)
140*8975f5c5SAndroid Build Coastguard Worker {
141*8975f5c5SAndroid Build Coastguard Worker     EventPtrs events;
142*8975f5c5SAndroid Build Coastguard Worker     events.reserve(numEvents);
143*8975f5c5SAndroid Build Coastguard Worker     while (numEvents-- != 0u)
144*8975f5c5SAndroid Build Coastguard Worker     {
145*8975f5c5SAndroid Build Coastguard Worker         events.emplace_back(&(*eventList++)->cast<Event>());
146*8975f5c5SAndroid Build Coastguard Worker     }
147*8975f5c5SAndroid Build Coastguard Worker     return events;
148*8975f5c5SAndroid Build Coastguard Worker }
149*8975f5c5SAndroid Build Coastguard Worker 
Event(Context & context)150*8975f5c5SAndroid Build Coastguard Worker Event::Event(Context &context) : mContext(&context), mCommandType(CL_COMMAND_USER), mImpl(nullptr)
151*8975f5c5SAndroid Build Coastguard Worker {
152*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_IMPL_TRY(context.getImpl().createUserEvent(*this, &mImpl));
153*8975f5c5SAndroid Build Coastguard Worker }
154*8975f5c5SAndroid Build Coastguard Worker 
Event(CommandQueue & queue,cl_command_type commandType,const rx::CLEventImpl::CreateFunc & createFunc)155*8975f5c5SAndroid Build Coastguard Worker Event::Event(CommandQueue &queue,
156*8975f5c5SAndroid Build Coastguard Worker              cl_command_type commandType,
157*8975f5c5SAndroid Build Coastguard Worker              const rx::CLEventImpl::CreateFunc &createFunc)
158*8975f5c5SAndroid Build Coastguard Worker     : mContext(&queue.getContext()),
159*8975f5c5SAndroid Build Coastguard Worker       mCommandQueue(&queue),
160*8975f5c5SAndroid Build Coastguard Worker       mCommandType(commandType),
161*8975f5c5SAndroid Build Coastguard Worker       mImpl(createFunc(*this))
162*8975f5c5SAndroid Build Coastguard Worker {}
163*8975f5c5SAndroid Build Coastguard Worker 
164*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
165