7 #include "flutter/fml/closure.h"
17 const std::weak_ptr<const DeviceHolder>& device_holder,
18 const std::shared_ptr<CommandPoolVK>& pool)
19 : desc_pool_(device_holder) {
23 auto buffer = pool->CreateCommandBuffer();
28 buffer_ = std::move(buffer);
36 pool_->CollectCommandBuffer(std::move(buffer_));
39 bool IsValid()
const {
return is_valid_; }
41 void Track(std::shared_ptr<SharedObjectVK>
object) {
45 tracked_objects_.insert(std::move(
object));
48 void Track(std::shared_ptr<const Buffer> buffer) {
52 tracked_buffers_.insert(std::move(buffer));
55 bool IsTracking(
const std::shared_ptr<const Buffer>& buffer)
const {
59 return tracked_buffers_.find(buffer) != tracked_buffers_.end();
62 void Track(std::shared_ptr<const TextureSourceVK> texture) {
66 tracked_textures_.insert(std::move(texture));
69 bool IsTracking(
const std::shared_ptr<const TextureSourceVK>& texture)
const {
73 return tracked_textures_.find(texture) != tracked_textures_.end();
83 std::shared_ptr<CommandPoolVK> pool_;
84 vk::UniqueCommandBuffer buffer_;
85 std::set<std::shared_ptr<SharedObjectVK>> tracked_objects_;
86 std::set<std::shared_ptr<const Buffer>> tracked_buffers_;
87 std::set<std::shared_ptr<const TextureSourceVK>> tracked_textures_;
88 bool is_valid_ =
false;
94 const std::weak_ptr<const ContextVK>& context)
95 : context_(context) {}
102 auto context = context_.lock();
107 auto recycler = context_vk.GetCommandPoolRecycler();
111 auto tls_pool = recycler->Get();
116 auto tracked_objects = std::make_shared<TrackedObjectsVK>(
117 context_vk.GetDeviceHolder(), tls_pool);
118 auto queue = context_vk.GetGraphicsQueue();
120 if (!tracked_objects || !tracked_objects->IsValid() || !queue) {
124 vk::CommandBufferBeginInfo begin_info;
125 begin_info.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit;
126 if (tracked_objects->GetCommandBuffer().begin(begin_info) !=
127 vk::Result::eSuccess) {
132 if (label_.has_value()) {
133 context_vk.SetDebugName(tracked_objects->GetCommandBuffer(),
137 return std::make_shared<CommandEncoderVK>(context_vk.GetDeviceHolder(),
138 tracked_objects, queue,
139 context_vk.GetFenceWaiter());
143 std::weak_ptr<const DeviceHolder> device_holder,
144 std::shared_ptr<TrackedObjectsVK> tracked_objects,
145 const std::shared_ptr<QueueVK>& queue,
146 std::shared_ptr<FenceWaiterVK> fence_waiter)
147 : device_holder_(
std::move(device_holder)),
148 tracked_objects_(
std::move(tracked_objects)),
150 fence_waiter_(
std::move(fence_waiter)) {}
160 bool fail_callback = !!callback;
170 fml::ScopedCleanupClosure reset([&]() {
181 auto status = command_buffer.end();
182 if (status != vk::Result::eSuccess) {
183 VALIDATION_LOG <<
"Failed to end command buffer: " << vk::to_string(status);
186 std::shared_ptr<const DeviceHolder> strong_device = device_holder_.lock();
187 if (!strong_device) {
191 auto [fence_result, fence] = strong_device->GetDevice().createFenceUnique({});
192 if (fence_result != vk::Result::eSuccess) {
193 VALIDATION_LOG <<
"Failed to create fence: " << vk::to_string(fence_result);
197 vk::SubmitInfo submit_info;
198 std::vector<vk::CommandBuffer> buffers = {command_buffer};
199 submit_info.setCommandBuffers(buffers);
200 status = queue_->Submit(submit_info, *fence);
201 if (status != vk::Result::eSuccess) {
202 VALIDATION_LOG <<
"Failed to submit queue: " << vk::to_string(status);
208 fail_callback =
false;
209 return fence_waiter_->AddFence(
211 [callback, tracked_objects = std::move(tracked_objects_)] {
219 if (tracked_objects_) {
220 return tracked_objects_->GetCommandBuffer();
225 void CommandEncoderVK::Reset() {
226 tracked_objects_.reset();
236 tracked_objects_->Track(std::move(
object));
244 tracked_objects_->Track(std::move(buffer));
249 const std::shared_ptr<const Buffer>& buffer)
const {
253 return tracked_objects_->IsTracking(buffer);
260 tracked_objects_->Track(std::move(texture));
275 const std::shared_ptr<const Texture>& texture)
const {
279 std::shared_ptr<const TextureSourceVK> source =
281 return tracked_objects_->IsTracking(source);
285 const vk::DescriptorSetLayout& layout,
286 size_t command_count) {
291 return tracked_objects_->GetDescriptorPool().AllocateDescriptorSet(
292 layout, command_count);
299 vk::DebugUtilsLabelEXT label_info;
300 label_info.pLabelName = label;
302 command_buffer.beginDebugUtilsLabelEXT(label_info);
311 command_buffer.endDebugUtilsLabelEXT();
319 vk::DebugUtilsLabelEXT label_info;
320 label_info.pLabelName = label;
322 command_buffer.insertDebugUtilsLabelEXT(label_info);
325 queue_->InsertDebugMarker(label);