Update FEATURE_VULKAN_HARDWARE_COMPUTE test

The definition of this feature is now final, reflect it in the test.

Test: bit CtsGraphicsTestCases:.VulkanFeaturesTest on a device with
      all combinations of:
      - system feature present / not present
      - maxDescriptorSetStorageBuffers of 4 and 24
Bug: 34745152

Change-Id: I38ccfd617a26ee3280c002ed22e25bdb332c7839
diff --git a/tests/tests/graphics/jni/android_graphics_cts_VulkanFeaturesTest.cpp b/tests/tests/graphics/jni/android_graphics_cts_VulkanFeaturesTest.cpp
index 17f4e60..7018a34 100644
--- a/tests/tests/graphics/jni/android_graphics_cts_VulkanFeaturesTest.cpp
+++ b/tests/tests/graphics/jni/android_graphics_cts_VulkanFeaturesTest.cpp
@@ -21,12 +21,6 @@
 #include <jni.h>
 #include <vkjson.h>
 
-// TODO(jessehall): Remove this once we update the NDK vulkan.h to a newer
-// version that defines this.
-#ifndef VK_API_VERSION_1_0
-#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)
-#endif
-
 #define ALOGI(msg, ...) \
     __android_log_print(ANDROID_LOG_INFO, LOG_TAG, (msg), __VA_ARGS__)
 #define ALOGE(msg, ...) \
@@ -34,9 +28,43 @@
 
 namespace {
 
+const char* kDesiredInstanceExtensions[] = {
+    "VK_KHR_get_physical_device_properties2",
+};
+
 VkResult getVkJSON(std::string& vkjson) {
     VkResult result;
 
+    uint32_t available_extensions_count = 0;
+    std::vector<VkExtensionProperties> available_extensions;
+    result = vkEnumerateInstanceExtensionProperties(nullptr /* layerName */,
+            &available_extensions_count, nullptr);
+    if (result != VK_SUCCESS) {
+        ALOGE("vkEnumerateInstanceExtensionProperties failed: %d", result);
+        return result;
+    }
+    do {
+        available_extensions.resize(available_extensions_count);
+        result = vkEnumerateInstanceExtensionProperties(nullptr /* layerName */,
+                &available_extensions_count, available_extensions.data());
+        if (result < 0) {
+            ALOGE("vkEnumerateInstanceExtensionProperties failed: %d", result);
+            return result;
+        }
+    } while (result == VK_INCOMPLETE);
+    available_extensions.resize(available_extensions_count);
+
+    std::vector<const char*> enable_extensions;
+    for (auto name : kDesiredInstanceExtensions) {
+        if (std::find_if(available_extensions.cbegin(), available_extensions.cend(),
+                [name](const VkExtensionProperties& properties) {
+                    return strcmp(name, properties.extensionName) == 0;
+                })
+                != available_extensions.cend()) {
+            enable_extensions.push_back(name);
+        }
+    }
+
     const VkApplicationInfo app_info = {
         VK_STRUCTURE_TYPE_APPLICATION_INFO, nullptr,
         "VulkanFeaturesTest", 0,    /* app name, version */
@@ -48,7 +76,8 @@
         0,              /* flags */
         &app_info,
         0, nullptr,     /* layers */
-        0, nullptr,     /* extensions */
+        static_cast<uint32_t>(enable_extensions.size()),
+        enable_extensions.data(),
     };
     VkInstance instance;
     result = vkCreateInstance(&instance_info, nullptr, &instance);
@@ -74,8 +103,9 @@
 
     vkjson.assign("[\n");
     for (size_t i = 0, n = gpus.size(); i < n; i++) {
-        auto props = VkJsonGetAllProperties(gpus[i]);
-        vkjson.append(VkJsonAllPropertiesToJson(props));
+        auto props = VkJsonGetDevice(instance, gpus[i],
+                instance_info.enabledExtensionCount, instance_info.ppEnabledExtensionNames);
+        vkjson.append(VkJsonDeviceToJson(props));
         if (i < n - 1)
             vkjson.append(",\n");
     }
diff --git a/tests/tests/graphics/src/android/graphics/cts/VulkanFeaturesTest.java b/tests/tests/graphics/src/android/graphics/cts/VulkanFeaturesTest.java
index 21e9086..e012d0e 100644
--- a/tests/tests/graphics/src/android/graphics/cts/VulkanFeaturesTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/VulkanFeaturesTest.java
@@ -171,7 +171,7 @@
         } else {
             assertEquals("System feature " + PackageManager.FEATURE_VULKAN_HARDWARE_COMPUTE +
                 " version " + mVulkanHardwareCompute.version +
-                " doesn't match best physical device hardware compute " + bestComputeLevel,
+                " doesn't match best physical device (version: " + bestComputeLevel + ")",
                 bestComputeLevel, mVulkanHardwareCompute.version);
         }
     }
@@ -221,19 +221,17 @@
     }
 
     private int determineHardwareCompute(JSONObject device) throws JSONException {
-        boolean have16bitStorage = false;
-        boolean haveVariablePointers = false;
-        JSONArray extensions = device.getJSONArray("extensions");
-        for (int i = 0; i < extensions.length(); i++) {
-            String name = extensions.getJSONObject(i).getString("extensionName");
-            if (name.equals("VK_KHR_16bit_storage"))
-                have16bitStorage = true;
-            else if (name.equals("VK_KHR_variable_pointers"))
-                haveVariablePointers = true;
+        JSONObject variablePointersFeatures = device.getJSONObject("variablePointersFeaturesKHR");
+        boolean variablePointers = variablePointersFeatures.getInt("variablePointers") != 0;
+        JSONObject limits = device.getJSONObject("properties").getJSONObject("limits");
+        int maxPerStageDescriptorStorageBuffers = limits.getInt("maxPerStageDescriptorStorageBuffers");
+        if (DEBUG) {
+            Log.d(TAG, device.getJSONObject("properties").getString("deviceName") +
+                ": variablePointers=" + variablePointers +
+                " maxPerStageDescriptorStorageBuffers=" + maxPerStageDescriptorStorageBuffers);
         }
-        if (!have16bitStorage || !haveVariablePointers) {
+        if (!variablePointers || maxPerStageDescriptorStorageBuffers < 16)
             return -1;
-        }
         return 0;
     }