Skip to content

Commit 1e2ed23

Browse files
Verify that vkGetPhysicalDeviceSurfaceFormats2KHR ignores VK_ERROR_FORMAT_NOT_SUPPORTED
Verify that vkGetPhysicalDeviceSurfaceFormats2KHR properly ignores VK_ERROR_FORMAT_NOT_SUPPORTED and continues enumerating formats. Bug: 357903074 Test: atest libvulkan_test Flag: EXEMPT test Change-Id: If9195373dfabcaf7fd29151071bf2fc9a4827cee
1 parent 4a90260 commit 1e2ed23

1 file changed

Lines changed: 78 additions & 0 deletions

File tree

vulkan/tests/libvulkan_test.cpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)