| OLD | NEW |
| 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 17 matching lines...) Expand all Loading... |
| 28 //"VK_LAYER_LUNARG_api_dump", | 28 //"VK_LAYER_LUNARG_api_dump", |
| 29 //"VK_LAYER_LUNARG_vktrace", | 29 //"VK_LAYER_LUNARG_vktrace", |
| 30 //"VK_LAYER_LUNARG_screenshot", | 30 //"VK_LAYER_LUNARG_screenshot", |
| 31 }; | 31 }; |
| 32 #endif | 32 #endif |
| 33 | 33 |
| 34 // the minimum version of Vulkan supported | 34 // the minimum version of Vulkan supported |
| 35 const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 8); | 35 const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 8); |
| 36 | 36 |
| 37 // Create the base Vulkan objects needed by the GrVkGpu object | 37 // Create the base Vulkan objects needed by the GrVkGpu object |
| 38 const GrVkBackendContext* GrVkBackendContext::Create() { | 38 const GrVkBackendContext* GrVkBackendContext::Create(uint32_t* presentQueueIndex
Ptr, |
| 39 bool(*canPresent)(VkInstance, VkPhysicalDevice, uin
t32_t queueIndex)) { |
| 39 VkPhysicalDevice physDev; | 40 VkPhysicalDevice physDev; |
| 40 VkDevice device; | 41 VkDevice device; |
| 41 VkInstance inst; | 42 VkInstance inst; |
| 42 VkResult err; | 43 VkResult err; |
| 43 | 44 |
| 44 const VkApplicationInfo app_info = { | 45 const VkApplicationInfo app_info = { |
| 45 VK_STRUCTURE_TYPE_APPLICATION_INFO, // sType | 46 VK_STRUCTURE_TYPE_APPLICATION_INFO, // sType |
| 46 nullptr, // pNext | 47 nullptr, // pNext |
| 47 "vktest", // pApplicationName | 48 "vktest", // pApplicationName |
| 48 0, // applicationVersion | 49 0, // applicationVersion |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, nullptr); | 135 vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, nullptr); |
| 135 SkASSERT(queueCount >= 1); | 136 SkASSERT(queueCount >= 1); |
| 136 | 137 |
| 137 SkAutoMalloc queuePropsAlloc(queueCount * sizeof(VkQueueFamilyProperties)); | 138 SkAutoMalloc queuePropsAlloc(queueCount * sizeof(VkQueueFamilyProperties)); |
| 138 // now get the actual queue props | 139 // now get the actual queue props |
| 139 VkQueueFamilyProperties* queueProps = (VkQueueFamilyProperties*)queuePropsAl
loc.get(); | 140 VkQueueFamilyProperties* queueProps = (VkQueueFamilyProperties*)queuePropsAl
loc.get(); |
| 140 | 141 |
| 141 vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, queueProps); | 142 vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, queueProps); |
| 142 | 143 |
| 143 // iterate to find the graphics queue | 144 // iterate to find the graphics queue |
| 144 uint32_t graphicsQueueIndex = -1; | 145 uint32_t graphicsQueueIndex = queueCount; |
| 145 for (uint32_t i = 0; i < queueCount; i++) { | 146 for (uint32_t i = 0; i < queueCount; i++) { |
| 146 if (queueProps[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { | 147 if (queueProps[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { |
| 147 graphicsQueueIndex = i; | 148 graphicsQueueIndex = i; |
| 148 break; | 149 break; |
| 149 } | 150 } |
| 150 } | 151 } |
| 151 SkASSERT(graphicsQueueIndex < queueCount); | 152 SkASSERT(graphicsQueueIndex < queueCount); |
| 152 | 153 |
| 154 // iterate to find the present queue, if needed |
| 155 uint32_t presentQueueIndex = graphicsQueueIndex; |
| 156 if (presentQueueIndexPtr && canPresent) { |
| 157 for (uint32_t i = 0; i < queueCount; i++) { |
| 158 if (canPresent(inst, physDev, i)) { |
| 159 presentQueueIndex = i; |
| 160 break; |
| 161 } |
| 162 } |
| 163 SkASSERT(presentQueueIndex < queueCount); |
| 164 *presentQueueIndexPtr = presentQueueIndex; |
| 165 } |
| 166 |
| 153 extensions.initDevice(kGrVkMinimumVersion, inst, physDev); | 167 extensions.initDevice(kGrVkMinimumVersion, inst, physDev); |
| 154 | 168 |
| 155 SkTArray<const char*> deviceLayerNames; | 169 SkTArray<const char*> deviceLayerNames; |
| 156 SkTArray<const char*> deviceExtensionNames; | 170 SkTArray<const char*> deviceExtensionNames; |
| 157 #ifdef ENABLE_VK_LAYERS | 171 #ifdef ENABLE_VK_LAYERS |
| 158 for (size_t i = 0; i < SK_ARRAY_COUNT(kDebugLayerNames); ++i) { | 172 for (size_t i = 0; i < SK_ARRAY_COUNT(kDebugLayerNames); ++i) { |
| 159 if (extensions.hasDeviceLayer(kDebugLayerNames[i])) { | 173 if (extensions.hasDeviceLayer(kDebugLayerNames[i])) { |
| 160 deviceLayerNames.push_back(kDebugLayerNames[i]); | 174 deviceLayerNames.push_back(kDebugLayerNames[i]); |
| 161 } | 175 } |
| 162 } | 176 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 184 if (deviceFeatures.dualSrcBlend) { | 198 if (deviceFeatures.dualSrcBlend) { |
| 185 featureFlags |= kDualSrcBlend_GrVkFeatureFlag; | 199 featureFlags |= kDualSrcBlend_GrVkFeatureFlag; |
| 186 } | 200 } |
| 187 if (deviceFeatures.sampleRateShading) { | 201 if (deviceFeatures.sampleRateShading) { |
| 188 featureFlags |= kSampleRateShading_GrVkFeatureFlag; | 202 featureFlags |= kSampleRateShading_GrVkFeatureFlag; |
| 189 } | 203 } |
| 190 | 204 |
| 191 float queuePriorities[1] = { 0.0 }; | 205 float queuePriorities[1] = { 0.0 }; |
| 192 // Here we assume no need for swapchain queue | 206 // Here we assume no need for swapchain queue |
| 193 // If one is needed, the client will need its own setup code | 207 // If one is needed, the client will need its own setup code |
| 194 const VkDeviceQueueCreateInfo queueInfo = { | 208 const VkDeviceQueueCreateInfo queueInfo[2] = { |
| 195 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType | 209 { |
| 196 nullptr, // pNext | 210 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType |
| 197 0, // VkDeviceQueueCreateFlags | 211 nullptr, // pNext |
| 198 graphicsQueueIndex, // queueFamilyIndex | 212 0, // VkDeviceQueueCreateFl
ags |
| 199 1, // queueCount | 213 graphicsQueueIndex, // queueFamilyIndex |
| 200 queuePriorities, // pQueuePriorities | 214 1, // queueCount |
| 215 queuePriorities, // pQueuePriorities |
| 216 }, |
| 217 { |
| 218 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType |
| 219 nullptr, // pNext |
| 220 0, // VkDeviceQueueCreateFl
ags |
| 221 presentQueueIndex, // queueFamilyIndex |
| 222 1, // queueCount |
| 223 queuePriorities, // pQueuePriorities |
| 224 } |
| 201 }; | 225 }; |
| 226 uint32_t queueInfoCount = (presentQueueIndex != graphicsQueueIndex) ? 2 : 1; |
| 227 |
| 202 const VkDeviceCreateInfo deviceInfo = { | 228 const VkDeviceCreateInfo deviceInfo = { |
| 203 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType | 229 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType |
| 204 nullptr, // pNext | 230 nullptr, // pNext |
| 205 0, // VkDeviceCreateFlags | 231 0, // VkDeviceCreateFlags |
| 206 1, // queueCreateInfoCount | 232 queueInfoCount, // queueCreateInfoCount |
| 207 &queueInfo, // pQueueCreateInfos | 233 queueInfo, // pQueueCreateInfos |
| 208 (uint32_t) deviceLayerNames.count(), // layerCount | 234 (uint32_t) deviceLayerNames.count(), // layerCount |
| 209 deviceLayerNames.begin(), // ppEnabledLayerNames | 235 deviceLayerNames.begin(), // ppEnabledLayerNames |
| 210 (uint32_t) deviceExtensionNames.count(), // extensionCount | 236 (uint32_t) deviceExtensionNames.count(), // extensionCount |
| 211 deviceExtensionNames.begin(), // ppEnabledExtensionNames | 237 deviceExtensionNames.begin(), // ppEnabledExtensionNames |
| 212 &deviceFeatures // ppEnabledFeatures | 238 &deviceFeatures // ppEnabledFeatures |
| 213 }; | 239 }; |
| 214 | 240 |
| 215 err = vkCreateDevice(physDev, &deviceInfo, nullptr, &device); | 241 err = vkCreateDevice(physDev, &deviceInfo, nullptr, &device); |
| 216 if (err) { | 242 if (err) { |
| 217 SkDebugf("CreateDevice failed: %d\n", err); | 243 SkDebugf("CreateDevice failed: %d\n", err); |
| 218 vkDestroyInstance(inst, nullptr); | 244 vkDestroyInstance(inst, nullptr); |
| 219 return nullptr; | 245 return nullptr; |
| 220 } | 246 } |
| 221 | 247 |
| 222 VkQueue queue; | 248 VkQueue queue; |
| 223 vkGetDeviceQueue(device, graphicsQueueIndex, 0, &queue); | 249 vkGetDeviceQueue(device, graphicsQueueIndex, 0, &queue); |
| 224 | 250 |
| 225 GrVkBackendContext* ctx = new GrVkBackendContext(); | 251 GrVkBackendContext* ctx = new GrVkBackendContext(); |
| 226 ctx->fInstance = inst; | 252 ctx->fInstance = inst; |
| 227 ctx->fPhysicalDevice = physDev; | 253 ctx->fPhysicalDevice = physDev; |
| 228 ctx->fDevice = device; | 254 ctx->fDevice = device; |
| 229 ctx->fQueue = queue; | 255 ctx->fQueue = queue; |
| 230 ctx->fQueueFamilyIndex = graphicsQueueIndex; | 256 ctx->fGraphicsQueueIndex = graphicsQueueIndex; |
| 231 ctx->fMinAPIVersion = kGrVkMinimumVersion; | 257 ctx->fMinAPIVersion = kGrVkMinimumVersion; |
| 232 ctx->fExtensions = extensionFlags; | 258 ctx->fExtensions = extensionFlags; |
| 233 ctx->fFeatures = featureFlags; | 259 ctx->fFeatures = featureFlags; |
| 234 ctx->fInterface.reset(GrVkCreateInterface(inst, device, extensionFlags)); | 260 ctx->fInterface.reset(GrVkCreateInterface(inst, device, extensionFlags)); |
| 235 | 261 |
| 236 return ctx; | 262 return ctx; |
| 237 } | 263 } |
| 238 | 264 |
| 239 GrVkBackendContext::~GrVkBackendContext() { | 265 GrVkBackendContext::~GrVkBackendContext() { |
| 240 vkDeviceWaitIdle(fDevice); | 266 vkDeviceWaitIdle(fDevice); |
| 241 vkDestroyDevice(fDevice, nullptr); | 267 vkDestroyDevice(fDevice, nullptr); |
| 242 fDevice = VK_NULL_HANDLE; | 268 fDevice = VK_NULL_HANDLE; |
| 243 vkDestroyInstance(fInstance, nullptr); | 269 vkDestroyInstance(fInstance, nullptr); |
| 244 fInstance = VK_NULL_HANDLE; | 270 fInstance = VK_NULL_HANDLE; |
| 245 } | 271 } |
| OLD | NEW |