| // |
| // 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_ |