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