Index: src/gpu/vk/GrVkBackendContext.cpp |
diff --git a/src/gpu/vk/GrVkBackendContext.cpp b/src/gpu/vk/GrVkBackendContext.cpp |
index 30e76692683287045276f1827e5e86904c126bd1..3d3e9830f8aa978417f514860899e2438b317e01 100644 |
--- a/src/gpu/vk/GrVkBackendContext.cpp |
+++ b/src/gpu/vk/GrVkBackendContext.cpp |
@@ -35,7 +35,8 @@ const char* kDebugLayerNames[] = { |
const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 8); |
// Create the base Vulkan objects needed by the GrVkGpu object |
-const GrVkBackendContext* GrVkBackendContext::Create() { |
+const GrVkBackendContext* GrVkBackendContext::Create(uint32_t* presentQueueIndexPtr, |
+ bool(*canPresent)(VkInstance, VkPhysicalDevice, uint32_t queueIndex)) { |
VkPhysicalDevice physDev; |
VkDevice device; |
VkInstance inst; |
@@ -141,7 +142,7 @@ const GrVkBackendContext* GrVkBackendContext::Create() { |
vkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, queueProps); |
// iterate to find the graphics queue |
- uint32_t graphicsQueueIndex = -1; |
+ uint32_t graphicsQueueIndex = queueCount; |
for (uint32_t i = 0; i < queueCount; i++) { |
if (queueProps[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { |
graphicsQueueIndex = i; |
@@ -150,6 +151,19 @@ const GrVkBackendContext* GrVkBackendContext::Create() { |
} |
SkASSERT(graphicsQueueIndex < queueCount); |
+ // iterate to find the present queue, if needed |
+ uint32_t presentQueueIndex = graphicsQueueIndex; |
+ if (presentQueueIndexPtr && canPresent) { |
+ for (uint32_t i = 0; i < queueCount; i++) { |
+ if (canPresent(inst, physDev, i)) { |
+ presentQueueIndex = i; |
+ break; |
+ } |
+ } |
+ SkASSERT(presentQueueIndex < queueCount); |
+ *presentQueueIndexPtr = presentQueueIndex; |
+ } |
+ |
extensions.initDevice(kGrVkMinimumVersion, inst, physDev); |
SkTArray<const char*> deviceLayerNames; |
@@ -191,20 +205,32 @@ const GrVkBackendContext* GrVkBackendContext::Create() { |
float queuePriorities[1] = { 0.0 }; |
// Here we assume no need for swapchain queue |
// If one is needed, the client will need its own setup code |
- const VkDeviceQueueCreateInfo queueInfo = { |
- VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType |
- nullptr, // pNext |
- 0, // VkDeviceQueueCreateFlags |
- graphicsQueueIndex, // queueFamilyIndex |
- 1, // queueCount |
- queuePriorities, // pQueuePriorities |
+ const VkDeviceQueueCreateInfo queueInfo[2] = { |
+ { |
+ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType |
+ nullptr, // pNext |
+ 0, // VkDeviceQueueCreateFlags |
+ graphicsQueueIndex, // queueFamilyIndex |
+ 1, // queueCount |
+ queuePriorities, // pQueuePriorities |
+ }, |
+ { |
+ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType |
+ nullptr, // pNext |
+ 0, // VkDeviceQueueCreateFlags |
+ presentQueueIndex, // queueFamilyIndex |
+ 1, // queueCount |
+ queuePriorities, // pQueuePriorities |
+ } |
}; |
+ uint32_t queueInfoCount = (presentQueueIndex != graphicsQueueIndex) ? 2 : 1; |
+ |
const VkDeviceCreateInfo deviceInfo = { |
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType |
nullptr, // pNext |
0, // VkDeviceCreateFlags |
- 1, // queueCreateInfoCount |
- &queueInfo, // pQueueCreateInfos |
+ queueInfoCount, // queueCreateInfoCount |
+ queueInfo, // pQueueCreateInfos |
(uint32_t) deviceLayerNames.count(), // layerCount |
deviceLayerNames.begin(), // ppEnabledLayerNames |
(uint32_t) deviceExtensionNames.count(), // extensionCount |
@@ -227,7 +253,7 @@ const GrVkBackendContext* GrVkBackendContext::Create() { |
ctx->fPhysicalDevice = physDev; |
ctx->fDevice = device; |
ctx->fQueue = queue; |
- ctx->fQueueFamilyIndex = graphicsQueueIndex; |
+ ctx->fGraphicsQueueIndex = graphicsQueueIndex; |
ctx->fMinAPIVersion = kGrVkMinimumVersion; |
ctx->fExtensions = extensionFlags; |
ctx->fFeatures = featureFlags; |