summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaiyi Li <kaiyili@google.com>2021-09-28 16:13:40 -0700
committerKaiyi Li <kaiyili@google.com>2021-10-15 16:48:31 -0700
commit6330fc1cf425e7ccaf17e09b0318b8b9c4128c95 (patch)
treeed22db450c7537e107b0edf7f2f1ce02676d83ec
parentc701d665f86df07594730be795e1c7a5032c5ed8 (diff)
downloadvulkan-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.cpp14
-rw-r--r--stream-servers/tests/CompositorVk_unittest.cpp8
-rw-r--r--stream-servers/tests/DisplayVk_unittest.cpp6
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)));
}
}