diff options
author | Austin Annestrand <a.annestrand@samsung.com> | 2024-03-13 12:31:40 -0500 |
---|---|---|
committer | Angle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2024-04-25 20:38:35 +0000 |
commit | 6cfb593174d2f9d432386f4ea1fb587c9c395593 (patch) | |
tree | e4b9ce985ba52d7f078c799d570c23ab5f15237f | |
parent | 55affbfd7cadd5d64e1790e30eeda5b2123c0a53 (diff) | |
download | angle-6cfb593174d2f9d432386f4ea1fb587c9c395593.tar.gz |
CL/VK: Implement marker and barrier cmds
Adding in last remaining marker and barrier cmds:
clEnqueueMarker
clEnqueueBarrier
clEnqueueMarkerWithWaitList
clEnqueueBarrierWithWaitList
Bug: angleproject:8634
Change-Id: I67e03e379c3f9e40a31bcba34ea85e2739cc97b5
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5406617
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Austin Annestrand <a.annestrand@samsung.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
-rw-r--r-- | src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp | 59 |
1 files changed, 51 insertions, 8 deletions
diff --git a/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp b/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp index fa8a233bab..3c32cc7e4f 100644 --- a/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp +++ b/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp @@ -379,14 +379,30 @@ angle::Result CLCommandQueueVk::enqueueNativeKernel(cl::UserFunc userFunc, angle::Result CLCommandQueueVk::enqueueMarkerWithWaitList(const cl::EventPtrs &waitEvents, CLEventImpl::CreateFunc *eventCreateFunc) { - UNIMPLEMENTED(); - ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES); + std::scoped_lock<std::mutex> sl(mCommandQueueMutex); + + ANGLE_TRY(processWaitlist(waitEvents)); + ANGLE_TRY(createEvent(eventCreateFunc)); + + return angle::Result::Continue; } angle::Result CLCommandQueueVk::enqueueMarker(CLEventImpl::CreateFunc &eventCreateFunc) { - UNIMPLEMENTED(); - ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES); + std::scoped_lock<std::mutex> sl(mCommandQueueMutex); + + // This deprecated API is essentially a super-set of clEnqueueBarrier, where we also return an + // event object (i.e. marker) since clEnqueueBarrier does not provide this + VkMemoryBarrier memoryBarrier = {VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, + VK_ACCESS_SHADER_WRITE_BIT, + VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT}; + mComputePassCommands->getCommandBuffer().pipelineBarrier( + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 1, + &memoryBarrier, 0, nullptr, 0, nullptr); + + ANGLE_TRY(createEvent(&eventCreateFunc)); + + return angle::Result::Continue; } angle::Result CLCommandQueueVk::enqueueWaitForEvents(const cl::EventPtrs &events) @@ -402,14 +418,41 @@ angle::Result CLCommandQueueVk::enqueueWaitForEvents(const cl::EventPtrs &events angle::Result CLCommandQueueVk::enqueueBarrierWithWaitList(const cl::EventPtrs &waitEvents, CLEventImpl::CreateFunc *eventCreateFunc) { - UNIMPLEMENTED(); - ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES); + std::scoped_lock<std::mutex> sl(mCommandQueueMutex); + + // The barrier command either waits for a list of events to complete, or if the list is empty it + // waits for all commands previously enqueued in command_queue to complete before it completes + if (waitEvents.empty()) + { + VkMemoryBarrier memoryBarrier = {VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, + VK_ACCESS_SHADER_WRITE_BIT, + VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT}; + mComputePassCommands->getCommandBuffer().pipelineBarrier( + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 1, + &memoryBarrier, 0, nullptr, 0, nullptr); + } + else + { + ANGLE_TRY(processWaitlist(waitEvents)); + } + + ANGLE_TRY(createEvent(eventCreateFunc)); + + return angle::Result::Continue; } angle::Result CLCommandQueueVk::enqueueBarrier() { - UNIMPLEMENTED(); - ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES); + std::scoped_lock<std::mutex> sl(mCommandQueueMutex); + + VkMemoryBarrier memoryBarrier = {VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, + VK_ACCESS_SHADER_WRITE_BIT, + VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT}; + mComputePassCommands->getCommandBuffer().pipelineBarrier( + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 1, + &memoryBarrier, 0, nullptr, 0, nullptr); + + return angle::Result::Continue; } angle::Result CLCommandQueueVk::flush() |