aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Annestrand <a.annestrand@samsung.com>2024-03-13 12:31:40 -0500
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-04-25 20:38:35 +0000
commit6cfb593174d2f9d432386f4ea1fb587c9c395593 (patch)
treee4b9ce985ba52d7f078c799d570c23ab5f15237f
parent55affbfd7cadd5d64e1790e30eeda5b2123c0a53 (diff)
downloadangle-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.cpp59
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()