CTS: check for AHB support if needed in the Vulkan tests

In Q, for devices using SwiftShader Vulkan, they are not required to
support AHB. So in the tests, we need to check if AHB is supported
before enabling the device extensions, since the real test against AHB
support is done in VulkanFeaturesTest.

Bug: 160163594
Test: BasicVulkanGpuTest
Test: CameraVulkanGpuTest
Test: MediaVulkanGpuTest

Change-Id: Ia93234072ba8894f63ce29e2c4c81eaf177833f5
diff --git a/tests/tests/graphics/jni/VulkanTestHelpers.cpp b/tests/tests/graphics/jni/VulkanTestHelpers.cpp
index 7092b86..b549b97 100644
--- a/tests/tests/graphics/jni/VulkanTestHelpers.cpp
+++ b/tests/tests/graphics/jni/VulkanTestHelpers.cpp
@@ -69,6 +69,29 @@
 
 } // namespace
 
+static bool enumerateDeviceExtensions(VkPhysicalDevice device,
+                                      std::vector<VkExtensionProperties>* extensions) {
+    VkResult result;
+
+    uint32_t count = 0;
+    result = vkEnumerateDeviceExtensionProperties(device, nullptr, &count, nullptr);
+    if (result != VK_SUCCESS) return false;
+
+    extensions->resize(count);
+    result = vkEnumerateDeviceExtensionProperties(device, nullptr, &count, extensions->data());
+    if (result != VK_SUCCESS) return false;
+
+    return true;
+}
+
+static bool hasExtension(const char* extension_name,
+                         const std::vector<VkExtensionProperties>& extensions) {
+    return std::find_if(extensions.cbegin(), extensions.cend(),
+                        [extension_name](const VkExtensionProperties& extension) {
+                            return strcmp(extension.extensionName, extension_name) == 0;
+                        }) != extensions.cend();
+}
+
 bool VkInit::init() {
   VkApplicationInfo appInfo = {
       .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
@@ -108,6 +131,12 @@
   ASSERT(status == VK_SUCCESS || status == VK_INCOMPLETE);
   ASSERT(gpuCount > 0);
 
+  std::vector<VkExtensionProperties> supportedDeviceExtensions;
+  ASSERT(enumerateDeviceExtensions(mGpu, &supportedDeviceExtensions));
+  for (const auto extension : deviceExt) {
+      ASSERT(hasExtension(extension, supportedDeviceExtensions));
+  }
+
   uint32_t queueFamilyCount = 0;
   vkGetPhysicalDeviceQueueFamilyProperties(mGpu, &queueFamilyCount, nullptr);
   ASSERT(queueFamilyCount != 0);