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

Side by Side Diff: src/gpu/vk/GrVkBackendContext.cpp

Issue 1899213002: Revise WSI setup. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 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 | « include/gpu/vk/GrVkInterface.h ('k') | src/gpu/vk/GrVkGpu.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "vk/GrVkBackendContext.h" 8 #include "vk/GrVkBackendContext.h"
9 #include "vk/GrVkExtensions.h" 9 #include "vk/GrVkExtensions.h"
10 #include "vk/GrVkInterface.h" 10 #include "vk/GrVkInterface.h"
(...skipping 18 matching lines...) Expand all
29 //"VK_LAYER_LUNARG_api_dump", 29 //"VK_LAYER_LUNARG_api_dump",
30 //"VK_LAYER_LUNARG_vktrace", 30 //"VK_LAYER_LUNARG_vktrace",
31 //"VK_LAYER_LUNARG_screenshot", 31 //"VK_LAYER_LUNARG_screenshot",
32 }; 32 };
33 #endif 33 #endif
34 34
35 // the minimum version of Vulkan supported 35 // the minimum version of Vulkan supported
36 const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 3); 36 const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 3);
37 37
38 // Create the base Vulkan objects needed by the GrVkGpu object 38 // Create the base Vulkan objects needed by the GrVkGpu object
39 const GrVkBackendContext* GrVkBackendContext::Create() { 39 const GrVkBackendContext* GrVkBackendContext::Create(uint32_t* presentQueueIndex Ptr,
40 bool(*canPresent)(VkInstance, VkPhysicalDevice, uin t32_t queueIndex)) {
40 VkPhysicalDevice physDev; 41 VkPhysicalDevice physDev;
41 VkDevice device; 42 VkDevice device;
42 VkInstance inst; 43 VkInstance inst;
43 VkResult err; 44 VkResult err;
44 45
45 const VkApplicationInfo app_info = { 46 const VkApplicationInfo app_info = {
46 VK_STRUCTURE_TYPE_APPLICATION_INFO, // sType 47 VK_STRUCTURE_TYPE_APPLICATION_INFO, // sType
47 nullptr, // pNext 48 nullptr, // pNext
48 "vktest", // pApplicationName 49 "vktest", // pApplicationName
49 0, // applicationVersion 50 0, // applicationVersion
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, nullptr); 136 vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, nullptr);
136 SkASSERT(queueCount >= 1); 137 SkASSERT(queueCount >= 1);
137 138
138 SkAutoMalloc queuePropsAlloc(queueCount * sizeof(VkQueueFamilyProperties)); 139 SkAutoMalloc queuePropsAlloc(queueCount * sizeof(VkQueueFamilyProperties));
139 // now get the actual queue props 140 // now get the actual queue props
140 VkQueueFamilyProperties* queueProps = (VkQueueFamilyProperties*)queuePropsAl loc.get(); 141 VkQueueFamilyProperties* queueProps = (VkQueueFamilyProperties*)queuePropsAl loc.get();
141 142
142 vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, queueProps); 143 vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, queueProps);
143 144
144 // iterate to find the graphics queue 145 // iterate to find the graphics queue
145 uint32_t graphicsQueueIndex = -1; 146 uint32_t graphicsQueueIndex = queueCount;
146 for (uint32_t i = 0; i < queueCount; i++) { 147 for (uint32_t i = 0; i < queueCount; i++) {
147 if (queueProps[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { 148 if (graphicsQueueIndex == queueCount && queueProps[i].queueFlags & VK_QU EUE_GRAPHICS_BIT) {
egdaniel 2016/04/20 18:26:54 why is this needed in the if? Seems like the only
jvanverth1 2016/04/20 18:32:24 Good catch. This and the if below are from when bo
148 graphicsQueueIndex = i; 149 graphicsQueueIndex = i;
149 break; 150 break;
150 } 151 }
151 } 152 }
152 SkASSERT(graphicsQueueIndex < queueCount); 153 SkASSERT(graphicsQueueIndex < queueCount);
153 154
155 // iterate to find the present queue, if needed
156 uint32_t presentQueueIndex = graphicsQueueIndex;
157 if (presentQueueIndexPtr && canPresent) {
158 for (uint32_t i = 0; i < queueCount; i++) {
159 if (presentQueueIndex == queueCount && canPresent(inst, physDev, i)) {
egdaniel 2016/04/20 18:26:54 Assuming the assert above is true, presentQueueInd
160 presentQueueIndex = i;
161 break;
162 }
163 }
164 SkASSERT(presentQueueIndex < queueCount);
165 *presentQueueIndexPtr = presentQueueIndex;
166 }
167
154 extensions.initDevice(kGrVkMinimumVersion, inst, physDev); 168 extensions.initDevice(kGrVkMinimumVersion, inst, physDev);
155 169
156 SkTArray<const char*> deviceLayerNames; 170 SkTArray<const char*> deviceLayerNames;
157 SkTArray<const char*> deviceExtensionNames; 171 SkTArray<const char*> deviceExtensionNames;
158 #ifdef ENABLE_VK_LAYERS 172 #ifdef ENABLE_VK_LAYERS
159 for (size_t i = 0; i < SK_ARRAY_COUNT(kDebugLayerNames); ++i) { 173 for (size_t i = 0; i < SK_ARRAY_COUNT(kDebugLayerNames); ++i) {
160 if (extensions.hasDeviceLayer(kDebugLayerNames[i])) { 174 if (extensions.hasDeviceLayer(kDebugLayerNames[i])) {
161 deviceLayerNames.push_back(kDebugLayerNames[i]); 175 deviceLayerNames.push_back(kDebugLayerNames[i]);
162 } 176 }
163 } 177 }
(...skipping 21 matching lines...) Expand all
185 if (deviceFeatures.dualSrcBlend) { 199 if (deviceFeatures.dualSrcBlend) {
186 featureFlags |= kDualSrcBlend_GrVkFeatureFlag; 200 featureFlags |= kDualSrcBlend_GrVkFeatureFlag;
187 } 201 }
188 if (deviceFeatures.sampleRateShading) { 202 if (deviceFeatures.sampleRateShading) {
189 featureFlags |= kSampleRateShading_GrVkFeatureFlag; 203 featureFlags |= kSampleRateShading_GrVkFeatureFlag;
190 } 204 }
191 205
192 float queuePriorities[1] = { 0.0 }; 206 float queuePriorities[1] = { 0.0 };
193 // Here we assume no need for swapchain queue 207 // Here we assume no need for swapchain queue
194 // If one is needed, the client will need its own setup code 208 // If one is needed, the client will need its own setup code
195 const VkDeviceQueueCreateInfo queueInfo = { 209 const VkDeviceQueueCreateInfo queueInfo[2] = {
196 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType 210 {
197 nullptr, // pNext 211 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
198 0, // VkDeviceQueueCreateFlags 212 nullptr, // pNext
199 graphicsQueueIndex, // queueFamilyIndex 213 0, // VkDeviceQueueCreateFl ags
200 1, // queueCount 214 graphicsQueueIndex, // queueFamilyIndex
201 queuePriorities, // pQueuePriorities 215 1, // queueCount
216 queuePriorities, // pQueuePriorities
217 },
218 {
219 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
220 nullptr, // pNext
221 0, // VkDeviceQueueCreateFl ags
222 presentQueueIndex, // queueFamilyIndex
223 1, // queueCount
224 queuePriorities, // pQueuePriorities
225 }
202 }; 226 };
227 uint32_t queueInfoCount = (presentQueueIndex != graphicsQueueIndex) ? 2 : 1;
228
203 const VkDeviceCreateInfo deviceInfo = { 229 const VkDeviceCreateInfo deviceInfo = {
204 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType 230 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType
205 nullptr, // pNext 231 nullptr, // pNext
206 0, // VkDeviceCreateFlags 232 0, // VkDeviceCreateFlags
207 1, // queueCreateInfoCount 233 queueInfoCount, // queueCreateInfoCount
208 &queueInfo, // pQueueCreateInfos 234 queueInfo, // pQueueCreateInfos
209 (uint32_t) deviceLayerNames.count(), // layerCount 235 (uint32_t) deviceLayerNames.count(), // layerCount
210 deviceLayerNames.begin(), // ppEnabledLayerNames 236 deviceLayerNames.begin(), // ppEnabledLayerNames
211 (uint32_t) deviceExtensionNames.count(), // extensionCount 237 (uint32_t) deviceExtensionNames.count(), // extensionCount
212 deviceExtensionNames.begin(), // ppEnabledExtensionNames 238 deviceExtensionNames.begin(), // ppEnabledExtensionNames
213 &deviceFeatures // ppEnabledFeatures 239 &deviceFeatures // ppEnabledFeatures
214 }; 240 };
215 241
216 err = vkCreateDevice(physDev, &deviceInfo, nullptr, &device); 242 err = vkCreateDevice(physDev, &deviceInfo, nullptr, &device);
217 if (err) { 243 if (err) {
218 SkDebugf("CreateDevice failed: %d\n", err); 244 SkDebugf("CreateDevice failed: %d\n", err);
219 vkDestroyInstance(inst, nullptr); 245 vkDestroyInstance(inst, nullptr);
220 return nullptr; 246 return nullptr;
221 } 247 }
222 248
223 VkQueue queue; 249 VkQueue queue;
224 vkGetDeviceQueue(device, graphicsQueueIndex, 0, &queue); 250 vkGetDeviceQueue(device, graphicsQueueIndex, 0, &queue);
225 251
226 GrVkBackendContext* ctx = new GrVkBackendContext(); 252 GrVkBackendContext* ctx = new GrVkBackendContext();
227 ctx->fInstance = inst; 253 ctx->fInstance = inst;
228 ctx->fPhysicalDevice = physDev; 254 ctx->fPhysicalDevice = physDev;
229 ctx->fDevice = device; 255 ctx->fDevice = device;
230 ctx->fQueue = queue; 256 ctx->fQueue = queue;
231 ctx->fQueueFamilyIndex = graphicsQueueIndex; 257 ctx->fGraphicsQueueIndex = graphicsQueueIndex;
232 ctx->fMinAPIVersion = kGrVkMinimumVersion; 258 ctx->fMinAPIVersion = kGrVkMinimumVersion;
233 ctx->fExtensions = extensionFlags; 259 ctx->fExtensions = extensionFlags;
234 ctx->fFeatures = featureFlags; 260 ctx->fFeatures = featureFlags;
235 ctx->fInterface.reset(GrVkCreateInterface(inst, device, extensionFlags)); 261 ctx->fInterface.reset(GrVkCreateInterface(inst, device, extensionFlags));
236 262
237 return ctx; 263 return ctx;
238 } 264 }
239 265
240 GrVkBackendContext::~GrVkBackendContext() { 266 GrVkBackendContext::~GrVkBackendContext() {
241 vkDeviceWaitIdle(fDevice); 267 vkDeviceWaitIdle(fDevice);
242 vkDestroyDevice(fDevice, nullptr); 268 vkDestroyDevice(fDevice, nullptr);
243 fDevice = VK_NULL_HANDLE; 269 fDevice = VK_NULL_HANDLE;
244 vkDestroyInstance(fInstance, nullptr); 270 vkDestroyInstance(fInstance, nullptr);
245 fInstance = VK_NULL_HANDLE; 271 fInstance = VK_NULL_HANDLE;
246 } 272 }
OLDNEW
« no previous file with comments | « include/gpu/vk/GrVkInterface.h ('k') | src/gpu/vk/GrVkGpu.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698