Commit 5173a8e1 by Jamie Madill Committed by Commit Bot

Enable Vulkan SystemInfo on more platforms.

Can be used in the gold tests to produce device info. Bug: angleproject:4090 Bug: b/168049670 Change-Id: I60d3ddc7d17cd00aa816dd266a54f6d6a62770d7 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2427871 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org> Reviewed-by: 's avatarIan Elliott <ianelliott@google.com> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com>
parent 32ed3e71
......@@ -363,7 +363,7 @@ angle_static_library("angle_gpu_info_util") {
libs = []
defines = []
if (is_android || is_fuchsia) {
if (angle_enable_vulkan) {
sources += libangle_gpu_info_util_vulkan_sources
deps += [ "$angle_root/third_party/vulkan-headers/src:vulkan_headers" ]
}
......
......@@ -41,7 +41,7 @@ struct GPUDeviceInfo
std::string driverVersion;
std::string driverDate;
// Only available on Android
// Only available via GetSystemInfoVulkan currently.
VersionInfo detailedDriverVersion;
};
......@@ -83,6 +83,10 @@ struct SystemInfo
// be filled with partial information.
bool GetSystemInfo(SystemInfo *info);
#if defined(ANGLE_ENABLE_VULKAN)
bool GetSystemInfoVulkan(SystemInfo *info);
#endif
// Known PCI vendor IDs
constexpr VendorID kVendorID_AMD = 0x1002;
constexpr VendorID kVendorID_ARM = 0x13B5;
......
......@@ -6,10 +6,7 @@
// SystemInfo_android.cpp: implementation of the Android-specific parts of SystemInfo.h
#include <dlfcn.h>
#include <vulkan/vulkan.h>
#include "gpu_info_util/SystemInfo_internal.h"
#include "gpu_info_util/SystemInfo_vulkan.h"
#include <sys/system_properties.h>
#include <cstring>
......@@ -18,9 +15,14 @@
#include "common/angleutils.h"
#include "common/debug.h"
#if defined(ANGLE_ENABLE_VULKAN)
# include "gpu_info_util/SystemInfo_vulkan.h"
#endif // defined(ANGLE_ENABLE_VULKAN)
namespace angle
{
namespace
{
bool GetAndroidSystemProperty(const std::string &propertyName, std::string *value)
{
// PROP_VALUE_MAX from <sys/system_properties.h>
......@@ -33,6 +35,7 @@ bool GetAndroidSystemProperty(const std::string &propertyName, std::string *valu
*value = std::string(propertyBuf.data());
return true;
}
} // namespace
bool GetSystemInfo(SystemInfo *info)
{
......@@ -44,7 +47,13 @@ bool GetSystemInfo(SystemInfo *info)
isFullyPopulated =
GetAndroidSystemProperty("ro.product.model", &info->machineModelName) && isFullyPopulated;
return GetSystemInfoVulkan(info) && isFullyPopulated;
#if defined(ANGLE_ENABLE_VULKAN)
isFullyPopulated = GetSystemInfoVulkan(info) && isFullyPopulated;
#else
isFullyPopulated = false;
#endif // defined(ANGLE_ENABLE_VULKAN)
return isFullyPopulated;
}
} // namespace angle
......@@ -5,8 +5,8 @@
//
// SystemInfo_vulkan.cpp: Generic vulkan implementation of SystemInfo.h
// TODO: Use VK_KHR_driver_properties. http://anglebug.com/5103
#include <dlfcn.h>
#include <vulkan/vulkan.h>
#include "gpu_info_util/SystemInfo_internal.h"
......@@ -15,31 +15,43 @@
#include "common/angleutils.h"
#include "common/debug.h"
#include "common/system_utils.h"
#if defined(ANGLE_PLATFORM_WINDOWS)
const char *kLibVulkanNames[] = {"vulkan-1.dll"};
#else
const char *kLibVulkanNames[] = {"libvulkan.so", "libvulkan.so.1"};
#endif
namespace angle
{
class VulkanLibrary final : NonCopyable
{
public:
VulkanLibrary() {}
VulkanLibrary() = default;
~VulkanLibrary()
{
if (mInstance != VK_NULL_HANDLE)
{
PFN_vkDestroyInstance pfnDestroyInstance =
reinterpret_cast<PFN_vkDestroyInstance>(dlsym(mLibVulkan, "vkDestroyInstance"));
auto pfnDestroyInstance = getProc<PFN_vkDestroyInstance>("vkDestroyInstance");
if (pfnDestroyInstance)
{
pfnDestroyInstance(mInstance, nullptr);
}
}
if (mLibVulkan)
dlclose(mLibVulkan);
SafeDelete(mLibVulkan);
}
VkInstance getVulkanInstance()
{
// Find the system's Vulkan library and open it:
mLibVulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL);
for (const char *libraryName : kLibVulkanNames)
{
mLibVulkan = OpenSharedLibraryWithExtension(libraryName);
if (mLibVulkan)
break;
}
if (!mLibVulkan)
{
// If Vulkan doesn't exist, bail-out early:
......@@ -49,9 +61,8 @@ class VulkanLibrary final : NonCopyable
// Determine the available Vulkan instance version:
uint32_t instanceVersion = VK_API_VERSION_1_0;
#if defined(VK_VERSION_1_1)
PFN_vkEnumerateInstanceVersion pfnEnumerateInstanceVersion =
reinterpret_cast<PFN_vkEnumerateInstanceVersion>(
dlsym(mLibVulkan, "vkEnumerateInstanceVersion"));
auto pfnEnumerateInstanceVersion =
getProc<PFN_vkEnumerateInstanceVersion>("vkEnumerateInstanceVersion");
if (!pfnEnumerateInstanceVersion ||
pfnEnumerateInstanceVersion(&instanceVersion) != VK_SUCCESS)
{
......@@ -79,21 +90,24 @@ class VulkanLibrary final : NonCopyable
createInstanceInfo.enabledExtensionCount = 0;
createInstanceInfo.ppEnabledExtensionNames = nullptr;
PFN_vkCreateInstance pfnCreateInstance =
reinterpret_cast<PFN_vkCreateInstance>(dlsym(mLibVulkan, "vkCreateInstance"));
if (!pfnCreateInstance ||
pfnCreateInstance(&createInstanceInfo, nullptr, &mInstance) != VK_SUCCESS)
auto pfnCreateInstance = getProc<PFN_vkCreateInstance>("vkCreateInstance");
ASSERT(pfnCreateInstance);
if (pfnCreateInstance(&createInstanceInfo, nullptr, &mInstance) != VK_SUCCESS)
{
return VK_NULL_HANDLE;
}
return mInstance;
}
void *gpa(std::string fn) { return dlsym(mLibVulkan, fn.c_str()); }
#define GPA(ob, type, fn) reinterpret_cast<type>(ob.gpa(fn))
template <typename Func>
Func getProc(const char *fn) const
{
return reinterpret_cast<Func>(mLibVulkan->getSymbol(fn));
}
private:
void *mLibVulkan = nullptr;
Library *mLibVulkan = nullptr;
VkInstance mInstance = VK_NULL_HANDLE;
};
......@@ -125,10 +139,10 @@ bool GetSystemInfoVulkan(SystemInfo *info)
}
// Enumerate the Vulkan physical devices, which are ANGLE gpus:
PFN_vkEnumeratePhysicalDevices pfnEnumeratePhysicalDevices =
GPA(vkLibrary, PFN_vkEnumeratePhysicalDevices, "vkEnumeratePhysicalDevices");
PFN_vkGetPhysicalDeviceProperties pfnGetPhysicalDeviceProperties =
GPA(vkLibrary, PFN_vkGetPhysicalDeviceProperties, "vkGetPhysicalDeviceProperties");
auto pfnEnumeratePhysicalDevices =
vkLibrary.getProc<PFN_vkEnumeratePhysicalDevices>("vkEnumeratePhysicalDevices");
auto pfnGetPhysicalDeviceProperties =
vkLibrary.getProc<PFN_vkGetPhysicalDeviceProperties>("vkGetPhysicalDeviceProperties");
uint32_t physicalDeviceCount = 0;
if (!pfnEnumeratePhysicalDevices ||
pfnEnumeratePhysicalDevices(instance, &physicalDeviceCount, nullptr) != VK_SUCCESS)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment