5 #include "fml/status.h"
19 : context_(context) {}
24 const std::vector<std::shared_ptr<CommandBuffer>>& buffers,
26 if (buffers.empty()) {
27 return fml::Status(fml::StatusCode::kInvalidArgument,
28 "No command buffers provided.");
31 fml::ScopedCleanupClosure reset([&]() {
32 if (completion_callback) {
37 std::vector<vk::CommandBuffer> vk_buffers;
38 std::vector<std::shared_ptr<TrackedObjectsVK>> tracked_objects;
39 vk_buffers.reserve(buffers.size());
40 tracked_objects.reserve(buffers.size());
41 for (
const std::shared_ptr<CommandBuffer>& buffer : buffers) {
44 return fml::Status(fml::StatusCode::kCancelled,
45 "Failed to end command buffer.");
48 tracked_objects.push_back(std::move(command_buffer.tracked_objects_));
51 auto context = context_.lock();
54 return fml::Status(fml::StatusCode::kCancelled,
"Device lost.");
56 auto [fence_result, fence] = context->GetDevice().createFenceUnique({});
57 if (fence_result != vk::Result::eSuccess) {
58 VALIDATION_LOG <<
"Failed to create fence: " << vk::to_string(fence_result);
59 return fml::Status(fml::StatusCode::kCancelled,
"Failed to create fence.");
62 vk::SubmitInfo submit_info;
63 submit_info.setCommandBuffers(vk_buffers);
64 auto status = context->GetGraphicsQueue()->Submit(submit_info, *fence);
65 if (status != vk::Result::eSuccess) {
66 VALIDATION_LOG <<
"Failed to submit queue: " << vk::to_string(status);
67 return fml::Status(fml::StatusCode::kCancelled,
"Failed to submit queue: ");
72 auto added_fence = context->GetFenceWaiter()->AddFence(
73 std::move(fence), [completion_callback, tracked_objects = std::move(
74 tracked_objects)]()
mutable {
77 tracked_objects.clear();
78 if (completion_callback) {
83 return fml::Status(fml::StatusCode::kCancelled,
"Failed to add fence.");
static CommandBufferVK & Cast(CommandBuffer &base)
bool EndCommandBuffer() const
End recording of the current command buffer.
vk::CommandBuffer GetCommandBuffer() const
Retrieve the native command buffer from this object.
std::function< void(CommandBuffer::Status)> CompletionCallback
~CommandQueueVK() override
CommandQueueVK(const std::weak_ptr< ContextVK > &context)
fml::Status Submit(const std::vector< std::shared_ptr< CommandBuffer >> &buffers, const CompletionCallback &completion_callback={}) override
Submit one or more command buffer objects to be encoded and executed on the GPU.