diff options
author | Kaiyi Li <kaiyili@google.com> | 2021-09-28 16:13:40 -0700 |
---|---|---|
committer | Kaiyi Li <kaiyili@google.com> | 2021-10-15 16:48:31 -0700 |
commit | 6330fc1cf425e7ccaf17e09b0318b8b9c4128c95 (patch) | |
tree | ed22db450c7537e107b0edf7f2f1ce02676d83ec | |
parent | c701d665f86df07594730be795e1c7a5032c5ed8 (diff) | |
download | vulkan-cereal-6330fc1cf425e7ccaf17e09b0318b8b9c4128c95.tar.gz |
Always use FIFO present mode
Calling DisplayVk::compose or DisplayVk::post too frequently with the
mail box present mode may cause a device lost in a later
vkQueueWaitIdle, which will break the DisplayVkTest.PostTwoColorBuffers
unit test.
Also fix the bug in the CompositorVk unit test.
Bug: 199812178
Test: run the unit test
Change-Id: If82a5d87c760c62ff3aeac80c13a2643b2e0c61b
-rw-r--r-- | stream-servers/SwapChainStateVk.cpp | 14 | ||||
-rw-r--r-- | stream-servers/tests/CompositorVk_unittest.cpp | 8 | ||||
-rw-r--r-- | stream-servers/tests/DisplayVk_unittest.cpp | 6 |
3 files changed, 14 insertions, 14 deletions
diff --git a/stream-servers/SwapChainStateVk.cpp b/stream-servers/SwapChainStateVk.cpp index 89431717..4e8e1dc3 100644 --- a/stream-servers/SwapChainStateVk.cpp +++ b/stream-servers/SwapChainStateVk.cpp @@ -107,14 +107,12 @@ SwapChainStateVk::VkSwapchainCreateInfoKHRPtr SwapChainStateVk::createSwapChainC uint32_t presentModeCount = 0; VK_CHECK(vk.vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, nullptr)); - std::vector<VkPresentModeKHR> presentModes(presentModeCount); + std::vector<VkPresentModeKHR> presentModes_(presentModeCount); VK_CHECK(vk.vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, - &presentModeCount, presentModes.data())); - auto iPresentMode = std::find_if(presentModes.begin(), presentModes.end(), - [](const VkPresentModeKHR &presentMode) { - return presentMode == VK_PRESENT_MODE_IMMEDIATE_KHR; - }); - if (iPresentMode == presentModes.end()) { + &presentModeCount, presentModes_.data())); + std::unordered_set<VkPresentModeKHR> presentModes(presentModes_.begin(), presentModes_.end()); + VkPresentModeKHR presentMode = VK_PRESENT_MODE_FIFO_KHR; + if (!presentModes.count(VK_PRESENT_MODE_FIFO_KHR)) { SWAPCHAINSTATE_VK_ERROR("Fail to create swapchain: immediate present mode not supported."); return nullptr; } @@ -152,7 +150,7 @@ SwapChainStateVk::VkSwapchainCreateInfoKHRPtr SwapChainStateVk::createSwapChainC .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, .preTransform = surfaceCaps.currentTransform, .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, - .presentMode = *iPresentMode, + .presentMode = presentMode, .clipped = VK_TRUE, .oldSwapchain = VK_NULL_HANDLE}, [](VkSwapchainCreateInfoKHR *p) { diff --git a/stream-servers/tests/CompositorVk_unittest.cpp b/stream-servers/tests/CompositorVk_unittest.cpp index 125571b1..6bd89f26 100644 --- a/stream-servers/tests/CompositorVk_unittest.cpp +++ b/stream-servers/tests/CompositorVk_unittest.cpp @@ -217,7 +217,9 @@ TEST_F(CompositorVkTest, ValidatePhysicalDeviceFeatures) { ASSERT_FALSE(CompositorVk::validatePhysicalDeviceFeatures(features)); VkPhysicalDeviceDescriptorIndexingFeaturesEXT descIndexingFeatures = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - .pNext = &descIndexingFeatures}; + .pNext = nullptr}; + descIndexingFeatures.descriptorBindingSampledImageUpdateAfterBind = VK_FALSE; + features.pNext = &descIndexingFeatures; ASSERT_FALSE(CompositorVk::validatePhysicalDeviceFeatures(features)); descIndexingFeatures.descriptorBindingSampledImageUpdateAfterBind = VK_TRUE; ASSERT_TRUE(CompositorVk::validatePhysicalDeviceFeatures(features)); @@ -235,8 +237,8 @@ TEST_F(CompositorVkTest, EnablePhysicalDeviceFeatures) { VkPhysicalDeviceFeatures2 features = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2}; ASSERT_FALSE(CompositorVk::enablePhysicalDeviceFeatures(features)); VkPhysicalDeviceDescriptorIndexingFeaturesEXT descIndexingFeatures = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, - .pNext = &descIndexingFeatures}; + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT}; + features.pNext = &descIndexingFeatures; ASSERT_TRUE(CompositorVk::enablePhysicalDeviceFeatures(features)); ASSERT_EQ(descIndexingFeatures.descriptorBindingSampledImageUpdateAfterBind, VK_TRUE); } diff --git a/stream-servers/tests/DisplayVk_unittest.cpp b/stream-servers/tests/DisplayVk_unittest.cpp index b6d81f44..f0308790 100644 --- a/stream-servers/tests/DisplayVk_unittest.cpp +++ b/stream-servers/tests/DisplayVk_unittest.cpp @@ -209,7 +209,7 @@ TEST_F(DisplayVkTest, PostWithoutSurfaceShouldntCrash) { ASSERT_TRUE(texture->write(pixels)); auto cbvk = displayVk.createDisplayBuffer(texture->m_vkImage, RenderTexture::k_vkFormat, textureWidth, textureHeight); - displayVk.post(cbvk); + ASSERT_TRUE(std::get<0>(displayVk.post(cbvk))); } TEST_F(DisplayVkTest, SimplePost) { @@ -256,7 +256,7 @@ TEST_F(DisplayVkTest, PostTwoColorBuffers) { m_displayVk->createDisplayBuffer(greenTexture->m_vkImage, greenTexture->k_vkFormat, greenTexture->m_width, greenTexture->m_height); for (uint32_t i = 0; i < 10; i++) { - m_displayVk->post(redCbvk); - m_displayVk->post(greenCbvk); + ASSERT_TRUE(std::get<0>(m_displayVk->post(redCbvk))); + ASSERT_TRUE(std::get<0>(m_displayVk->post(greenCbvk))); } } |