summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tom Murphy <tomnom@google.com> 2025-02-17 22:46:33 +0000
committer Tom Murphy <tomnom@google.com> 2025-02-25 03:27:43 -0800
commit1e2ed23f152fef32ec366b96f002033ecb080851 (patch)
treef5cc75c8a6dfe8303254b2dd17579925782d3133
parent4a902602e9a8c8ab7c4a054f60676f5b38afd1ea (diff)
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
-rw-r--r--vulkan/tests/libvulkan_test.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/vulkan/tests/libvulkan_test.cpp b/vulkan/tests/libvulkan_test.cpp
index 7c9ef7d095..a4f5d34618 100644
--- a/vulkan/tests/libvulkan_test.cpp
+++ b/vulkan/tests/libvulkan_test.cpp
@@ -58,6 +58,7 @@ class AImageReaderVulkanSwapchainTest : public ::testing::Test {
const char* extensions[] = {
VK_KHR_SURFACE_EXTENSION_NAME,
VK_KHR_ANDROID_SURFACE_EXTENSION_NAME,
+ VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME,
VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
};
@@ -436,6 +437,83 @@ TEST_F(AImageReaderVulkanSwapchainTest, getProducerUsageFallbackTest1) {
} // namespace
+// Passing state in these tests requires global state. Wrap each test in an
+// anonymous namespace to prevent conflicting names.
+namespace {
+
+static bool g_returnNotSupportedOnce = true;
+
+VKAPI_ATTR VkResult VKAPI_CALL
+Hook_GetPhysicalDeviceImageFormatProperties2_NotSupportedOnce(
+ VkPhysicalDevice /*physicalDevice*/,
+ const VkPhysicalDeviceImageFormatInfo2* /*pImageFormatInfo*/,
+ VkImageFormatProperties2* /*pImageFormatProperties*/) {
+ if (g_returnNotSupportedOnce) {
+ g_returnNotSupportedOnce = false;
+ return VK_ERROR_FORMAT_NOT_SUPPORTED;
+ }
+ return VK_SUCCESS;
+}
+
+TEST_F(AImageReaderVulkanSwapchainTest, SurfaceFormats2KHR_IgnoreNotSupported) {
+ // BUG: 357903074
+ // Verify that vkGetPhysicalDeviceSurfaceFormats2KHR properly
+ // ignores VK_ERROR_FORMAT_NOT_SUPPORTED and continues enumerating formats.
+ std::vector<const char*> instanceLayers;
+ createVulkanInstance(instanceLayers);
+ createAImageReader(640, 480, AIMAGE_FORMAT_PRIVATE, 3);
+ getANativeWindowFromReader();
+ createVulkanSurface();
+ pickPhysicalDeviceAndQueueFamily();
+
+ auto& pdevDispatchTable = vulkan::driver::GetData(mPhysicalDev).driver;
+ pdevDispatchTable.GetPhysicalDeviceImageFormatProperties2 =
+ Hook_GetPhysicalDeviceImageFormatProperties2_NotSupportedOnce;
+
+ PFN_vkGetPhysicalDeviceSurfaceFormats2KHR
+ pfnGetPhysicalDeviceSurfaceFormats2KHR =
+ reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceFormats2KHR>(
+ vkGetInstanceProcAddr(mVkInstance,
+ "vkGetPhysicalDeviceSurfaceFormats2KHR"));
+ ASSERT_NE(nullptr, pfnGetPhysicalDeviceSurfaceFormats2KHR)
+ << "Could not get pointer to vkGetPhysicalDeviceSurfaceFormats2KHR";
+
+ VkPhysicalDeviceSurfaceInfo2KHR surfaceInfo2{};
+ surfaceInfo2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR;
+ surfaceInfo2.pNext = nullptr;
+ surfaceInfo2.surface = mSurface;
+
+ uint32_t formatCount = 0;
+ VkResult res = pfnGetPhysicalDeviceSurfaceFormats2KHR(
+ mPhysicalDev, &surfaceInfo2, &formatCount, nullptr);
+
+ // If the loader never tries a second format, it might fail or 0-out the
+ // formatCount. The patch ensures it continues to the next format rather
+ // than bailing out on the first NOT_SUPPORTED.
+ ASSERT_EQ(VK_SUCCESS, res)
+ << "vkGetPhysicalDeviceSurfaceFormats2KHR failed unexpectedly";
+ ASSERT_GT(formatCount, 0U)
+ << "No surface formats found; the loader may have bailed early.";
+
+ std::vector<VkSurfaceFormat2KHR> formats(formatCount);
+ for (auto& f : formats) {
+ f.sType = VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR;
+ f.pNext = nullptr;
+ }
+ res = pfnGetPhysicalDeviceSurfaceFormats2KHR(mPhysicalDev, &surfaceInfo2,
+ &formatCount, formats.data());
+ ASSERT_EQ(VK_SUCCESS, res) << "Failed to retrieve surface formats";
+
+ LOGI(
+ "SurfaceFormats2KHR_IgnoreNotSupported test: found %u formats after "
+ "ignoring NOT_SUPPORTED",
+ formatCount);
+
+ cleanUpSwapchainForTest();
+}
+
+} // namespace
+
} // namespace libvulkantest
} // namespace android