OLD | NEW |
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/vulkan/vulkan_device_queue.h" | 5 #include "gpu/vulkan/vulkan_device_queue.h" |
6 | 6 |
| 7 #include <unordered_set> |
7 #include <vector> | 8 #include <vector> |
8 | 9 |
9 #include "gpu/vulkan/vulkan_command_pool.h" | 10 #include "gpu/vulkan/vulkan_command_pool.h" |
10 #include "gpu/vulkan/vulkan_implementation.h" | 11 #include "gpu/vulkan/vulkan_implementation.h" |
11 #include "gpu/vulkan/vulkan_platform.h" | 12 #include "gpu/vulkan/vulkan_platform.h" |
12 | 13 |
13 #if defined(VK_USE_PLATFORM_XLIB_KHR) | 14 #if defined(VK_USE_PLATFORM_XLIB_KHR) |
14 #include "ui/gfx/x/x11_types.h" | 15 #include "ui/gfx/x/x11_types.h" |
15 #endif // defined(VK_USE_PLATFORM_XLIB_KHR) | 16 #endif // defined(VK_USE_PLATFORM_XLIB_KHR) |
16 | 17 |
17 namespace gpu { | 18 namespace gpu { |
18 | 19 |
19 VulkanDeviceQueue::VulkanDeviceQueue() {} | 20 VulkanDeviceQueue::VulkanDeviceQueue() {} |
20 | 21 |
21 VulkanDeviceQueue::~VulkanDeviceQueue() { | 22 VulkanDeviceQueue::~VulkanDeviceQueue() { |
22 DCHECK_EQ(static_cast<VkPhysicalDevice>(VK_NULL_HANDLE), vk_physical_device_); | 23 DCHECK_EQ(static_cast<VkPhysicalDevice>(VK_NULL_HANDLE), vk_physical_device_); |
23 DCHECK_EQ(static_cast<VkDevice>(VK_NULL_HANDLE), vk_device_); | 24 DCHECK_EQ(static_cast<VkDevice>(VK_NULL_HANDLE), vk_device_); |
24 DCHECK_EQ(static_cast<VkQueue>(VK_NULL_HANDLE), vk_queue_); | 25 DCHECK_EQ(static_cast<VkQueue>(VK_NULL_HANDLE), vk_queue_); |
25 } | 26 } |
26 | 27 |
27 bool VulkanDeviceQueue::Initialize(uint32_t options) { | 28 bool VulkanDeviceQueue::Initialize(uint32_t options) { |
28 VkInstance vk_instance = gpu::GetVulkanInstance(); | 29 VkInstance vk_instance = gpu::GetVulkanInstance(); |
29 if (VK_NULL_HANDLE == vk_instance) | 30 if (VK_NULL_HANDLE == vk_instance) |
30 return false; | 31 return false; |
31 | 32 |
32 VkResult status = VK_SUCCESS; | 33 VkResult result = VK_SUCCESS; |
33 | 34 |
34 uint32_t device_count = 0; | 35 uint32_t device_count = 0; |
35 status = vkEnumeratePhysicalDevices(vk_instance, &device_count, nullptr); | 36 result = vkEnumeratePhysicalDevices(vk_instance, &device_count, nullptr); |
36 if (VK_SUCCESS != status || device_count == 0) | 37 if (VK_SUCCESS != result || device_count == 0) |
37 return false; | 38 return false; |
38 | 39 |
39 std::vector<VkPhysicalDevice> devices(device_count); | 40 std::vector<VkPhysicalDevice> devices(device_count); |
40 status = | 41 result = |
41 vkEnumeratePhysicalDevices(vk_instance, &device_count, devices.data()); | 42 vkEnumeratePhysicalDevices(vk_instance, &device_count, devices.data()); |
42 if (VK_SUCCESS != status) { | 43 if (VK_SUCCESS != result) { |
43 DLOG(ERROR) << "vkEnumeratePhysicalDevices() failed: " << status; | 44 DLOG(ERROR) << "vkEnumeratePhysicalDevices() failed: " << result; |
44 return false; | 45 return false; |
45 } | 46 } |
46 | 47 |
47 #if defined(VK_USE_PLATFORM_XLIB_KHR) | 48 #if defined(VK_USE_PLATFORM_XLIB_KHR) |
48 Display* xdisplay = gfx::GetXDisplay(); | 49 Display* xdisplay = gfx::GetXDisplay(); |
49 VisualID visual_id = | 50 VisualID visual_id = |
50 XVisualIDFromVisual(DefaultVisual(xdisplay, DefaultScreen(xdisplay))); | 51 XVisualIDFromVisual(DefaultVisual(xdisplay, DefaultScreen(xdisplay))); |
51 #endif // defined(VK_USE_PLATFORM_XLIB_KHR) | 52 #endif // defined(VK_USE_PLATFORM_XLIB_KHR) |
52 | 53 |
53 VkQueueFlags queue_flags = 0; | 54 VkQueueFlags queue_flags = 0; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 | 98 |
98 float queue_priority = 0.0f; | 99 float queue_priority = 0.0f; |
99 VkDeviceQueueCreateInfo queue_create_info = {}; | 100 VkDeviceQueueCreateInfo queue_create_info = {}; |
100 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; | 101 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; |
101 queue_create_info.queueFamilyIndex = queue_index; | 102 queue_create_info.queueFamilyIndex = queue_index; |
102 queue_create_info.queueCount = 1; | 103 queue_create_info.queueCount = 1; |
103 queue_create_info.pQueuePriorities = &queue_priority; | 104 queue_create_info.pQueuePriorities = &queue_priority; |
104 | 105 |
105 const char* device_extensions[] = {VK_KHR_SWAPCHAIN_EXTENSION_NAME}; | 106 const char* device_extensions[] = {VK_KHR_SWAPCHAIN_EXTENSION_NAME}; |
106 | 107 |
| 108 std::vector<const char*> enabled_layer_names; |
| 109 #if DCHECK_IS_ON() |
| 110 uint32_t num_device_layers = 0; |
| 111 result = vkEnumerateDeviceLayerProperties(vk_physical_device_, |
| 112 &num_device_layers, nullptr); |
| 113 if (VK_SUCCESS != result) { |
| 114 DLOG(ERROR) << "vkEnumerateDeviceLayerProperties(NULL) failed: " |
| 115 << result; |
| 116 return false; |
| 117 } |
| 118 |
| 119 std::vector<VkLayerProperties> device_layers(num_device_layers); |
| 120 result = vkEnumerateDeviceLayerProperties(vk_physical_device_, |
| 121 &num_device_layers, |
| 122 device_layers.data()); |
| 123 if (VK_SUCCESS != result) { |
| 124 DLOG(ERROR) << "vkEnumerateDeviceLayerProperties() failed: " << result; |
| 125 return false; |
| 126 } |
| 127 |
| 128 std::unordered_set<std::string> desired_layers({ |
| 129 "VK_LAYER_LUNARG_standard_validation", |
| 130 }); |
| 131 |
| 132 for (const VkLayerProperties& layer_property : device_layers) { |
| 133 if (desired_layers.find(layer_property.layerName) != desired_layers.end()) |
| 134 enabled_layer_names.push_back(layer_property.layerName); |
| 135 } |
| 136 #endif |
| 137 |
107 VkDeviceCreateInfo device_create_info = {}; | 138 VkDeviceCreateInfo device_create_info = {}; |
108 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; | 139 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; |
109 device_create_info.queueCreateInfoCount = 1; | 140 device_create_info.queueCreateInfoCount = 1; |
110 device_create_info.pQueueCreateInfos = &queue_create_info; | 141 device_create_info.pQueueCreateInfos = &queue_create_info; |
| 142 device_create_info.enabledLayerCount = enabled_layer_names.size(); |
| 143 device_create_info.ppEnabledLayerNames = enabled_layer_names.data(); |
111 device_create_info.enabledExtensionCount = arraysize(device_extensions); | 144 device_create_info.enabledExtensionCount = arraysize(device_extensions); |
112 device_create_info.ppEnabledExtensionNames = device_extensions; | 145 device_create_info.ppEnabledExtensionNames = device_extensions; |
113 | 146 |
114 status = vkCreateDevice(vk_physical_device_, &device_create_info, nullptr, | 147 result = vkCreateDevice(vk_physical_device_, &device_create_info, nullptr, |
115 &vk_device_); | 148 &vk_device_); |
116 if (VK_SUCCESS != status) | 149 if (VK_SUCCESS != result) |
117 return false; | 150 return false; |
118 | 151 |
119 vkGetDeviceQueue(vk_device_, queue_index, 0, &vk_queue_); | 152 vkGetDeviceQueue(vk_device_, queue_index, 0, &vk_queue_); |
120 | 153 |
121 return true; | 154 return true; |
122 } | 155 } |
123 | 156 |
124 void VulkanDeviceQueue::Destroy() { | 157 void VulkanDeviceQueue::Destroy() { |
125 if (VK_NULL_HANDLE != vk_device_) { | 158 if (VK_NULL_HANDLE != vk_device_) { |
126 vkDestroyDevice(vk_device_, nullptr); | 159 vkDestroyDevice(vk_device_, nullptr); |
127 vk_device_ = VK_NULL_HANDLE; | 160 vk_device_ = VK_NULL_HANDLE; |
128 } | 161 } |
129 | 162 |
130 vk_queue_ = VK_NULL_HANDLE; | 163 vk_queue_ = VK_NULL_HANDLE; |
131 vk_queue_index_ = 0; | 164 vk_queue_index_ = 0; |
132 | 165 |
133 vk_physical_device_ = VK_NULL_HANDLE; | 166 vk_physical_device_ = VK_NULL_HANDLE; |
134 } | 167 } |
135 | 168 |
136 scoped_ptr<VulkanCommandPool> VulkanDeviceQueue::CreateCommandPool() { | 169 scoped_ptr<VulkanCommandPool> VulkanDeviceQueue::CreateCommandPool() { |
137 scoped_ptr<VulkanCommandPool> command_pool(new VulkanCommandPool(this)); | 170 scoped_ptr<VulkanCommandPool> command_pool(new VulkanCommandPool(this)); |
138 if (!command_pool->Initialize()) | 171 if (!command_pool->Initialize()) |
139 return nullptr; | 172 return nullptr; |
140 | 173 |
141 return command_pool; | 174 return command_pool; |
142 } | 175 } |
143 | 176 |
144 } // namespace gpu | 177 } // namespace gpu |
OLD | NEW |