blob: e0a89b93bbe8b387360d3b8e9824ff7e7c43db94 [file] [log] [blame]
/*
* Copyright (C) 2023 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.
*/
#include "GraphicsDetectorVk.h"
#include "Vulkan.h"
namespace gfxstream {
namespace {
gfxstream::expected<Ok, vkhpp::Result> PopulateVulkanAvailabilityImpl(
::gfxstream::proto::GraphicsAvailability* availability) {
auto vk = GFXSTREAM_EXPECT(Vk::Load());
::gfxstream::proto::VulkanAvailability* vulkanAvailability = availability->mutable_vulkan();
const auto physicalDevices = VK_EXPECT_RV(vk.instance().enumeratePhysicalDevices());
for (const auto& physicalDevice : physicalDevices) {
auto* outPhysicalDevice = vulkanAvailability->add_physical_devices();
const auto props = physicalDevice.getProperties();
outPhysicalDevice->set_name(std::string(props.deviceName));
outPhysicalDevice->set_type(
props.deviceType == vkhpp::PhysicalDeviceType::eDiscreteGpu ?
::gfxstream::proto::VulkanPhysicalDevice::TYPE_DISCRETE_GPU :
::gfxstream::proto::VulkanPhysicalDevice::TYPE_OTHER);
const auto exts = VK_EXPECT_RV(physicalDevice.enumerateDeviceExtensionProperties());
for (const auto& ext : exts) {
outPhysicalDevice->add_extensions(std::string(ext.extensionName));
}
}
return Ok{};
}
} // namespace
gfxstream::expected<Ok, std::string> PopulateVulkanAvailability(
::gfxstream::proto::GraphicsAvailability* availability) {
return PopulateVulkanAvailabilityImpl(availability)
.transform_error([](vkhpp::Result r) { return vkhpp::to_string(r); });
}
} // namespace gfxstream