1 // Copyright (c) 2016 The Chromium 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 GPU_VULKAN_VULKAN_DEVICE_QUEUE_H_
6 #define GPU_VULKAN_VULKAN_DEVICE_QUEUE_H_
7 
8 #include <vulkan/vulkan.h>
9 
10 #include <memory>
11 
12 #include "base/callback.h"
13 #include "base/logging.h"
14 #include "base/macros.h"
15 #include "build/build_config.h"
16 #include "gpu/vulkan/vulkan_export.h"
17 #include "ui/gfx/extension_set.h"
18 
19 namespace gpu {
20 
21 class VulkanCommandPool;
22 class VulkanFenceHelper;
23 class VulkanInfo;
24 
25 class VULKAN_EXPORT VulkanDeviceQueue {
26  public:
27   enum DeviceQueueOption {
28     GRAPHICS_QUEUE_FLAG = 0x01,
29     PRESENTATION_SUPPORT_QUEUE_FLAG = 0x02,
30   };
31 
32   VulkanDeviceQueue(VkInstance vk_instance,
33                     bool enforce_protected_memory = false);
34   ~VulkanDeviceQueue();
35 
36   using GetPresentationSupportCallback =
37       base::RepeatingCallback<bool(VkPhysicalDevice,
38                                    const std::vector<VkQueueFamilyProperties>&,
39                                    uint32_t queue_family_index)>;
40   bool Initialize(
41       uint32_t options,
42       const VulkanInfo& info,
43       const std::vector<const char*>& required_extensions,
44       const std::vector<const char*>& optional_extensions,
45       bool allow_protected_memory,
46       const GetPresentationSupportCallback& get_presentation_support);
47 
48   bool InitializeForWebView(VkPhysicalDevice vk_physical_device,
49                             VkDevice vk_device,
50                             VkQueue vk_queue,
51                             uint32_t vk_queue_index,
52                             gfx::ExtensionSet enabled_extensions);
53 
enabled_extensions()54   const gfx::ExtensionSet& enabled_extensions() const {
55     return enabled_extensions_;
56   }
57 
58   void Destroy();
59 
GetVulkanPhysicalDevice()60   VkPhysicalDevice GetVulkanPhysicalDevice() const {
61     DCHECK_NE(static_cast<VkPhysicalDevice>(VK_NULL_HANDLE),
62               vk_physical_device_);
63     return vk_physical_device_;
64   }
65 
vk_physical_device_properties()66   const VkPhysicalDeviceProperties& vk_physical_device_properties() const {
67     return vk_physical_device_properties_;
68   }
69 
GetVulkanDevice()70   VkDevice GetVulkanDevice() const {
71     DCHECK_NE(static_cast<VkDevice>(VK_NULL_HANDLE), vk_device_);
72     return vk_device_;
73   }
74 
GetVulkanQueue()75   VkQueue GetVulkanQueue() const {
76     DCHECK_NE(static_cast<VkQueue>(VK_NULL_HANDLE), vk_queue_);
77     return vk_queue_;
78   }
79 
GetVulkanInstance()80   VkInstance GetVulkanInstance() const { return vk_instance_; }
81 
GetVulkanQueueIndex()82   uint32_t GetVulkanQueueIndex() const { return vk_queue_index_; }
83 
84   std::unique_ptr<gpu::VulkanCommandPool> CreateCommandPool();
85 
GetFenceHelper()86   VulkanFenceHelper* GetFenceHelper() const { return cleanup_helper_.get(); }
87 
enabled_device_features_2()88   const VkPhysicalDeviceFeatures2& enabled_device_features_2() const {
89     return enabled_device_features_2_;
90   }
91 
enabled_device_features()92   const VkPhysicalDeviceFeatures& enabled_device_features() const {
93     return enabled_device_features_2_.features;
94   }
95 
allow_protected_memory()96   bool allow_protected_memory() const { return allow_protected_memory_; }
97 
98  private:
99   gfx::ExtensionSet enabled_extensions_;
100   VkPhysicalDevice vk_physical_device_ = VK_NULL_HANDLE;
101   VkPhysicalDeviceProperties vk_physical_device_properties_;
102   VkDevice owned_vk_device_ = VK_NULL_HANDLE;
103   VkDevice vk_device_ = VK_NULL_HANDLE;
104   VkQueue vk_queue_ = VK_NULL_HANDLE;
105   uint32_t vk_queue_index_ = 0;
106   const VkInstance vk_instance_;
107   std::unique_ptr<VulkanFenceHelper> cleanup_helper_;
108   VkPhysicalDeviceFeatures2 enabled_device_features_2_;
109 
110   const bool enforce_protected_memory_;
111   bool allow_protected_memory_ = false;
112 
113 #if defined(OS_ANDROID) || defined(OS_FUCHSIA)
114   VkPhysicalDeviceSamplerYcbcrConversionFeatures
115       sampler_ycbcr_conversion_features_;
116 #endif  // defined(OS_ANDROID) || defined(OS_FUCHSIA)
117 
118   VkPhysicalDeviceProtectedMemoryFeatures protected_memory_features_;
119 
120   DISALLOW_COPY_AND_ASSIGN(VulkanDeviceQueue);
121 };
122 
123 }  // namespace gpu
124 
125 #endif  // GPU_VULKAN_VULKAN_DEVICE_QUEUE_H_
126