Skip to content

Commit 69e737f

Browse files
tomnomgoogleukAndroid (Google) Code Review
authored andcommitted
Merge "Add tests for mutable swapchain code" into main
2 parents af9a9ce + 99e1daa commit 69e737f

1 file changed

Lines changed: 93 additions & 5 deletions

File tree

vulkan/tests/libvulkan_test.cpp

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

Comments
 (0)