blob: 7e765924fced93c4bc7b50d5049eb17f466e00ea [file] [log] [blame]
dyen8a145fb72016-03-31 00:37:511// 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
mostynb6682b1c42016-04-19 10:17:3010#include <memory>
11
Michael Spang7509e6d2018-05-16 17:08:2812#include "base/callback.h"
dyen8a145fb72016-03-31 00:37:5113#include "base/logging.h"
14#include "base/macros.h"
Vikas Sonib08bd9b2019-06-13 05:49:4715#include "build/build_config.h"
dyen8a145fb72016-03-31 00:37:5116#include "gpu/vulkan/vulkan_export.h"
Michael Spang4e46bc22018-06-21 23:07:5117#include "ui/gfx/extension_set.h"
dyen8a145fb72016-03-31 00:37:5118
19namespace gpu {
20
dyen8a145fb72016-03-31 00:37:5121class VulkanCommandPool;
Peng Huangc2d69cc2019-10-07 23:02:2522class VulkanFenceHelper;
23class VulkanInfo;
dyen8a145fb72016-03-31 00:37:5124
25class VULKAN_EXPORT VulkanDeviceQueue {
26 public:
27 enum DeviceQueueOption {
28 GRAPHICS_QUEUE_FLAG = 0x01,
29 PRESENTATION_SUPPORT_QUEUE_FLAG = 0x02,
30 };
31
Emircan Uysalerd41c9bf2019-08-08 20:38:3332 VulkanDeviceQueue(VkInstance vk_instance,
33 bool enforce_protected_memory = false);
dyen8a145fb72016-03-31 00:37:5134 ~VulkanDeviceQueue();
35
Michael Spang7509e6d2018-05-16 17:08:2836 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,
Peng Huangc2d69cc2019-10-07 23:02:2542 const VulkanInfo& info,
Michael Spang4e46bc22018-06-21 23:07:5143 const std::vector<const char*>& required_extensions,
Peng Huang334077c2020-02-24 15:27:4444 const std::vector<const char*>& optional_extensions,
Emircan Uysalerd41c9bf2019-08-08 20:38:3345 bool allow_protected_memory,
Sergey Ulanove82b1002019-07-22 22:23:3946 const GetPresentationSupportCallback& get_presentation_support);
Michael Spang7509e6d2018-05-16 17:08:2847
Shouqun Liu80cd8a82019-06-17 18:15:1948 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);
Peng Huangbcf31dc2019-03-12 00:35:4053
Michael Spang4e46bc22018-06-21 23:07:5154 const gfx::ExtensionSet& enabled_extensions() const {
55 return enabled_extensions_;
56 }
57
dyen8a145fb72016-03-31 00:37:5158 void Destroy();
59
60 VkPhysicalDevice GetVulkanPhysicalDevice() const {
61 DCHECK_NE(static_cast<VkPhysicalDevice>(VK_NULL_HANDLE),
62 vk_physical_device_);
63 return vk_physical_device_;
64 }
65
Peng Huang3c13b502019-05-08 01:40:0066 const VkPhysicalDeviceProperties& vk_physical_device_properties() const {
67 return vk_physical_device_properties_;
68 }
69
dyen8a145fb72016-03-31 00:37:5170 VkDevice GetVulkanDevice() const {
71 DCHECK_NE(static_cast<VkDevice>(VK_NULL_HANDLE), vk_device_);
72 return vk_device_;
73 }
74
75 VkQueue GetVulkanQueue() const {
76 DCHECK_NE(static_cast<VkQueue>(VK_NULL_HANDLE), vk_queue_);
77 return vk_queue_;
78 }
79
suyambu.rmf2fbf532017-12-04 08:38:1580 VkInstance GetVulkanInstance() const { return vk_instance_; }
81
dyen8a145fb72016-03-31 00:37:5182 uint32_t GetVulkanQueueIndex() const { return vk_queue_index_; }
83
mostynb6682b1c42016-04-19 10:17:3084 std::unique_ptr<gpu::VulkanCommandPool> CreateCommandPool();
dyen8a145fb72016-03-31 00:37:5185
Eric Karlf9ec4a502019-04-11 18:29:5286 VulkanFenceHelper* GetFenceHelper() const { return cleanup_helper_.get(); }
87
Vikas Sonib08bd9b2019-06-13 05:49:4788 const VkPhysicalDeviceFeatures2& enabled_device_features_2() const {
89 return enabled_device_features_2_;
Saman Samia0090032019-06-06 21:41:3690 }
91
Peng Huang784a2d02019-06-13 14:55:2192 const VkPhysicalDeviceFeatures& enabled_device_features() const {
93 return enabled_device_features_2_.features;
94 }
95
Emircan Uysalerd41c9bf2019-08-08 20:38:3396 bool allow_protected_memory() const { return allow_protected_memory_; }
97
dyen8a145fb72016-03-31 00:37:5198 private:
Michael Spang4e46bc22018-06-21 23:07:5199 gfx::ExtensionSet enabled_extensions_;
dyen8a145fb72016-03-31 00:37:51100 VkPhysicalDevice vk_physical_device_ = VK_NULL_HANDLE;
Peng Huang3c13b502019-05-08 01:40:00101 VkPhysicalDeviceProperties vk_physical_device_properties_;
Peng Huangbcf31dc2019-03-12 00:35:40102 VkDevice owned_vk_device_ = VK_NULL_HANDLE;
dyen8a145fb72016-03-31 00:37:51103 VkDevice vk_device_ = VK_NULL_HANDLE;
104 VkQueue vk_queue_ = VK_NULL_HANDLE;
105 uint32_t vk_queue_index_ = 0;
Michael Spang7509e6d2018-05-16 17:08:28106 const VkInstance vk_instance_;
Eric Karlf9ec4a502019-04-11 18:29:52107 std::unique_ptr<VulkanFenceHelper> cleanup_helper_;
Peng Huangc2d69cc2019-10-07 23:02:25108 VkPhysicalDeviceFeatures2 enabled_device_features_2_;
Sergey Ulanov6ff66f22019-08-14 00:38:39109
Emircan Uysalerd41c9bf2019-08-08 20:38:33110 const bool enforce_protected_memory_;
111 bool allow_protected_memory_ = false;
Vikas Sonib08bd9b2019-06-13 05:49:47112
Sergey Ulanov6ff66f22019-08-14 00:38:39113#if defined(OS_ANDROID) || defined(OS_FUCHSIA)
Vikas Sonib08bd9b2019-06-13 05:49:47114 VkPhysicalDeviceSamplerYcbcrConversionFeatures
Peng Huangc2d69cc2019-10-07 23:02:25115 sampler_ycbcr_conversion_features_;
Sergey Ulanov6ff66f22019-08-14 00:38:39116#endif // defined(OS_ANDROID) || defined(OS_FUCHSIA)
117
Peng Huangc2d69cc2019-10-07 23:02:25118 VkPhysicalDeviceProtectedMemoryFeatures protected_memory_features_;
dyen8a145fb72016-03-31 00:37:51119
120 DISALLOW_COPY_AND_ASSIGN(VulkanDeviceQueue);
121};
122
123} // namespace gpu
124
125#endif // GPU_VULKAN_VULKAN_DEVICE_QUEUE_H_