/* * Copyright 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #define LOG_TAG "vkprofiles" #ifndef VK_USE_PLATFORM_ANDROID_KHR #define VK_USE_PLATFORM_ANDROID_KHR #endif #include #include #include #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) #define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #include "generated/vulkan_profiles.h" #include "vkprofiles.h" namespace android::vkprofiles { /* Wrap vkProfileGetSupport in an anonymous namespace. * vkProfileGetSupport only works for profiles that we explicitly add, we don't * want a user of this library to mistakenly call with a profile that we haven't * added. */ namespace { std::string vkProfileGetSupport(const VpProfileProperties* pProfile, const uint32_t minApiVersion) { VkResult result = VK_SUCCESS; VkBool32 supported = VK_FALSE; result = vpGetInstanceProfileSupport(nullptr, pProfile, &supported); if (result != VK_SUCCESS) { std::string error( "There was a failure from vpGetInstanceProfileSupport," " check `vkprofiles` in logcat." " result = " + std::to_string(result)); return error; } if (supported != VK_TRUE) { std::string error( "There was a failure from vpGetInstanceProfileSupport," " check `vkprofiles` in logcat." " supported = " + std::to_string(supported)); return error; } const VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO, nullptr, "vkprofiles", 0, "", 0, minApiVersion, }; VkInstanceCreateInfo instanceCreateInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, nullptr, 0, &appInfo, 0, nullptr, 0, nullptr, }; VpInstanceCreateInfo vpInstanceCreateInfo{}; vpInstanceCreateInfo.pCreateInfo = &instanceCreateInfo; vpInstanceCreateInfo.enabledFullProfileCount = 1; vpInstanceCreateInfo.pEnabledFullProfiles = pProfile; VkInstance instance = VK_NULL_HANDLE; result = vpCreateInstance(&vpInstanceCreateInfo, nullptr, &instance); if (result != VK_SUCCESS) { std::string error( "There was a failure from vpCreateInstance," " check `vkprofiles` in logcat." " result = " + std::to_string(result)); return error; } uint32_t count; result = vkEnumeratePhysicalDevices(instance, &count, nullptr); if (result != VK_SUCCESS) { vkDestroyInstance(instance, nullptr); std::string error( "There was a failure from vkEnumeratePhysicalDevices," " check `vkprofiles` in logcat." " result = " + std::to_string(result)); return error; } std::vector devices(count, VK_NULL_HANDLE); result = vkEnumeratePhysicalDevices(instance, &count, devices.data()); if (result != VK_SUCCESS) { vkDestroyInstance(instance, nullptr); std::string error( "There was a failure from vkEnumeratePhysicalDevices (2)," " check `vkprofiles` in logcat." " result = " + std::to_string(result)); return error; } bool onePhysicalDeviceSupports = false; for (size_t i = 0; i < count; i++) { result = vpGetPhysicalDeviceProfileSupport(instance, devices[i], pProfile, &supported); if (result != VK_SUCCESS) { ALOGD("vpGetPhysicalDeviceProfileSupport fail, result = %d", result); continue; } else if (supported != VK_TRUE) { ALOGD("vpGetPhysicalDeviceProfileSupport fail, supported = %d", supported); continue; } onePhysicalDeviceSupports = true; } if (!onePhysicalDeviceSupports) { std::string error( "There was a failure from vpGetPhysicalDeviceProfileSupport," " check `vkprofiles` in logcat." " No VkPhysicalDevice supports the profile"); return error; } return std::string("SUPPORTED"); } } // anonymous namespace std::string vkAbp2021GetSupport() { VpProfileProperties profile{VP_ANDROID_BASELINE_2021_NAME, VP_ANDROID_BASELINE_2021_SPEC_VERSION}; return vkProfileGetSupport(&profile, VP_ANDROID_BASELINE_2021_MIN_API_VERSION); } std::string vkAbp2021CpuOnlyGetSupport() { VpProfileProperties profile{VP_ANDROID_BASELINE_2021_CPU_ONLY_NAME, VP_ANDROID_BASELINE_2021_CPU_ONLY_SPEC_VERSION}; return vkProfileGetSupport(&profile, VP_ANDROID_BASELINE_2021_MIN_API_VERSION); } std::string vkAbp2022GetSupport() { VpProfileProperties profile{VP_ANDROID_BASELINE_2022_NAME, VP_ANDROID_BASELINE_2022_SPEC_VERSION}; return vkProfileGetSupport(&profile, VP_ANDROID_BASELINE_2022_MIN_API_VERSION); } std::string vkVpa15GetSupport() { VpProfileProperties profile{VP_ANDROID_15_MINIMUMS_NAME, VP_ANDROID_15_MINIMUMS_SPEC_VERSION}; return vkProfileGetSupport(&profile, VP_ANDROID_15_MINIMUMS_MIN_API_VERSION); } std::string vkProfiles() { return "{" "\"" + std::string(VP_ANDROID_BASELINE_2021_NAME) + "\": " "\"" + vkAbp2021GetSupport() + "\"," "\"" + std::string(VP_ANDROID_BASELINE_2021_CPU_ONLY_NAME) + "\": " "\"" + vkAbp2021CpuOnlyGetSupport() + "\"," "\"" + std::string(VP_ANDROID_BASELINE_2022_NAME) + "\": " "\"" + vkAbp2022GetSupport() + "\"," "\"" + std::string(VP_ANDROID_15_MINIMUMS_NAME) + "\": " "\"" + vkVpa15GetSupport() + "\"" "}"; } } // namespace android::vkprofiles