@@ -165,7 +165,8 @@ class AImageReaderVulkanSwapchainTest : public ::testing::Test {
165165 << " No physical device found that supports present to the surface!" ;
166166 }
167167
168- void createDeviceAndGetQueue (std::vector<const char *>& layers) {
168+ void createDeviceAndGetQueue (std::vector<const char *>& layers,
169+ std::vector<const char *> inExtensions = {}) {
169170 ASSERT_NE ((void *)VK_NULL_HANDLE, mPhysicalDev );
170171 ASSERT_NE (UINT32_MAX, mPresentQueueFamily );
171172
@@ -183,12 +184,14 @@ class AImageReaderVulkanSwapchainTest : public ::testing::Test {
183184 deviceInfo.enabledLayerCount = layers.size ();
184185 deviceInfo.ppEnabledLayerNames = layers.data ();
185186
186- const char * extensions[] = {
187+ std::vector< const char *> extensions = {
187188 VK_KHR_SWAPCHAIN_EXTENSION_NAME,
188189 };
189- deviceInfo.enabledExtensionCount =
190- sizeof (extensions) / sizeof (extensions[0 ]);
191- deviceInfo.ppEnabledExtensionNames = extensions;
190+ for (auto extension : inExtensions) {
191+ extensions.push_back (extension);
192+ }
193+ deviceInfo.enabledExtensionCount = extensions.size ();
194+ deviceInfo.ppEnabledExtensionNames = extensions.data ();
192195
193196 VkResult res =
194197 vkCreateDevice (mPhysicalDev , &deviceInfo, nullptr , &mDevice );
@@ -514,6 +517,91 @@ TEST_F(AImageReaderVulkanSwapchainTest, SurfaceFormats2KHR_IgnoreNotSupported) {
514517
515518} // namespace
516519
520+ namespace {
521+
522+ TEST_F (AImageReaderVulkanSwapchainTest, MutableFormatSwapchainTest) {
523+ // Test swapchain with mutable format extension
524+ std::vector<const char *> instanceLayers;
525+ std::vector<const char *> deviceLayers;
526+ std::vector<const char *> deviceExtensions = {
527+ VK_KHR_SWAPCHAIN_EXTENSION_NAME,
528+ VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME,
529+ VK_KHR_MAINTENANCE2_EXTENSION_NAME,
530+ VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME};
531+
532+ createVulkanInstance (instanceLayers);
533+ createAImageReader (640 , 480 , AIMAGE_FORMAT_PRIVATE, 3 );
534+ getANativeWindowFromReader ();
535+ createVulkanSurface ();
536+ pickPhysicalDeviceAndQueueFamily ();
537+ createDeviceAndGetQueue (deviceLayers, deviceExtensions);
538+
539+ ASSERT_NE ((VkDevice)VK_NULL_HANDLE, mDevice );
540+ ASSERT_NE ((VkSurfaceKHR)VK_NULL_HANDLE, mSurface );
541+
542+ VkSurfaceCapabilitiesKHR surfaceCaps{};
543+ VK_CHECK (vkGetPhysicalDeviceSurfaceCapabilitiesKHR (mPhysicalDev , mSurface ,
544+ &surfaceCaps));
545+
546+ uint32_t formatCount = 0 ;
547+ vkGetPhysicalDeviceSurfaceFormatsKHR (mPhysicalDev , mSurface , &formatCount,
548+ nullptr );
549+ ASSERT_GT (formatCount, 0U );
550+ std::vector<VkSurfaceFormatKHR> formats (formatCount);
551+ vkGetPhysicalDeviceSurfaceFormatsKHR (mPhysicalDev , mSurface , &formatCount,
552+ formats.data ());
553+
554+ VkFormat viewFormats[2 ] = {formats[0 ].format , formats[0 ].format };
555+ if (formatCount > 1 ) {
556+ viewFormats[1 ] = formats[1 ].format ;
557+ }
558+
559+ VkImageFormatListCreateInfoKHR formatList{};
560+ formatList.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
561+ formatList.viewFormatCount = 2 ;
562+ formatList.pViewFormats = viewFormats;
563+
564+ VkSwapchainCreateInfoKHR swapchainInfo{};
565+ swapchainInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
566+ swapchainInfo.pNext = &formatList;
567+ swapchainInfo.surface = mSurface ;
568+ swapchainInfo.minImageCount = surfaceCaps.minImageCount + 1 ;
569+ swapchainInfo.imageFormat = formats[0 ].format ;
570+ swapchainInfo.imageColorSpace = formats[0 ].colorSpace ;
571+ swapchainInfo.imageExtent = surfaceCaps.currentExtent ;
572+ swapchainInfo.imageArrayLayers = 1 ;
573+ swapchainInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
574+ swapchainInfo.preTransform = surfaceCaps.currentTransform ;
575+ swapchainInfo.compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
576+ swapchainInfo.presentMode = VK_PRESENT_MODE_FIFO_KHR;
577+ swapchainInfo.clipped = VK_TRUE;
578+
579+ swapchainInfo.flags = VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR;
580+
581+ uint32_t queueFamilyIndices[] = {mPresentQueueFamily };
582+ swapchainInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
583+ swapchainInfo.queueFamilyIndexCount = 1 ;
584+ swapchainInfo.pQueueFamilyIndices = queueFamilyIndices;
585+
586+ VkResult res =
587+ vkCreateSwapchainKHR (mDevice , &swapchainInfo, nullptr , &mSwapchain );
588+ if (res == VK_SUCCESS) {
589+ LOGI (" Mutable format swapchain created successfully" );
590+
591+ uint32_t imageCount = 0 ;
592+ vkGetSwapchainImagesKHR (mDevice , mSwapchain , &imageCount, nullptr );
593+ ASSERT_GT (imageCount, 0U );
594+ } else {
595+ LOGI (
596+ " Mutable format swapchain creation failed (extension may not be "
597+ " supported)" );
598+ }
599+
600+ cleanUpSwapchainForTest ();
601+ }
602+
603+ } // namespace
604+
517605} // namespace libvulkantest
518606
519607} // namespace android
0 commit comments