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;
}