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 80 81 82 83
//
// 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.
//
// CLEventVk.h: Defines the class interface for CLEventVk, implementing CLEventImpl.
#ifndef LIBANGLE_RENDERER_VULKAN_CLEVENTVK_H_
#define LIBANGLE_RENDERER_VULKAN_CLEVENTVK_H_
#include <condition_variable>
#include <mutex>
#include "libANGLE/renderer/vulkan/CLContextVk.h"
#include "libANGLE/renderer/vulkan/cl_types.h"
#include "libANGLE/renderer/vulkan/vk_resource.h"
#include "libANGLE/renderer/CLEventImpl.h"
#include "libANGLE/CLCommandQueue.h"
#include "libANGLE/CLContext.h"
#include "libANGLE/CLEvent.h"
namespace rx
{
class CLEventVk : public CLEventImpl
{
public:
CLEventVk(const cl::Event &event,
const cl::ExecutionStatus initialStatus,
const QueueSerial eventSerial);
~CLEventVk() override;
cl_int getCommandType() const { return mEvent.getCommandType(); }
bool isUserEvent() const { return mEvent.isUserEvent(); }
cl::Event &getFrontendObject() { return const_cast<cl::Event &>(mEvent); }
const QueueSerial &getQueueSerial() { return mQueueSerial; }
bool usedByCommandBuffer(const QueueSerial &commandBufferQueueSerial) const
{
ASSERT(commandBufferQueueSerial.valid());
return mQueueSerial == commandBufferQueueSerial;
}
angle::Result onEventCreate() override;
angle::Result getCommandExecutionStatus(cl_int &executionStatus) override;
angle::Result setUserEventStatus(cl_int executionStatus) override;
angle::Result setCallback(cl::Event &event, cl_int commandExecCallbackType) override;
angle::Result getProfilingInfo(cl::ProfilingInfo name,
size_t valueSize,
void *value,
size_t *valueSizeRet) override;
angle::Result waitForUserEventStatus();
angle::Result setStatusAndExecuteCallback(cl_int status);
angle::Result setTimestamp(cl_int status);
private:
std::mutex mUserEventMutex;
angle::SynchronizedValue<cl_int> mStatus;
std::condition_variable mUserEventCondition;
angle::SynchronizedValue<cl::EventStatusMap<bool>> mHaveCallbacks;
// Event profiling timestamps
struct ProfilingTimestamps
{
cl_ulong commandEndTS;
cl_ulong commandStartTS;
cl_ulong commandQueuedTS;
cl_ulong commandSubmitTS;
cl_ulong commandCompleteTS;
};
angle::SynchronizedValue<ProfilingTimestamps> mProfilingTimestamps;
const QueueSerial mQueueSerial;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_CLEVENTVK_H_