Skip to content

Commit 53a2448

Browse files
test: Fix WSI for Android
1 parent ec661fb commit 53a2448

5 files changed

Lines changed: 85 additions & 15 deletions

File tree

tests/framework/render.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,14 @@ void VkRenderFramework::SupportMultiSwapchain() {
10291029
#endif // VK_USE_PLATFORM_ANDROID_KHR
10301030
}
10311031

1032+
void VkRenderFramework::SupportDeferredSwapchainAllocation() {
1033+
#ifdef VK_USE_PLATFORM_ANDROID_KHR
1034+
// The Android loader accepts VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_KHR and returns a valid swapchain,
1035+
// but vkAcquireNextImageKHR then calls a null driver entry point and crashes inside libvulkan.so
1036+
GTEST_SKIP() << "Android currently doesn't support deferred swapchain memory allocation";
1037+
#endif // VK_USE_PLATFORM_ANDROID_KHR
1038+
}
1039+
10321040
void VkRenderFramework::SupportSurfaceResize() {
10331041
if (!SurfaceContext::CanResize()) {
10341042
GTEST_SKIP() << "VVL test framework does not support surface resizing on the current platform";

tests/framework/render.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class VkRenderFramework : public VkTestFramework {
117117

118118
// Swapchain capabilities declaration to be used with RETURN_IF_SKIP
119119
void SupportMultiSwapchain();
120+
void SupportDeferredSwapchainAllocation();
120121
void SupportSurfaceResize();
121122

122123
void SetPresentImageLayout(VkImage image);

tests/unit/device_queue.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,11 @@ TEST_F(NegativeDeviceQueue, NoQueues) {
508508
}
509509

510510
TEST_F(NegativeDeviceQueue, DeviceCreateEnabledLayerNamesPointer) {
511+
#ifdef VK_USE_PLATFORM_ANDROID_KHR
512+
// The Android loader reads ppEnabledLayerNames while building the layer chain, so it faults inside
513+
// vulkan::api::CreateDevice before any layer gets a chance to report this
514+
GTEST_SKIP() << "Android loader Bug";
515+
#endif // VK_USE_PLATFORM_ANDROID_KHR
511516
SetTargetApiVersion(VK_API_VERSION_1_2);
512517
RETURN_IF_SKIP(InitFramework());
513518

tests/unit/wsi.cpp

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,6 +2205,23 @@ TEST_F(NegativeWsi, SwapchainMaintenance1NonCompatiblePresentMode) {
22052205
m_errorMonitor->VerifyFound();
22062206
}
22072207

2208+
// Helper for VkSurfacePresentScalingCapabilitiesKHR
2209+
static VkFlags PickSupportedScalingCaps(VkFlags supported, uint32_t needed, VkFlags fallback) {
2210+
if (supported == 0) {
2211+
return fallback;
2212+
}
2213+
VkFlags picked = 0;
2214+
uint32_t found = 0;
2215+
for (uint32_t i = 0; i < 32 && found < needed; i++) {
2216+
const VkFlags bit = 1u << i;
2217+
if (supported & bit) {
2218+
picked |= bit;
2219+
found++;
2220+
}
2221+
}
2222+
return (found == needed) ? picked : 0;
2223+
}
2224+
22082225
TEST_F(NegativeWsi, SwapchainMaintenance1WrongPresentScaling) {
22092226
SetTargetApiVersion(VK_API_VERSION_1_1);
22102227
AddRequiredExtensions(VK_KHR_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME);
@@ -2221,8 +2238,15 @@ TEST_F(NegativeWsi, SwapchainMaintenance1WrongPresentScaling) {
22212238
GTEST_SKIP() << "Present scaling not supported";
22222239
}
22232240

2241+
const VkPresentScalingFlagsKHR scaling_behavior =
2242+
PickSupportedScalingCaps(scaling_caps.supportedPresentScaling, 2,
2243+
VK_PRESENT_SCALING_ONE_TO_ONE_BIT_KHR | VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_KHR);
2244+
if (scaling_behavior == 0) {
2245+
GTEST_SKIP() << "Need 2 supported present scaling modes";
2246+
}
2247+
22242248
VkSwapchainPresentScalingCreateInfoKHR present_scaling_info = vku::InitStructHelper();
2225-
present_scaling_info.scalingBehavior = VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT | VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT;
2249+
present_scaling_info.scalingBehavior = scaling_behavior;
22262250
present_scaling_info.presentGravityX = 0;
22272251
present_scaling_info.presentGravityY = 0;
22282252

@@ -2250,35 +2274,50 @@ TEST_F(NegativeWsi, SwapchainMaintenance1WrongPresentGravity) {
22502274
GTEST_SKIP() << "Present scaling not supported";
22512275
}
22522276

2277+
const VkPresentScalingFlagsKHR scaling_behavior =
2278+
PickSupportedScalingCaps(scaling_caps.supportedPresentScaling, 1, VK_PRESENT_SCALING_ONE_TO_ONE_BIT_KHR);
2279+
const VkPresentGravityFlagsKHR gravity_x =
2280+
PickSupportedScalingCaps(scaling_caps.supportedPresentGravityX, 1, VK_PRESENT_GRAVITY_MIN_BIT_KHR);
2281+
const VkPresentGravityFlagsKHR gravity_y =
2282+
PickSupportedScalingCaps(scaling_caps.supportedPresentGravityY, 1, VK_PRESENT_GRAVITY_MIN_BIT_KHR);
2283+
const VkPresentGravityFlagsKHR gravity_x2 = PickSupportedScalingCaps(
2284+
scaling_caps.supportedPresentGravityX, 2, VK_PRESENT_GRAVITY_MIN_BIT_KHR | VK_PRESENT_GRAVITY_MAX_BIT_KHR);
2285+
const VkPresentGravityFlagsKHR gravity_y2 = PickSupportedScalingCaps(
2286+
scaling_caps.supportedPresentGravityY, 2, VK_PRESENT_GRAVITY_MIN_BIT_KHR | VK_PRESENT_GRAVITY_MAX_BIT_KHR);
2287+
22532288
VkSwapchainPresentScalingCreateInfoKHR present_scaling_info = vku::InitStructHelper();
2254-
present_scaling_info.scalingBehavior = VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT;
2289+
present_scaling_info.scalingBehavior = scaling_behavior;
22552290

22562291
VkSwapchainCreateInfoKHR swapchain_ci = GetDefaultSwapchainCreateInfo(m_surface, swapchain_info);
22572292
swapchain_ci.pNext = &present_scaling_info;
22582293

22592294
m_errorMonitor->SetDesiredError("VUID-VkSwapchainPresentScalingCreateInfoKHR-presentGravityX-07765");
22602295
present_scaling_info.presentGravityX = 0;
2261-
present_scaling_info.presentGravityY = VK_PRESENT_GRAVITY_MIN_BIT_EXT;
2296+
present_scaling_info.presentGravityY = gravity_y;
22622297
m_swapchain.Init(*m_device, swapchain_ci);
22632298
m_errorMonitor->VerifyFound();
22642299

22652300
m_errorMonitor->SetDesiredError("VUID-VkSwapchainPresentScalingCreateInfoKHR-presentGravityX-07766");
2266-
present_scaling_info.presentGravityX = VK_PRESENT_GRAVITY_MIN_BIT_EXT;
2301+
present_scaling_info.presentGravityX = gravity_x;
22672302
present_scaling_info.presentGravityY = 0;
22682303
m_swapchain.Init(*m_device, swapchain_ci);
22692304
m_errorMonitor->VerifyFound();
22702305

2271-
m_errorMonitor->SetDesiredError("VUID-VkSwapchainPresentScalingCreateInfoKHR-presentGravityX-07768");
2272-
present_scaling_info.presentGravityX = VK_PRESENT_GRAVITY_MIN_BIT_EXT | VK_PRESENT_GRAVITY_MAX_BIT_EXT;
2273-
present_scaling_info.presentGravityY = VK_PRESENT_GRAVITY_MIN_BIT_EXT;
2274-
m_swapchain.Init(*m_device, swapchain_ci);
2275-
m_errorMonitor->VerifyFound();
2306+
if (gravity_x2 != 0) {
2307+
m_errorMonitor->SetDesiredError("VUID-VkSwapchainPresentScalingCreateInfoKHR-presentGravityX-07768");
2308+
present_scaling_info.presentGravityX = gravity_x2;
2309+
present_scaling_info.presentGravityY = gravity_y;
2310+
m_swapchain.Init(*m_device, swapchain_ci);
2311+
m_errorMonitor->VerifyFound();
2312+
}
22762313

2277-
m_errorMonitor->SetDesiredError("VUID-VkSwapchainPresentScalingCreateInfoKHR-presentGravityY-07769");
2278-
present_scaling_info.presentGravityX = VK_PRESENT_GRAVITY_MIN_BIT_EXT;
2279-
present_scaling_info.presentGravityY = VK_PRESENT_GRAVITY_MIN_BIT_EXT | VK_PRESENT_GRAVITY_MAX_BIT_EXT;
2280-
m_swapchain.Init(*m_device, swapchain_ci);
2281-
m_errorMonitor->VerifyFound();
2314+
if (gravity_y2 != 0) {
2315+
m_errorMonitor->SetDesiredError("VUID-VkSwapchainPresentScalingCreateInfoKHR-presentGravityY-07769");
2316+
present_scaling_info.presentGravityX = gravity_x;
2317+
present_scaling_info.presentGravityY = gravity_y2;
2318+
m_swapchain.Init(*m_device, swapchain_ci);
2319+
m_errorMonitor->VerifyFound();
2320+
}
22822321
}
22832322

22842323
TEST_F(NegativeWsi, SwapchainMaintenance1UnsupportedScaling) {
@@ -2748,6 +2787,7 @@ TEST_F(NegativeWsi, SwapchainMaintenance1ExtensionRelease) {
27482787
AddRequiredExtensions(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME);
27492788
AddRequiredExtensions(VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME);
27502789
AddSurfaceExtension();
2790+
RETURN_IF_SKIP(SupportDeferredSwapchainAllocation());
27512791
AddRequiredFeature(vkt::Feature::swapchainMaintenance1);
27522792
RETURN_IF_SKIP(Init());
27532793
if (IsPlatformMockICD()) {
@@ -5548,15 +5588,29 @@ TEST_F(NegativeWsi, PresentTimingsInvalidPresentMode) {
55485588

55495589
VkSwapchainTimeDomainPropertiesEXT time_domain_props = vku::InitStructHelper();
55505590
vk::GetSwapchainTimeDomainPropertiesEXT(device(), swapchain, &time_domain_props, nullptr);
5591+
if (time_domain_props.timeDomainCount == 0) {
5592+
GTEST_SKIP() << "No time domains reported for the swapchain";
5593+
}
55515594
std::vector<VkTimeDomainKHR> time_domains(time_domain_props.timeDomainCount);
55525595
std::vector<uint64_t> time_domain_ids(time_domain_props.timeDomainCount);
55535596
time_domain_props.pTimeDomains = time_domains.data();
55545597
time_domain_props.pTimeDomainIds = time_domain_ids.data();
55555598
vk::GetSwapchainTimeDomainPropertiesEXT(device(), swapchain, &time_domain_props, nullptr);
55565599

5600+
uint32_t domain_index = 0;
5601+
for (uint32_t i = 0; i < time_domain_props.timeDomainCount; i++) {
5602+
if (time_domains[i] != VK_TIME_DOMAIN_PRESENT_STAGE_LOCAL_EXT) {
5603+
domain_index = i;
5604+
break;
5605+
}
5606+
}
5607+
55575608
VkPresentTimingInfoEXT present_timing_info = vku::InitStructHelper();
55585609
present_timing_info.targetTime = 1u;
5559-
present_timing_info.timeDomainId = time_domain_ids[0];
5610+
present_timing_info.timeDomainId = time_domain_ids[domain_index];
5611+
if (time_domains[domain_index] == VK_TIME_DOMAIN_PRESENT_STAGE_LOCAL_EXT) {
5612+
present_timing_info.targetTimeDomainPresentStage = VK_PRESENT_STAGE_QUEUE_OPERATIONS_END_BIT_EXT;
5613+
}
55605614

55615615
VkPresentTimingsInfoEXT present_timings_info = vku::InitStructHelper();
55625616
present_timings_info.swapchainCount = 1u;

tests/unit/wsi_positive.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1448,6 +1448,7 @@ TEST_F(PositiveWsi, QueueWaitsForPresentFence) {
14481448
TEST_F(PositiveWsi, QueueWaitsForPresentFence2) {
14491449
TEST_DESCRIPTION("QueueWaitIdle waits for present fence");
14501450
AddSurfaceExtension();
1451+
RETURN_IF_SKIP(SupportMultiSwapchain());
14511452
AddRequiredExtensions(VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME);
14521453
AddRequiredExtensions(VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME);
14531454
AddRequiredFeature(vkt::Feature::swapchainMaintenance1);
@@ -1497,6 +1498,7 @@ TEST_F(PositiveWsi, PresentFenceRetiresPresentSemaphores) {
14971498
// https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/8578
14981499
TEST_DESCRIPTION("Delete present wait semaphore after waiting on present fence");
14991500
AddSurfaceExtension();
1501+
RETURN_IF_SKIP(SupportMultiSwapchain());
15001502
AddRequiredExtensions(VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME);
15011503
AddRequiredExtensions(VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME);
15021504
AddRequiredFeature(vkt::Feature::swapchainMaintenance1);

0 commit comments

Comments
 (0)