Flutter Impeller
queue_vk.h
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 #ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_QUEUE_VK_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_QUEUE_VK_H_
7 
8 #include <memory>
9 
10 #include "impeller/base/thread.h"
12 
13 namespace impeller {
14 
15 struct QueueIndexVK {
16  size_t family = 0;
17  size_t index = 0;
18 
19  constexpr bool operator==(const QueueIndexVK& other) const {
20  return family == other.family && index == other.index;
21  }
22 };
23 
24 //------------------------------------------------------------------------------
25 /// @brief A thread safe object that can be used to access device queues.
26 /// If multiple objects are created with the same underlying queue,
27 /// then the external synchronization guarantees of Vulkan queues
28 /// cannot be met. So care must be taken the same device queue
29 /// doesn't form the basis of multiple `QueueVK`s.
30 ///
31 class QueueVK {
32  public:
33  QueueVK(QueueIndexVK index, vk::Queue queue);
34 
36 
37  const QueueIndexVK& GetIndex() const;
38 
39  vk::Result Submit(const vk::SubmitInfo& submit_info,
40  const vk::Fence& fence) const;
41 
42  vk::Result Submit(const vk::Fence& fence) const;
43 
44  vk::Result Present(const vk::PresentInfoKHR& present_info);
45 
46  void InsertDebugMarker(std::string_view label) const;
47 
48  private:
49  mutable Mutex queue_mutex_;
50 
51  const QueueIndexVK index_;
52  const vk::Queue queue_ IPLR_GUARDED_BY(queue_mutex_);
53 
54  QueueVK(const QueueVK&) = delete;
55 
56  QueueVK& operator=(const QueueVK&) = delete;
57 };
58 
59 //------------------------------------------------------------------------------
60 /// @brief The collection of queues used by the context. The queues may all
61 /// be the same.
62 ///
63 struct QueuesVK {
64  std::shared_ptr<QueueVK> graphics_queue;
65  std::shared_ptr<QueueVK> compute_queue;
66  std::shared_ptr<QueueVK> transfer_queue;
67 
69 
70  QueuesVK(std::shared_ptr<QueueVK> graphics_queue,
71  std::shared_ptr<QueueVK> compute_queue,
72  std::shared_ptr<QueueVK> transfer_queue);
73 
74  static QueuesVK FromEmbedderQueue(vk::Queue queue,
75  uint32_t queue_family_index);
76 
77  static QueuesVK FromQueueIndices(const vk::Device& device,
78  QueueIndexVK graphics,
79  QueueIndexVK compute,
80  QueueIndexVK transfer);
81 
82  bool IsValid() const;
83 };
84 
85 } // namespace impeller
86 
87 #endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_QUEUE_VK_H_
A thread safe object that can be used to access device queues. If multiple objects are created with t...
Definition: queue_vk.h:31
QueueVK(QueueIndexVK index, vk::Queue queue)
Definition: queue_vk.cc:13
const QueueIndexVK & GetIndex() const
Definition: queue_vk.cc:18
void InsertDebugMarker(std::string_view label) const
Definition: queue_vk.cc:38
vk::Result Present(const vk::PresentInfoKHR &present_info)
Definition: queue_vk.cc:33
vk::Result Submit(const vk::SubmitInfo &submit_info, const vk::Fence &fence) const
Definition: queue_vk.cc:22
constexpr bool operator==(const QueueIndexVK &other) const
Definition: queue_vk.h:19
The collection of queues used by the context. The queues may all be the same.
Definition: queue_vk.h:63
static QueuesVK FromEmbedderQueue(vk::Queue queue, uint32_t queue_family_index)
Definition: queue_vk.cc:58
static QueuesVK FromQueueIndices(const vk::Device &device, QueueIndexVK graphics, QueueIndexVK compute, QueueIndexVK transfer)
Definition: queue_vk.cc:67
std::shared_ptr< QueueVK > compute_queue
Definition: queue_vk.h:65
std::shared_ptr< QueueVK > transfer_queue
Definition: queue_vk.h:66
std::shared_ptr< QueueVK > graphics_queue
Definition: queue_vk.h:64
bool IsValid() const
Definition: queue_vk.cc:104