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