Hash :
ffbcd15e
Author :
Date :
2025-01-06T16:07:02
CL: Update event creation routines Move backend construction after frontend construction completes. This avoids potential undefined behavior if backend construction tries to access members of half-constructed frontend object. Add virtual onEventCreate routine for any actions that need to be performed after cmd event has been created. Additionally, this also fixes incorrect timestamp values when queue profiling is enabled for the VK backend. This was due to a missed event association to the cmd queue. Bug: angleproject:377942756 Change-Id: I0a2f0390cc04f94143d1801ad71e06f63785f3ce Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6149055 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Austin Annestrand <a.annestrand@samsung.com> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Gowtham Tammana <g.tammana@samsung.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
//
// 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.
//
// CLEventCL.cpp: Implements the class methods for CLEventCL.
#include "libANGLE/renderer/cl/CLEventCL.h"
#include "libANGLE/CLEvent.h"
#include "libANGLE/cl_utils.h"
namespace rx
{
CLEventCL::CLEventCL(const cl::Event &event, cl_event native) : CLEventImpl(event), mNative(native)
{}
CLEventCL::~CLEventCL()
{
if (mNative->getDispatch().clReleaseEvent(mNative) != CL_SUCCESS)
{
ERR() << "Error while releasing CL event";
}
}
angle::Result CLEventCL::onEventCreate()
{
return angle::Result::Continue;
}
angle::Result CLEventCL::getCommandExecutionStatus(cl_int &executionStatus)
{
ANGLE_CL_TRY(mNative->getDispatch().clGetEventInfo(mNative, CL_EVENT_COMMAND_EXECUTION_STATUS,
sizeof(executionStatus), &executionStatus,
nullptr));
return angle::Result::Continue;
}
angle::Result CLEventCL::setUserEventStatus(cl_int executionStatus)
{
ANGLE_CL_TRY(mNative->getDispatch().clSetUserEventStatus(mNative, executionStatus));
return angle::Result::Continue;
}
angle::Result CLEventCL::setCallback(cl::Event &event, cl_int commandExecCallbackType)
{
ANGLE_CL_TRY(mNative->getDispatch().clSetEventCallback(mNative, commandExecCallbackType,
Callback, &event));
return angle::Result::Continue;
}
angle::Result CLEventCL::getProfilingInfo(cl::ProfilingInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet)
{
ANGLE_CL_TRY(mNative->getDispatch().clGetEventProfilingInfo(mNative, cl::ToCLenum(name),
valueSize, value, valueSizeRet));
return angle::Result::Continue;
}
std::vector<cl_event> CLEventCL::Cast(const cl::EventPtrs &events)
{
std::vector<cl_event> nativeEvents;
nativeEvents.reserve(events.size());
for (const cl::EventPtr &event : events)
{
nativeEvents.emplace_back(event->getImpl<CLEventCL>().getNative());
}
return nativeEvents;
}
void CLEventCL::Callback(cl_event event, cl_int commandStatus, void *userData)
{
static_cast<cl::Event *>(userData)->callback(commandStatus);
}
} // namespace rx