@@ -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+
22082225TEST_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
22842323TEST_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 ;
0 commit comments