blob: 465dc254fd628b0b419e998737075b8e6b3de6f9 [file] [log] [blame]
/*
* 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 <string>
#include <vector>
#include <android/log.h>
#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<VkPhysicalDevice> 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