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") { ...@@ -363,7 +363,7 @@ angle_static_library("angle_gpu_info_util") {
libs = [] libs = []
defines = [] defines = []
if (is_android || is_fuchsia) { if (angle_enable_vulkan) {
sources += libangle_gpu_info_util_vulkan_sources sources += libangle_gpu_info_util_vulkan_sources
deps += [ "$angle_root/third_party/vulkan-headers/src:vulkan_headers" ] deps += [ "$angle_root/third_party/vulkan-headers/src:vulkan_headers" ]
} }
......
...@@ -41,7 +41,7 @@ struct GPUDeviceInfo ...@@ -41,7 +41,7 @@ struct GPUDeviceInfo
std::string driverVersion; std::string driverVersion;
std::string driverDate; std::string driverDate;
// Only available on Android // Only available via GetSystemInfoVulkan currently.
VersionInfo detailedDriverVersion; VersionInfo detailedDriverVersion;
}; };
...@@ -83,6 +83,10 @@ struct SystemInfo ...@@ -83,6 +83,10 @@ struct SystemInfo
// be filled with partial information. // be filled with partial information.
bool GetSystemInfo(SystemInfo *info); bool GetSystemInfo(SystemInfo *info);
#if defined(ANGLE_ENABLE_VULKAN)
bool GetSystemInfoVulkan(SystemInfo *info);
#endif
// Known PCI vendor IDs // Known PCI vendor IDs
constexpr VendorID kVendorID_AMD = 0x1002; constexpr VendorID kVendorID_AMD = 0x1002;
constexpr VendorID kVendorID_ARM = 0x13B5; constexpr VendorID kVendorID_ARM = 0x13B5;
......
...@@ -6,10 +6,7 @@ ...@@ -6,10 +6,7 @@
// SystemInfo_android.cpp: implementation of the Android-specific parts of SystemInfo.h // 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_internal.h"
#include "gpu_info_util/SystemInfo_vulkan.h"
#include <sys/system_properties.h> #include <sys/system_properties.h>
#include <cstring> #include <cstring>
...@@ -18,9 +15,14 @@ ...@@ -18,9 +15,14 @@
#include "common/angleutils.h" #include "common/angleutils.h"
#include "common/debug.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 angle
{ {
namespace
{
bool GetAndroidSystemProperty(const std::string &propertyName, std::string *value) bool GetAndroidSystemProperty(const std::string &propertyName, std::string *value)
{ {
// PROP_VALUE_MAX from <sys/system_properties.h> // PROP_VALUE_MAX from <sys/system_properties.h>
...@@ -33,6 +35,7 @@ bool GetAndroidSystemProperty(const std::string &propertyName, std::string *valu ...@@ -33,6 +35,7 @@ bool GetAndroidSystemProperty(const std::string &propertyName, std::string *valu
*value = std::string(propertyBuf.data()); *value = std::string(propertyBuf.data());
return true; return true;
} }
} // namespace
bool GetSystemInfo(SystemInfo *info) bool GetSystemInfo(SystemInfo *info)
{ {
...@@ -44,7 +47,13 @@ bool GetSystemInfo(SystemInfo *info) ...@@ -44,7 +47,13 @@ bool GetSystemInfo(SystemInfo *info)
isFullyPopulated = isFullyPopulated =
GetAndroidSystemProperty("ro.product.model", &info->machineModelName) && 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 } // namespace angle
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
// //
// SystemInfo_vulkan.cpp: Generic vulkan implementation of SystemInfo.h // 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 <vulkan/vulkan.h>
#include "gpu_info_util/SystemInfo_internal.h" #include "gpu_info_util/SystemInfo_internal.h"
...@@ -15,31 +15,43 @@ ...@@ -15,31 +15,43 @@
#include "common/angleutils.h" #include "common/angleutils.h"
#include "common/debug.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 namespace angle
{ {
class VulkanLibrary final : NonCopyable class VulkanLibrary final : NonCopyable
{ {
public: public:
VulkanLibrary() {} VulkanLibrary() = default;
~VulkanLibrary() ~VulkanLibrary()
{ {
if (mInstance != VK_NULL_HANDLE) if (mInstance != VK_NULL_HANDLE)
{ {
PFN_vkDestroyInstance pfnDestroyInstance = auto pfnDestroyInstance = getProc<PFN_vkDestroyInstance>("vkDestroyInstance");
reinterpret_cast<PFN_vkDestroyInstance>(dlsym(mLibVulkan, "vkDestroyInstance"));
if (pfnDestroyInstance) if (pfnDestroyInstance)
{ {
pfnDestroyInstance(mInstance, nullptr); pfnDestroyInstance(mInstance, nullptr);
} }
} }
if (mLibVulkan) SafeDelete(mLibVulkan);
dlclose(mLibVulkan);
} }
VkInstance getVulkanInstance() VkInstance getVulkanInstance()
{ {
// Find the system's Vulkan library and open it: for (const char *libraryName : kLibVulkanNames)
mLibVulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); {
mLibVulkan = OpenSharedLibraryWithExtension(libraryName);
if (mLibVulkan)
break;
}
if (!mLibVulkan) if (!mLibVulkan)
{ {
// If Vulkan doesn't exist, bail-out early: // If Vulkan doesn't exist, bail-out early:
...@@ -49,9 +61,8 @@ class VulkanLibrary final : NonCopyable ...@@ -49,9 +61,8 @@ class VulkanLibrary final : NonCopyable
// Determine the available Vulkan instance version: // Determine the available Vulkan instance version:
uint32_t instanceVersion = VK_API_VERSION_1_0; uint32_t instanceVersion = VK_API_VERSION_1_0;
#if defined(VK_VERSION_1_1) #if defined(VK_VERSION_1_1)
PFN_vkEnumerateInstanceVersion pfnEnumerateInstanceVersion = auto pfnEnumerateInstanceVersion =
reinterpret_cast<PFN_vkEnumerateInstanceVersion>( getProc<PFN_vkEnumerateInstanceVersion>("vkEnumerateInstanceVersion");
dlsym(mLibVulkan, "vkEnumerateInstanceVersion"));
if (!pfnEnumerateInstanceVersion || if (!pfnEnumerateInstanceVersion ||
pfnEnumerateInstanceVersion(&instanceVersion) != VK_SUCCESS) pfnEnumerateInstanceVersion(&instanceVersion) != VK_SUCCESS)
{ {
...@@ -79,21 +90,24 @@ class VulkanLibrary final : NonCopyable ...@@ -79,21 +90,24 @@ class VulkanLibrary final : NonCopyable
createInstanceInfo.enabledExtensionCount = 0; createInstanceInfo.enabledExtensionCount = 0;
createInstanceInfo.ppEnabledExtensionNames = nullptr; createInstanceInfo.ppEnabledExtensionNames = nullptr;
PFN_vkCreateInstance pfnCreateInstance = auto pfnCreateInstance = getProc<PFN_vkCreateInstance>("vkCreateInstance");
reinterpret_cast<PFN_vkCreateInstance>(dlsym(mLibVulkan, "vkCreateInstance")); ASSERT(pfnCreateInstance);
if (!pfnCreateInstance || if (pfnCreateInstance(&createInstanceInfo, nullptr, &mInstance) != VK_SUCCESS)
pfnCreateInstance(&createInstanceInfo, nullptr, &mInstance) != VK_SUCCESS)
{ {
return VK_NULL_HANDLE; return VK_NULL_HANDLE;
} }
return mInstance; 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: private:
void *mLibVulkan = nullptr; Library *mLibVulkan = nullptr;
VkInstance mInstance = VK_NULL_HANDLE; VkInstance mInstance = VK_NULL_HANDLE;
}; };
...@@ -125,10 +139,10 @@ bool GetSystemInfoVulkan(SystemInfo *info) ...@@ -125,10 +139,10 @@ bool GetSystemInfoVulkan(SystemInfo *info)
} }
// Enumerate the Vulkan physical devices, which are ANGLE gpus: // Enumerate the Vulkan physical devices, which are ANGLE gpus:
PFN_vkEnumeratePhysicalDevices pfnEnumeratePhysicalDevices = auto pfnEnumeratePhysicalDevices =
GPA(vkLibrary, PFN_vkEnumeratePhysicalDevices, "vkEnumeratePhysicalDevices"); vkLibrary.getProc<PFN_vkEnumeratePhysicalDevices>("vkEnumeratePhysicalDevices");
PFN_vkGetPhysicalDeviceProperties pfnGetPhysicalDeviceProperties = auto pfnGetPhysicalDeviceProperties =
GPA(vkLibrary, PFN_vkGetPhysicalDeviceProperties, "vkGetPhysicalDeviceProperties"); vkLibrary.getProc<PFN_vkGetPhysicalDeviceProperties>("vkGetPhysicalDeviceProperties");
uint32_t physicalDeviceCount = 0; uint32_t physicalDeviceCount = 0;
if (!pfnEnumeratePhysicalDevices || if (!pfnEnumeratePhysicalDevices ||
pfnEnumeratePhysicalDevices(instance, &physicalDeviceCount, nullptr) != VK_SUCCESS) 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