Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(802)

Side by Side Diff: gpu/vulkan/vulkan_implementation.cc

Issue 1829163003: Added initial implementation of the Vulkan Context Provider. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@vk_surface_patch
Patch Set: Block off vulkan_cc with enable_vulkan (not relevant in future patch) Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gpu/vulkan/vulkan_implementation.h ('k') | gpu/vulkan/vulkan_render_pass.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_implementation.h" 5 #include "gpu/vulkan/vulkan_implementation.h"
6 6
7 #include <string>
8 #include <vector>
9 #include <vulkan/vulkan.h> 7 #include <vulkan/vulkan.h>
10 8
11 #include "base/logging.h" 9 #include "base/logging.h"
12 #include "base/macros.h" 10 #include "base/macros.h"
13 #include "gpu/vulkan/vulkan_command_pool.h"
14 11
15 #if defined(VK_USE_PLATFORM_XLIB_KHR) 12 #if defined(VK_USE_PLATFORM_XLIB_KHR)
16 #include "ui/gfx/x/x11_types.h" 13 #include "ui/gfx/x/x11_types.h"
17 #endif // defined(VK_USE_PLATFORM_XLIB_KHR) 14 #endif // defined(VK_USE_PLATFORM_XLIB_KHR)
18 15
19 namespace gpu { 16 namespace gpu {
20 17
21 struct VulkanInstance { 18 struct VulkanInstance {
22 VulkanInstance() {} 19 VulkanInstance() {}
23 20
24 void Initialize() { 21 void Initialize() { valid = InitializeVulkanInstance(); }
25 valid = InitializeVulkanInstance() && InitializeVulkanDevice();
26 }
27 22
28 bool InitializeVulkanInstance() { 23 bool InitializeVulkanInstance() {
29 VkResult status = VK_SUCCESS; 24 VkResult status = VK_SUCCESS;
30 25
31 VkApplicationInfo app_info = {}; 26 VkApplicationInfo app_info = {};
32 app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; 27 app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
33 app_info.pApplicationName = "Chromium"; 28 app_info.pApplicationName = "Chromium";
34 app_info.apiVersion = VK_MAKE_VERSION(1, 0, 2); 29 app_info.apiVersion = VK_MAKE_VERSION(1, 0, 2);
35 30
36 const char* instance_extensions[] = { 31 const char* instance_extensions[] = {
(...skipping 11 matching lines...) Expand all
48 instance_create_info.enabledExtensionCount = arraysize(instance_extensions); 43 instance_create_info.enabledExtensionCount = arraysize(instance_extensions);
49 44
50 status = vkCreateInstance(&instance_create_info, nullptr, &vk_instance); 45 status = vkCreateInstance(&instance_create_info, nullptr, &vk_instance);
51 DCHECK_EQ(VK_SUCCESS, status); 46 DCHECK_EQ(VK_SUCCESS, status);
52 if (VK_SUCCESS != status) 47 if (VK_SUCCESS != status)
53 return false; 48 return false;
54 49
55 return true; 50 return true;
56 } 51 }
57 52
58 bool InitializeVulkanDevice() {
59 VkResult status = VK_SUCCESS;
60
61 uint32_t device_count = 0;
62 status = vkEnumeratePhysicalDevices(vk_instance, &device_count, nullptr);
63 if (VK_SUCCESS != status || device_count == 0)
64 return false;
65
66 std::vector<VkPhysicalDevice> devices(device_count);
67 status =
68 vkEnumeratePhysicalDevices(vk_instance, &device_count, devices.data());
69 if (VK_SUCCESS != status) {
70 DLOG(ERROR) << "vkEnumeratePhysicalDevices() failed: " << status;
71 return false;
72 }
73
74 // TODO(dyen): Enable this once vkGetPhysicalDeviceXlibPresentationSupportKHR()
75 // is properly supported in the driver.
76 #if 0 && defined(VK_USE_PLATFORM_XLIB_KHR)
77 Display* xdisplay = gfx::GetXDisplay();
78 VisualID visual_id =
79 XVisualIDFromVisual(DefaultVisual(xdisplay, DefaultScreen(xdisplay)));
80 #endif // defined(VK_USE_PLATFORM_XLIB_KHR)
81
82 int device_index = -1;
83 int queue_index = -1;
84 for (size_t i = 0; i < devices.size(); ++i) {
85 const VkPhysicalDevice& device = devices[i];
86 uint32_t queue_count = 0;
87 vkGetPhysicalDeviceQueueFamilyProperties(device, &queue_count, nullptr);
88 if (queue_count) {
89 std::vector<VkQueueFamilyProperties> queue_properties(queue_count);
90 vkGetPhysicalDeviceQueueFamilyProperties(device, &queue_count,
91 queue_properties.data());
92 for (size_t n = 0; n < queue_properties.size(); ++n) {
93 if ((queue_properties[n].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0)
94 continue;
95
96 // TODO(dyen): Enable this once vkGetPhysicalDeviceXlibPresentationSupportKHR()
97 // is properly supported in the driver.
98 #if 1
99 #elif defined(VK_USE_PLATFORM_XLIB_KHR)
100 if (!vkGetPhysicalDeviceXlibPresentationSupportKHR(
101 device, n, xdisplay, visual_id)) {
102 continue;
103 }
104 #else
105 #error Non-Supported Vulkan implementation.
106 #endif
107
108 queue_index = static_cast<int>(n);
109 break;
110 }
111
112 if (-1 != queue_index) {
113 device_index = static_cast<int>(i);
114 break;
115 }
116 }
117 }
118
119 if (queue_index == -1)
120 return false;
121
122 vk_physical_device = devices[device_index];
123 vk_queue_index = queue_index;
124
125 float queue_priority = 0.0f;
126 VkDeviceQueueCreateInfo queue_create_info = {};
127 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
128 queue_create_info.queueFamilyIndex = queue_index;
129 queue_create_info.queueCount = 1;
130 queue_create_info.pQueuePriorities = &queue_priority;
131
132 const char* device_extensions[] = {VK_KHR_SWAPCHAIN_EXTENSION_NAME};
133
134 VkDeviceCreateInfo device_create_info = {};
135 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
136 device_create_info.queueCreateInfoCount = 1;
137 device_create_info.pQueueCreateInfos = &queue_create_info;
138 device_create_info.enabledExtensionCount = arraysize(device_extensions);
139 device_create_info.ppEnabledExtensionNames = device_extensions;
140
141 status = vkCreateDevice(vk_physical_device, &device_create_info, nullptr,
142 &vk_device);
143 if (VK_SUCCESS != status)
144 return false;
145
146 vkGetDeviceQueue(vk_device, queue_index, 0, &vk_queue);
147
148 return true;
149 }
150
151 bool valid = false; 53 bool valid = false;
152 VkInstance vk_instance; 54 VkInstance vk_instance = VK_NULL_HANDLE;
153 VkPhysicalDevice vk_physical_device;
154 VkDevice vk_device;
155 VkQueue vk_queue;
156 uint32_t vk_queue_index = 0;
157 }; 55 };
158 56
159 static VulkanInstance* vulkan_instance = nullptr; 57 static VulkanInstance* vulkan_instance = nullptr;
160 58
161 bool InitializeVulkan() { 59 bool InitializeVulkan() {
162 DCHECK(!vulkan_instance); 60 DCHECK(!vulkan_instance);
163 vulkan_instance = new VulkanInstance; 61 vulkan_instance = new VulkanInstance;
164 vulkan_instance->Initialize(); 62 vulkan_instance->Initialize();
165 return vulkan_instance->valid; 63 return vulkan_instance->valid;
166 } 64 }
167 65
168 VkInstance GetVulkanInstance() { 66 VkInstance GetVulkanInstance() {
169 DCHECK(vulkan_instance); 67 DCHECK(vulkan_instance);
170 DCHECK(vulkan_instance->valid); 68 DCHECK(vulkan_instance->valid);
171 return vulkan_instance->vk_instance; 69 return vulkan_instance->vk_instance;
172 } 70 }
173 71
174 VkPhysicalDevice GetVulkanPhysicalDevice() {
175 DCHECK(vulkan_instance);
176 DCHECK(vulkan_instance->valid);
177 return vulkan_instance->vk_physical_device;
178 }
179
180 VkDevice GetVulkanDevice() {
181 DCHECK(vulkan_instance);
182 DCHECK(vulkan_instance->valid);
183 return vulkan_instance->vk_device;
184 }
185
186 VkQueue GetVulkanQueue() {
187 DCHECK(vulkan_instance);
188 DCHECK(vulkan_instance->valid);
189 return vulkan_instance->vk_queue;
190 }
191
192 scoped_ptr<VulkanCommandPool> CreateCommandPool() {
193 DCHECK(vulkan_instance);
194 DCHECK(vulkan_instance->valid);
195
196 scoped_ptr<VulkanCommandPool> command_pool(new VulkanCommandPool(
197 vulkan_instance->vk_device, vulkan_instance->vk_queue_index));
198 if (!command_pool->Initialize())
199 return nullptr;
200
201 return command_pool;
202 }
203
204 } // namespace gpu 72 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/vulkan/vulkan_implementation.h ('k') | gpu/vulkan/vulkan_render_pass.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698