@@ -58,6 +58,7 @@ class AImageReaderVulkanSwapchainTest : public ::testing::Test {
5858 const char * extensions[] = {
5959 VK_KHR_SURFACE_EXTENSION_NAME,
6060 VK_KHR_ANDROID_SURFACE_EXTENSION_NAME,
61+ VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME,
6162 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
6263 };
6364
@@ -436,6 +437,83 @@ TEST_F(AImageReaderVulkanSwapchainTest, getProducerUsageFallbackTest1) {
436437
437438} // namespace
438439
440+ // Passing state in these tests requires global state. Wrap each test in an
441+ // anonymous namespace to prevent conflicting names.
442+ namespace {
443+
444+ static bool g_returnNotSupportedOnce = true ;
445+
446+ VKAPI_ATTR VkResult VKAPI_CALL
447+ Hook_GetPhysicalDeviceImageFormatProperties2_NotSupportedOnce (
448+ VkPhysicalDevice /* physicalDevice*/ ,
449+ const VkPhysicalDeviceImageFormatInfo2* /* pImageFormatInfo*/ ,
450+ VkImageFormatProperties2* /* pImageFormatProperties*/ ) {
451+ if (g_returnNotSupportedOnce) {
452+ g_returnNotSupportedOnce = false ;
453+ return VK_ERROR_FORMAT_NOT_SUPPORTED;
454+ }
455+ return VK_SUCCESS;
456+ }
457+
458+ TEST_F (AImageReaderVulkanSwapchainTest, SurfaceFormats2KHR_IgnoreNotSupported) {
459+ // BUG: 357903074
460+ // Verify that vkGetPhysicalDeviceSurfaceFormats2KHR properly
461+ // ignores VK_ERROR_FORMAT_NOT_SUPPORTED and continues enumerating formats.
462+ std::vector<const char *> instanceLayers;
463+ createVulkanInstance (instanceLayers);
464+ createAImageReader (640 , 480 , AIMAGE_FORMAT_PRIVATE, 3 );
465+ getANativeWindowFromReader ();
466+ createVulkanSurface ();
467+ pickPhysicalDeviceAndQueueFamily ();
468+
469+ auto & pdevDispatchTable = vulkan::driver::GetData (mPhysicalDev ).driver ;
470+ pdevDispatchTable.GetPhysicalDeviceImageFormatProperties2 =
471+ Hook_GetPhysicalDeviceImageFormatProperties2_NotSupportedOnce;
472+
473+ PFN_vkGetPhysicalDeviceSurfaceFormats2KHR
474+ pfnGetPhysicalDeviceSurfaceFormats2KHR =
475+ reinterpret_cast <PFN_vkGetPhysicalDeviceSurfaceFormats2KHR>(
476+ vkGetInstanceProcAddr (mVkInstance ,
477+ " vkGetPhysicalDeviceSurfaceFormats2KHR" ));
478+ ASSERT_NE (nullptr , pfnGetPhysicalDeviceSurfaceFormats2KHR)
479+ << " Could not get pointer to vkGetPhysicalDeviceSurfaceFormats2KHR" ;
480+
481+ VkPhysicalDeviceSurfaceInfo2KHR surfaceInfo2{};
482+ surfaceInfo2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR;
483+ surfaceInfo2.pNext = nullptr ;
484+ surfaceInfo2.surface = mSurface ;
485+
486+ uint32_t formatCount = 0 ;
487+ VkResult res = pfnGetPhysicalDeviceSurfaceFormats2KHR (
488+ mPhysicalDev , &surfaceInfo2, &formatCount, nullptr );
489+
490+ // If the loader never tries a second format, it might fail or 0-out the
491+ // formatCount. The patch ensures it continues to the next format rather
492+ // than bailing out on the first NOT_SUPPORTED.
493+ ASSERT_EQ (VK_SUCCESS, res)
494+ << " vkGetPhysicalDeviceSurfaceFormats2KHR failed unexpectedly" ;
495+ ASSERT_GT (formatCount, 0U )
496+ << " No surface formats found; the loader may have bailed early." ;
497+
498+ std::vector<VkSurfaceFormat2KHR> formats (formatCount);
499+ for (auto & f : formats) {
500+ f.sType = VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR;
501+ f.pNext = nullptr ;
502+ }
503+ res = pfnGetPhysicalDeviceSurfaceFormats2KHR (mPhysicalDev , &surfaceInfo2,
504+ &formatCount, formats.data ());
505+ ASSERT_EQ (VK_SUCCESS, res) << " Failed to retrieve surface formats" ;
506+
507+ LOGI (
508+ " SurfaceFormats2KHR_IgnoreNotSupported test: found %u formats after "
509+ " ignoring NOT_SUPPORTED" ,
510+ formatCount);
511+
512+ cleanUpSwapchainForTest ();
513+ }
514+
515+ } // namespace
516+
439517} // namespace libvulkantest
440518
441519} // namespace android
0 commit comments