Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
command_queue_vk.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "fml/status.h"
6
8
16
17namespace impeller {
18
19CommandQueueVK::CommandQueueVK(const std::weak_ptr<ContextVK>& context)
20 : context_(context) {}
21
23
25 const std::vector<std::shared_ptr<CommandBuffer>>& buffers,
26 const CompletionCallback& completion_callback) {
27 if (buffers.empty()) {
29 "No command buffers provided.");
30 }
31 // Success or failure, you only get to submit once.
33 if (completion_callback) {
34 completion_callback(CommandBuffer::Status::kError);
35 }
36 });
37
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()) {
46 "Failed to end command buffer.");
47 }
48 tracked_objects.push_back(encoder->tracked_objects_);
49 vk_buffers.push_back(encoder->GetCommandBuffer());
50 encoder->Reset();
51 }
52
53 auto context = context_.lock();
54 if (!context) {
55 VALIDATION_LOG << "Device lost.";
56 return fml::Status(fml::StatusCode::kCancelled, "Device lost.");
57 }
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.");
62 }
63
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: ");
70 }
71
72 // Submit will proceed, call callback with true when it is done and do not
73 // call when `reset` is collected.
74 auto added_fence = context->GetFenceWaiter()->AddFence(
75 std::move(fence), [completion_callback, tracked_objects = std::move(
76 tracked_objects)]() mutable {
77 // Ensure tracked objects are destructed before calling any final
78 // callbacks.
79 tracked_objects.clear();
80 if (completion_callback) {
81 completion_callback(CommandBuffer::Status::kCompleted);
82 }
83 });
84 if (!added_fence) {
85 return fml::Status(fml::StatusCode::kCancelled, "Failed to add fence.");
86 }
87 reset.Release();
88 return fml::Status();
89}
90
91} // namespace impeller
m reset()
Wraps a closure that is invoked in the destructor unless released by the caller.
Definition closure.h:32
static CommandBufferVK & Cast(CommandBuffer &base)
const std::shared_ptr< CommandEncoderVK > & GetEncoder()
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.
CommandQueueVK(const std::weak_ptr< ContextVK > &context)
std::function< void(CommandBuffer::Status)> CompletionCallback
static const uint8_t buffer[]
#define VALIDATION_LOG
Definition validation.h:73