5 #include "fml/status.h"
20 : context_(context) {}
25 const std::vector<std::shared_ptr<CommandBuffer>>& buffers,
27 if (buffers.empty()) {
28 return fml::Status(fml::StatusCode::kInvalidArgument,
29 "No command buffers provided.");
32 fml::ScopedCleanupClosure reset([&]() {
33 if (completion_callback) {
38 std::vector<vk::CommandBuffer> vk_buffers;
39 std::vector<std::shared_ptr<TrackedObjectsVK>> tracked_objects;
40 vk_buffers.reserve(buffers.size());
41 tracked_objects.reserve(buffers.size());
42 for (
const std::shared_ptr<CommandBuffer>& buffer : buffers) {
44 if (!encoder->EndCommandBuffer()) {
45 return fml::Status(fml::StatusCode::kCancelled,
46 "Failed to end command buffer.");
48 tracked_objects.push_back(encoder->tracked_objects_);
49 vk_buffers.push_back(encoder->GetCommandBuffer());
53 auto context = context_.lock();
56 return fml::Status(fml::StatusCode::kCancelled,
"Device lost.");
58 auto [fence_result, fence] = context->GetDevice().createFenceUnique({});
59 if (fence_result != vk::Result::eSuccess) {
60 VALIDATION_LOG <<
"Failed to create fence: " << vk::to_string(fence_result);
61 return fml::Status(fml::StatusCode::kCancelled,
"Failed to create fence.");
64 vk::SubmitInfo submit_info;
65 submit_info.setCommandBuffers(vk_buffers);
66 auto status = context->GetGraphicsQueue()->Submit(submit_info, *fence);
67 if (status != vk::Result::eSuccess) {
68 VALIDATION_LOG <<
"Failed to submit queue: " << vk::to_string(status);
69 return fml::Status(fml::StatusCode::kCancelled,
"Failed to submit queue: ");
74 auto added_fence = context->GetFenceWaiter()->AddFence(
75 std::move(fence), [completion_callback, tracked_objects = std::move(
76 tracked_objects)]()
mutable {
79 tracked_objects.clear();
80 if (completion_callback) {
85 return fml::Status(fml::StatusCode::kCancelled,
"Failed to add fence.");