From c5acacff672d8d8a3acd1ec63dcf41709d06246b Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Mon, 29 Jun 2020 11:06:27 -0700 Subject: [PATCH] Vulkan: add note about #1532. --- filament/backend/src/vulkan/VulkanContext.cpp | 15 ++++++++++++++- filament/backend/src/vulkan/VulkanContext.h | 2 +- filament/backend/src/vulkan/VulkanDriver.cpp | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/filament/backend/src/vulkan/VulkanContext.cpp b/filament/backend/src/vulkan/VulkanContext.cpp index 433e6025ae..4a01f3a6c1 100644 --- a/filament/backend/src/vulkan/VulkanContext.cpp +++ b/filament/backend/src/vulkan/VulkanContext.cpp @@ -155,7 +155,7 @@ void selectPhysicalDevice(VulkanContext& context) { PANIC_POSTCONDITION("Unable to find suitable device."); } -void createVirtualDevice(VulkanContext& context) { +void createLogicalDevice(VulkanContext& context) { VkDeviceQueueCreateInfo deviceQueueCreateInfo[1] = {}; const float queuePriority[] = {1.0f}; VkDeviceCreateInfo deviceCreateInfo = {}; @@ -279,7 +279,20 @@ void getPresentationQueue(VulkanContext& context, VulkanSurfaceContext& sc) { ASSERT_POSTCONDITION(presentQueueFamilyIndex != 0xffff, "This physical device does not support the presentation queue."); if (context.graphicsQueueFamilyIndex != presentQueueFamilyIndex) { + + // TODO: Strictly speaking, this code path is incorrect. However it is not triggered on any + // Android devices that we've tested with, nor with MoltenVK. + // + // This is incorrect because we created the logical device early on, before we had a handle + // to the rendering surface. Therefore the device was not created with the presentation + // queue family index included in VkDeviceQueueCreateInfo. + // + // This is non-trivial to fix because the driver API allows clients to do certain things + // (e.g. upload a vertex buffer) before the swap chain is created. + // + // https://github.com/google/filament/issues/1532 vkGetDeviceQueue(context.device, presentQueueFamilyIndex, 0, &sc.presentQueue); + } else { sc.presentQueue = context.graphicsQueue; } diff --git a/filament/backend/src/vulkan/VulkanContext.h b/filament/backend/src/vulkan/VulkanContext.h index 083ca82869..366e32218f 100644 --- a/filament/backend/src/vulkan/VulkanContext.h +++ b/filament/backend/src/vulkan/VulkanContext.h @@ -143,7 +143,7 @@ struct VulkanSurfaceContext { }; void selectPhysicalDevice(VulkanContext& context); -void createVirtualDevice(VulkanContext& context); +void createLogicalDevice(VulkanContext& context); void getPresentationQueue(VulkanContext& context, VulkanSurfaceContext& sc); void getSurfaceCaps(VulkanContext& context, VulkanSurfaceContext& sc); diff --git a/filament/backend/src/vulkan/VulkanDriver.cpp b/filament/backend/src/vulkan/VulkanDriver.cpp index 95fdca6df8..8314c855ea 100644 --- a/filament/backend/src/vulkan/VulkanDriver.cpp +++ b/filament/backend/src/vulkan/VulkanDriver.cpp @@ -158,7 +158,7 @@ VulkanDriver::VulkanDriver(VulkanPlatform* platform, selectPhysicalDevice(mContext); // Initialize device and graphicsQueue. - createVirtualDevice(mContext); + createLogicalDevice(mContext); mBinder.setDevice(mContext.device); // Choose a depth format that meets our requirements. Take care not to include stencil formats