Revise WSI setup.
- Set up present queue creation correctly.
- Move WSI functions to VulkanTestContext.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1899213002
Review URL: https://codereview.chromium.org/1899213002
diff --git a/src/gpu/vk/GrVkBackendContext.cpp b/src/gpu/vk/GrVkBackendContext.cpp
index 30e7669..3d3e983 100644
--- a/src/gpu/vk/GrVkBackendContext.cpp
+++ b/src/gpu/vk/GrVkBackendContext.cpp
@@ -35,7 +35,8 @@
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 @@
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 @@
}
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 @@
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 @@
ctx->fPhysicalDevice = physDev;
ctx->fDevice = device;
ctx->fQueue = queue;
- ctx->fQueueFamilyIndex = graphicsQueueIndex;
+ ctx->fGraphicsQueueIndex = graphicsQueueIndex;
ctx->fMinAPIVersion = kGrVkMinimumVersion;
ctx->fExtensions = extensionFlags;
ctx->fFeatures = featureFlags;
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 040912e..eebb589 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -120,7 +120,7 @@
VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType
nullptr, // pNext
VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // CmdPoolCreateFlags
- backendCtx->fQueueFamilyIndex, // queueFamilyIndex
+ backendCtx->fGraphicsQueueIndex, // queueFamilyIndex
};
GR_VK_CALL_ERRCHECK(this->vkInterface(), CreateCommandPool(fDevice, &cmdPoolInfo, nullptr,
&fCmdPool));
diff --git a/src/gpu/vk/GrVkInterface.cpp b/src/gpu/vk/GrVkInterface.cpp
index 37e3570..17b254e 100644
--- a/src/gpu/vk/GrVkInterface.cpp
+++ b/src/gpu/vk/GrVkInterface.cpp
@@ -157,45 +157,6 @@
GET_DEV_PROC(CmdNextSubpass);
GET_DEV_PROC(CmdEndRenderPass);
GET_DEV_PROC(CmdExecuteCommands);
- if (extensionFlags & kKHR_surface_GrVkExtensionFlag) {
- GET_PROC(DestroySurfaceKHR);
- GET_PROC(GetPhysicalDeviceSurfaceSupportKHR);
- GET_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
- GET_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
- GET_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
- }
- if (extensionFlags & kKHR_surface_GrVkExtensionFlag) {
- GET_DEV_PROC(CreateSwapchainKHR);
- GET_DEV_PROC(DestroySwapchainKHR);
- GET_DEV_PROC(GetSwapchainImagesKHR);
- GET_DEV_PROC(AcquireNextImageKHR);
- GET_DEV_PROC(QueuePresentKHR);
- }
-#if defined(VK_USE_PLATFORM_WIN32_KHR)
- if (extensionFlags & kKHR_win32_surface_GrVkExtensionFlag) {
- GET_PROC(CreateWin32SurfaceKHR);
- GET_PROC(GetPhysicalDeviceWin32PresentationSupportKHR);
- }
-#elif defined(VK_USE_PLATFORM_ANDROID_KHR)
- if (extensionFlags & kKHR_android_surface_GrVkExtensionFlag) {
- GET_PROC(CreateAndroidSurfaceKHR);
- }
-#elif defined(VK_USE_PLATFORM_XLIB_KHR)
- if (extensionFlags & kKHR_xlib_surface_GrVkExtensionFlag) {
- GET_PROC(CreateXlibSurfaceKHR);
- GET_PROC(GetPhysicalDeviceXlibPresentationSupportKHR);
- }
-#endif
-
- // We probably don't care about these, they're for consoles
- //GET_PROC(GetPhysicalDeviceDisplayPropertiesKHR);
- //GET_PROC(GetPhysicalDeviceDisplayPlanePropertiesKHR);
- //GET_PROC(GetDisplayPlaneSupportedDisplaysKHR);
- //GET_PROC(GetDisplayModePropertiesKHR);
- //GET_PROC(CreateDisplayModeKHR);
- //GET_PROC(GetDisplayPlaneCapabilitiesKHR);
- //GET_PROC(CreateDisplayPlaneSurfaceKHR);
- //GET_DEV_PROC(CreateSharedSwapchainsKHR);
if (extensionFlags & kEXT_debug_report_GrVkExtensionFlag) {
GET_PROC(CreateDebugReportCallbackEXT);
@@ -347,24 +308,6 @@
NULL == fFunctions.fCmdNextSubpass ||
NULL == fFunctions.fCmdEndRenderPass ||
NULL == fFunctions.fCmdExecuteCommands ||
- NULL == fFunctions.fDestroySurfaceKHR ||
- NULL == fFunctions.fGetPhysicalDeviceSurfaceSupportKHR ||
- NULL == fFunctions.fGetPhysicalDeviceSurfaceCapabilitiesKHR ||
- NULL == fFunctions.fGetPhysicalDeviceSurfaceFormatsKHR ||
- NULL == fFunctions.fGetPhysicalDeviceSurfacePresentModesKHR ||
- NULL == fFunctions.fCreateSwapchainKHR ||
- NULL == fFunctions.fDestroySwapchainKHR ||
- NULL == fFunctions.fGetSwapchainImagesKHR ||
- NULL == fFunctions.fAcquireNextImageKHR ||
- NULL == fFunctions.fQueuePresentKHR ||
- //NULL == fFunctions.fGetPhysicalDeviceDisplayPropertiesKHR ||
- //NULL == fFunctions.fGetPhysicalDeviceDisplayPlanePropertiesKHR ||
- //NULL == fFunctions.fGetDisplayPlaneSupportedDisplaysKHR ||
- //NULL == fFunctions.fGetDisplayModePropertiesKHR ||
- //NULL == fFunctions.fCreateDisplayModeKHR ||
- //NULL == fFunctions.fGetDisplayPlaneCapabilitiesKHR ||
- //NULL == fFunctions.fCreateDisplayPlaneSurfaceKHR ||
- //NULL == fFunctions.fCreateSharedSwapchainsKHR ||
NULL == fFunctions.fCreateDebugReportCallbackEXT ||
NULL == fFunctions.fDebugReportMessageEXT ||
NULL == fFunctions.fDestroyDebugReportCallbackEXT) {
diff --git a/src/gpu/vk/GrVkMemory.cpp b/src/gpu/vk/GrVkMemory.cpp
index 30a3806..c9663ed 100644
--- a/src/gpu/vk/GrVkMemory.cpp
+++ b/src/gpu/vk/GrVkMemory.cpp
@@ -68,7 +68,6 @@
VkMemoryRequirements memReqs;
GR_VK_CALL(iface, GetBufferMemoryRequirements(device, buffer, &memReqs));
-
if (!alloc_device_memory(gpu, &memReqs, flags, memory)) {
return false;
}