From 48da1c3594095fe363bd18e58982d9856f6654fa Mon Sep 17 00:00:00 2001 From: Jamie Madill Date: Fri, 16 Jul 2021 13:24:34 -0400 Subject: [PATCH] Vulkan: Prefer the local vulkan loader over the system one. Load the Vulkan loader ourselves and give vkGetInstanceProcAddr to volk. This allows us to always prefer loading from the current module directory instead of using the platform-specific ordering. Refactor angle::Library loading to use ModuleDir instead of ApplicationDir. CL originally authored by Geoff Lang. Bug: chromium:1219969 Change-Id: I21d1926e90fd66e1c23cea7323991ae55f3d22d4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3035444 Reviewed-by: Jonah Ryan-Davis Reviewed-by: Tim Van Patten Reviewed-by: Jamie Madill Commit-Queue: Jamie Madill --- BUILD.gn | 5 +- samples/sample_util/SampleApplication.cpp | 2 +- .../GL_EGL_entry_points.json | 4 +- scripts/generate_entry_points.py | 2 +- src/common/system_utils.h | 5 +- src/common/system_utils_posix.cpp | 39 +++- src/common/system_utils_win32.cpp | 24 ++- src/common/system_utils_winuwp.cpp | 26 ++- src/common/vulkan/BUILD.gn | 197 +++++++++--------- src/common/vulkan/libvulkan_loader.cpp | 58 ++++++ src/common/vulkan/libvulkan_loader.h | 25 +++ src/gpu_info_util/SystemInfo_vulkan.cpp | 36 +--- src/libANGLE/renderer/vulkan/BUILD.gn | 1 + src/libANGLE/renderer/vulkan/RendererVk.cpp | 8 + src/libANGLE/renderer/vulkan/RendererVk.h | 7 + src/libEGL/libEGL_autogen.cpp | 2 +- src/libOpenCL/dispatch.cpp | 2 +- src/tests/angle_system_info_tests_main.cpp | 15 +- src/tests/gl_tests/ProgramBinaryTest.cpp | 2 +- src/tests/perf_tests/ANGLEPerfTest.cpp | 4 +- src/tests/perf_tests/EGLMakeCurrentPerf.cpp | 2 +- .../restricted_trace_gold_tests.py | 2 +- src/tests/test_utils/ANGLETest.cpp | 3 +- .../test_utils/angle_test_instantiate.cpp | 2 +- util/frame_capture_test_utils.h | 2 +- 25 files changed, 315 insertions(+), 160 deletions(-) create mode 100644 src/common/vulkan/libvulkan_loader.cpp create mode 100644 src/common/vulkan/libvulkan_loader.h diff --git a/BUILD.gn b/BUILD.gn index d526c62da..aef8e4143 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -456,7 +456,10 @@ angle_static_library("angle_gpu_info_util") { if (!is_chromeos && angle_has_build) { sources += libangle_gpu_info_util_vulkan_sources - deps += [ "$angle_vulkan_headers_dir:vulkan_headers" ] + deps += [ + "$angle_root/src/common/vulkan:angle_libvulkan_loader", + "$angle_vulkan_headers_dir:vulkan_headers", + ] defines += [ "ANGLE_HAS_VULKAN_SYSTEM_INFO" ] } diff --git a/samples/sample_util/SampleApplication.cpp b/samples/sample_util/SampleApplication.cpp index c409ee551..4fe441d67 100644 --- a/samples/sample_util/SampleApplication.cpp +++ b/samples/sample_util/SampleApplication.cpp @@ -129,7 +129,7 @@ SampleApplication::SampleApplication(std::string name, { mGLWindow = mEGLWindow = EGLWindow::New(glesMajorVersion, glesMinorVersion); mEntryPointsLib.reset( - angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ApplicationDir)); + angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ModuleDir)); } } diff --git a/scripts/code_generation_hashes/GL_EGL_entry_points.json b/scripts/code_generation_hashes/GL_EGL_entry_points.json index 6d812f0ee..700485c65 100644 --- a/scripts/code_generation_hashes/GL_EGL_entry_points.json +++ b/scripts/code_generation_hashes/GL_EGL_entry_points.json @@ -10,7 +10,7 @@ "scripts/entry_point_packed_gl_enums.json": "4f7b43863a5e61991bba4010db463679", "scripts/generate_entry_points.py": - "30efaf41a84593db7fc6f46d138be8b5", + "4e8e47a9d3435f8e34d790384612d4f7", "scripts/gl.xml": "4fcbd11300c8edcb3ed50826780cd57e", "scripts/gl_angle_ext.xml": @@ -98,7 +98,7 @@ "src/libANGLE/validationGL4_autogen.h": "db77968c46394c58896f085265182ffa", "src/libEGL/libEGL_autogen.cpp": - "01cc619c8493952c24f77ac4fa5d7d8a", + "7a1e13d8394f75591947f5ec23a17b66", "src/libEGL/libEGL_autogen.def": "3f504d6280dc1d847bc2dedc51fa2640", "src/libGL/entry_points_gl_1_autogen.cpp": diff --git a/scripts/generate_entry_points.py b/scripts/generate_entry_points.py index b56d2d929..e20375008 100755 --- a/scripts/generate_entry_points.py +++ b/scripts/generate_entry_points.py @@ -965,7 +965,7 @@ void EnsureEGLLoaded() } EntryPointsLib().reset( - angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ApplicationDir)); + angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ModuleDir)); angle::LoadEGL_EGL(GlobalLoad); if (!EGL_GetPlatformDisplay) { diff --git a/src/common/system_utils.h b/src/common/system_utils.h index 7b16af1c0..cbf9d35ba 100644 --- a/src/common/system_utils.h +++ b/src/common/system_utils.h @@ -59,6 +59,7 @@ class Library : angle::NonCopyable virtual ~Library() {} virtual void *getSymbol(const char *symbolName) = 0; virtual void *getNative() const = 0; + virtual std::string getPath() const = 0; template void getAs(const char *symbolName, FuncT *funcOut) @@ -71,8 +72,8 @@ class Library : angle::NonCopyable // (e.g. opengl32.dll) enum class SearchType { - // Try to find the library in the application directory - ApplicationDir, + // Try to find the library in the same directory as the current module + ModuleDir, // Load the library from the system directories SystemDir, // Get a reference to an already loaded shared library. diff --git a/src/common/system_utils_posix.cpp b/src/common/system_utils_posix.cpp index 2c30ab1ee..745cf399f 100644 --- a/src/common/system_utils_posix.cpp +++ b/src/common/system_utils_posix.cpp @@ -19,6 +19,21 @@ namespace angle { + +namespace +{ +std::string GetModulePath(void *moduleOrSymbol) +{ + Dl_info dlInfo; + if (dladdr(moduleOrSymbol, &dlInfo) == 0) + { + return ""; + } + + return dlInfo.dli_fname; +} +} // namespace + Optional GetCWD() { std::array pathBuf; @@ -60,12 +75,12 @@ std::string GetModuleDirectory() { std::string directory; static int placeholderSymbol = 0; - Dl_info dlInfo; - if (dladdr(&placeholderSymbol, &dlInfo) != 0) + std::string moduleName = GetModulePath(&placeholderSymbol); + if (!moduleName.empty()) { - std::string moduleName = dlInfo.dli_fname; - directory = moduleName.substr(0, moduleName.find_last_of('/') + 1); + directory = moduleName.substr(0, moduleName.find_last_of('/') + 1); } + // Ensure we return the full path to the module, not the relative path Optional cwd = GetCWD(); if (cwd.valid() && !IsFullPath(directory)) @@ -102,20 +117,30 @@ class PosixLibrary : public Library void *getNative() const override { return mModule; } + std::string getPath() const override + { + if (!mModule) + { + return ""; + } + + return GetModulePath(mModule); + } + private: void *mModule = nullptr; }; Library *OpenSharedLibrary(const char *libraryName, SearchType searchType) { - std::string nameWithExt = std::string(libraryName) + "." + GetSharedLibraryExtension(); - return OpenSharedLibraryWithExtension(nameWithExt.c_str(), searchType); + std::string libraryWithExtension = std::string(libraryName) + "." + GetSharedLibraryExtension(); + return OpenSharedLibraryWithExtension(libraryWithExtension.c_str(), searchType); } Library *OpenSharedLibraryWithExtension(const char *libraryName, SearchType searchType) { std::string directory; - if (searchType == SearchType::ApplicationDir) + if (searchType == SearchType::ModuleDir) { #if ANGLE_PLATFORM_IOS // On iOS, shared libraries must be loaded from within the app bundle. diff --git a/src/common/system_utils_win32.cpp b/src/common/system_utils_win32.cpp index d17435a95..555e7f1a7 100644 --- a/src/common/system_utils_win32.cpp +++ b/src/common/system_utils_win32.cpp @@ -44,9 +44,13 @@ class Win32Library : public Library { switch (searchType) { - case SearchType::ApplicationDir: - mModule = LoadLibraryA(libraryName); + case SearchType::ModuleDir: + { + std::string moduleRelativePath = ConcatenatePath(GetModuleDirectory(), libraryName); + mModule = LoadLibraryA(moduleRelativePath.c_str()); break; + } + case SearchType::SystemDir: mModule = LoadLibraryExA(libraryName, nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); break; @@ -77,6 +81,22 @@ class Win32Library : public Library void *getNative() const override { return reinterpret_cast(mModule); } + std::string getPath() const override + { + if (!mModule) + { + return ""; + } + + std::array buffer; + if (GetModuleFileNameA(mModule, buffer.data(), buffer.size()) == 0) + { + return ""; + } + + return std::string(buffer.data()); + } + private: HMODULE mModule = nullptr; }; diff --git a/src/common/system_utils_winuwp.cpp b/src/common/system_utils_winuwp.cpp index 4436587ac..229937967 100644 --- a/src/common/system_utils_winuwp.cpp +++ b/src/common/system_utils_winuwp.cpp @@ -40,7 +40,7 @@ class UwpLibrary : public Library switch (searchType) { - case SearchType::ApplicationDir: + case SearchType::ModuleDir: mModule = LoadPackagedLibrary(wideBuffer.c_str(), 0); break; case SearchType::SystemDir: @@ -70,6 +70,22 @@ class UwpLibrary : public Library void *getNative() const override { return reinterpret_cast(mModule); } + std::string getPath() const override + { + if (!mModule) + { + return ""; + } + + std::array buffer; + if (GetModuleFileNameA(mModule, buffer.data(), buffer.size()) == 0) + { + return ""; + } + + return std::string(buffer.data()); + } + private: HMODULE mModule = nullptr; }; @@ -81,7 +97,7 @@ Library *OpenSharedLibrary(const char *libraryName, SearchType searchType) if (ret > 0 && ret < MAX_PATH) { - return new UwpLibrary(buffer, searchType); + return OpenSharedLibraryWithExtension(buffer, searchType); } else { @@ -90,10 +106,8 @@ Library *OpenSharedLibrary(const char *libraryName, SearchType searchType) } } -Library *OpenSharedLibraryWithExtension(const char *libraryName) +Library *OpenSharedLibraryWithExtension(const char *libraryName, SearchType searchType) { - // SystemDir is not implemented in UWP. - fprintf(stderr, "Error loading shared library with extension.\n"); - return nullptr; + return new UwpLibrary(libraryName, searchType); } } // namespace angle diff --git a/src/common/vulkan/BUILD.gn b/src/common/vulkan/BUILD.gn index 4d119d2f2..03aa2fd11 100644 --- a/src/common/vulkan/BUILD.gn +++ b/src/common/vulkan/BUILD.gn @@ -5,8 +5,6 @@ import("//build_overrides/swiftshader.gni") import("../../../gni/angle.gni") -assert(angle_enable_vulkan) - declare_args() { angle_use_custom_libvulkan = !is_android && !is_fuchsia && !is_ggp } @@ -17,106 +15,117 @@ config("angle_libvulkan_config") { } } -group("angle_libvulkan") { +angle_source_set("angle_libvulkan_loader") { public_configs = [ ":angle_libvulkan_config" ] - data_deps = [] - if (angle_use_custom_libvulkan) { - if (angle_shared_libvulkan) { - data_deps += [ "$angle_vulkan_loader_dir:libvulkan" ] - } else { - public_deps = [ "$angle_vulkan_loader_dir:libvulkan" ] - } - data_deps += [ "$angle_vulkan_tools_dir:VkICD_mock_icd" ] - } -} - -config("angle_vulkan_headers_config") { - if (angle_shared_libvulkan) { - defines = [ "ANGLE_SHARED_LIBVULKAN=1" ] - } -} - -angle_source_set("angle_vulkan_headers") { sources = [ - "vk_google_filtering_precision.h", - "vk_headers.h", + "libvulkan_loader.cpp", + "libvulkan_loader.h", ] - if (angle_shared_libvulkan) { - public_deps = [ "$angle_root/src/third_party/volk:volk" ] - } else { - public_deps = [ "$angle_vulkan_headers_dir:vulkan_headers" ] - } - public_configs = [ ":angle_vulkan_headers_config" ] + deps = [ "$angle_root:angle_common" ] } -group("angle_vulkan_entry_points") { - public_deps = [ ":angle_vulkan_headers" ] - if (is_fuchsia) { - public_deps += [ - "$angle_root/src/common/fuchsia_egl", - "//third_party/fuchsia-sdk/sdk/pkg/vulkan", - ] - if (!angle_use_vulkan_null_display) { - public_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/vulkan_layers:VkLayer_image_pipe_swapchain" ] - } - } else if (!is_android && !is_ggp) { - if (angle_shared_libvulkan) { - data_deps = [ "$angle_vulkan_loader_dir:libvulkan" ] - } else { - deps = [ "$angle_vulkan_loader_dir:libvulkan" ] - } - } -} - -angle_source_set("vulkan") { - sources = [ - "vulkan_icd.cpp", - "vulkan_icd.h", - ] - - public_deps = [ - ":angle_libvulkan", - ":angle_vulkan_entry_points", - "$angle_root:angle_common", - ] - - configs += [ "$angle_root:angle_no_cfi_icall" ] - - defines = [ - "ANGLE_VK_LAYERS_DIR=\"$angle_data_dir\"", - "ANGLE_VK_MOCK_ICD_JSON=\"$angle_data_dir/VkICD_mock_icd.json\"", - ] - - deps = [] - data_deps = [] - - if (angle_enable_swiftshader) { - import("$swiftshader_dir/src/Vulkan/vulkan.gni") - _sws_icd = "./$swiftshader_icd_file_name" - if (is_win) { - _sws_icd = ".\\\\$swiftshader_icd_file_name" - } - - defines += [ "ANGLE_VK_SWIFTSHADER_ICD_JSON=\"${_sws_icd}\"" ] - - data_deps += [ - "$swiftshader_dir/src/Vulkan:icd_file", - "$swiftshader_dir/src/Vulkan:swiftshader_libvulkan", - ] - } -} - -if (angle_enable_vulkan_validation_layers) { - group("vulkan_validation_layers") { +if (angle_enable_vulkan) { + group("angle_libvulkan") { + public_configs = [ ":angle_libvulkan_config" ] data_deps = [] - if (is_fuchsia) { - data_deps += [ "//third_party/fuchsia-sdk:vulkan_validation" ] + if (angle_use_custom_libvulkan) { + if (angle_shared_libvulkan) { + data_deps += [ "$angle_vulkan_loader_dir:libvulkan" ] + } else { + public_deps = [ "$angle_vulkan_loader_dir:libvulkan" ] + } + data_deps += [ "$angle_vulkan_tools_dir:VkICD_mock_icd" ] + } + } + + config("angle_vulkan_headers_config") { + if (angle_shared_libvulkan) { + defines = [ "ANGLE_SHARED_LIBVULKAN=1" ] + } + } + + angle_source_set("angle_vulkan_headers") { + sources = [ + "vk_google_filtering_precision.h", + "vk_headers.h", + ] + if (angle_shared_libvulkan) { + public_deps = [ "$angle_root/src/third_party/volk:volk" ] } else { - data_deps += - [ "$angle_vulkan_validation_layers_dir:vulkan_validation_layers" ] - if (!is_android) { + public_deps = [ "$angle_vulkan_headers_dir:vulkan_headers" ] + } + public_configs = [ ":angle_vulkan_headers_config" ] + } + + group("angle_vulkan_entry_points") { + public_deps = [ ":angle_vulkan_headers" ] + if (is_fuchsia) { + public_deps += [ + "$angle_root/src/common/fuchsia_egl", + "//third_party/fuchsia-sdk/sdk/pkg/vulkan", + ] + if (!angle_use_vulkan_null_display) { + public_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/vulkan_layers:VkLayer_image_pipe_swapchain" ] + } + } else if (!is_android && !is_ggp) { + if (angle_shared_libvulkan) { + data_deps = [ "$angle_vulkan_loader_dir:libvulkan" ] + } else { + deps = [ "$angle_vulkan_loader_dir:libvulkan" ] + } + } + } + + angle_source_set("vulkan") { + sources = [ + "vulkan_icd.cpp", + "vulkan_icd.h", + ] + + public_deps = [ + ":angle_libvulkan", + ":angle_vulkan_entry_points", + "$angle_root:angle_common", + ] + + configs += [ "$angle_root:angle_no_cfi_icall" ] + + defines = [ + "ANGLE_VK_LAYERS_DIR=\"$angle_data_dir\"", + "ANGLE_VK_MOCK_ICD_JSON=\"$angle_data_dir/VkICD_mock_icd.json\"", + ] + + deps = [] + data_deps = [] + + if (angle_enable_swiftshader) { + import("$swiftshader_dir/src/Vulkan/vulkan.gni") + _sws_icd = "./$swiftshader_icd_file_name" + if (is_win) { + _sws_icd = ".\\\\$swiftshader_icd_file_name" + } + + defines += [ "ANGLE_VK_SWIFTSHADER_ICD_JSON=\"${_sws_icd}\"" ] + + data_deps += [ + "$swiftshader_dir/src/Vulkan:icd_file", + "$swiftshader_dir/src/Vulkan:swiftshader_libvulkan", + ] + } + } + + if (angle_enable_vulkan_validation_layers) { + group("vulkan_validation_layers") { + data_deps = [] + if (is_fuchsia) { + data_deps += [ "//third_party/fuchsia-sdk:vulkan_validation" ] + } else { data_deps += - [ "$angle_vulkan_validation_layers_dir:vulkan_gen_json_files" ] + [ "$angle_vulkan_validation_layers_dir:vulkan_validation_layers" ] + if (!is_android) { + data_deps += + [ "$angle_vulkan_validation_layers_dir:vulkan_gen_json_files" ] + } } } } diff --git a/src/common/vulkan/libvulkan_loader.cpp b/src/common/vulkan/libvulkan_loader.cpp new file mode 100644 index 000000000..00b9bb79d --- /dev/null +++ b/src/common/vulkan/libvulkan_loader.cpp @@ -0,0 +1,58 @@ +// +// Copyright 2021 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// libvulkan_loader.cpp: +// Helper functions for the loading Vulkan libraries. +// + +#include "common/vulkan/libvulkan_loader.h" + +#include "common/system_utils.h" + +namespace angle +{ +namespace vk +{ +std::unique_ptr OpenLibVulkan() +{ + constexpr const char *kLibVulkanNames[] = { +#if defined(ANGLE_PLATFORM_WINDOWS) + "vulkan-1.dll", +#elif defined(ANGLE_PLATFORM_APPLE) + "libvulkan.dylib", + "libvulkan.1.dylib", + "libMoltenVK.dylib" +#else + "libvulkan.so", + "libvulkan.so.1", +#endif + }; + + constexpr SearchType kSearchTypes[] = { +// On Android, Fuchsia and GGP we use the system libvulkan. +#if defined(ANGLE_USE_CUSTOM_LIBVULKAN) + SearchType::ModuleDir, +#else + SearchType::SystemDir, +#endif // defined(ANGLE_USE_CUSTOM_LIBVULKAN) + }; + + for (angle::SearchType searchType : kSearchTypes) + { + for (const char *libraryName : kLibVulkanNames) + { + std::unique_ptr library( + OpenSharedLibraryWithExtension(libraryName, searchType)); + if (library && library->getNative()) + { + return library; + } + } + } + + return nullptr; +} +} // namespace vk +} // namespace angle diff --git a/src/common/vulkan/libvulkan_loader.h b/src/common/vulkan/libvulkan_loader.h new file mode 100644 index 000000000..dd8857abf --- /dev/null +++ b/src/common/vulkan/libvulkan_loader.h @@ -0,0 +1,25 @@ +// +// Copyright 2021 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// libvulkan_loader.h: +// Helper functions for the loading Vulkan libraries. +// + +#include + +#ifndef LIBANGLE_COMMON_VULKAN_LIBVULKAN_LOADER_H_ +# define LIBANGLE_COMMON_VULKAN_LIBVULKAN_LOADER_H_ + +namespace angle +{ +class Library; + +namespace vk +{ +std::unique_ptr OpenLibVulkan(); +} +} // namespace angle + +#endif // LIBANGLE_COMMON_VULKAN_LIBVULKAN_LOADER_H_ diff --git a/src/gpu_info_util/SystemInfo_vulkan.cpp b/src/gpu_info_util/SystemInfo_vulkan.cpp index 0f3d178ca..1b87606e6 100644 --- a/src/gpu_info_util/SystemInfo_vulkan.cpp +++ b/src/gpu_info_util/SystemInfo_vulkan.cpp @@ -16,22 +16,10 @@ #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 +#include "common/vulkan/libvulkan_loader.h" namespace angle { -// On Android, Fuchsia and GGP we use the system libvulkan. -#if defined(ANGLE_USE_CUSTOM_LIBVULKAN) -constexpr SearchType kLibVulkanSearchType = SearchType::ApplicationDir; -#else -constexpr SearchType kLibVulkanSearchType = SearchType::SystemDir; -#endif // defined(ANGLE_USE_CUSTOM_LIBVULKAN) - class VulkanLibrary final : NonCopyable { public: @@ -47,27 +35,11 @@ class VulkanLibrary final : NonCopyable pfnDestroyInstance(mInstance, nullptr); } } - SafeDelete(mLibVulkan); } VkInstance getVulkanInstance() { - for (const char *libraryName : kLibVulkanNames) - { - mLibVulkan = OpenSharedLibraryWithExtension(libraryName, kLibVulkanSearchType); - if (mLibVulkan) - { - if (mLibVulkan->getNative()) - { - break; - } - else - { - SafeDelete(mLibVulkan); - } - } - } - + mLibVulkan = vk::OpenLibVulkan(); if (!mLibVulkan) { // If Vulkan doesn't exist, bail-out early: @@ -123,8 +95,8 @@ class VulkanLibrary final : NonCopyable } private: - Library *mLibVulkan = nullptr; - VkInstance mInstance = VK_NULL_HANDLE; + std::unique_ptr mLibVulkan = nullptr; + VkInstance mInstance = VK_NULL_HANDLE; }; ANGLE_FORMAT_PRINTF(1, 2) diff --git a/src/libANGLE/renderer/vulkan/BUILD.gn b/src/libANGLE/renderer/vulkan/BUILD.gn index d60dd376a..b83f437e7 100644 --- a/src/libANGLE/renderer/vulkan/BUILD.gn +++ b/src/libANGLE/renderer/vulkan/BUILD.gn @@ -262,6 +262,7 @@ angle_source_set("angle_vulkan_backend") { "$angle_root:angle_glslang_wrapper", "$angle_root:libANGLE_headers", "$angle_root/src/common/vulkan", + "$angle_root/src/common/vulkan:angle_libvulkan_loader", "$angle_root/src/common/vulkan:angle_vulkan_entry_points", "$angle_root/src/common/vulkan:angle_vulkan_headers", ] diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp index c2aa7ccc2..5c1e9acf2 100644 --- a/src/libANGLE/renderer/vulkan/RendererVk.cpp +++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp @@ -17,6 +17,7 @@ #include "common/debug.h" #include "common/platform.h" #include "common/system_utils.h" +#include "common/vulkan/libvulkan_loader.h" #include "common/vulkan/vk_google_filtering_precision.h" #include "common/vulkan/vulkan_icd.h" #include "gpu_info_util/SystemInfo.h" @@ -843,6 +844,13 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk, { bool canLoadDebugUtils = true; #if defined(ANGLE_SHARED_LIBVULKAN) + mLibVulkanLibrary = angle::vk::OpenLibVulkan(); + ANGLE_VK_CHECK(displayVk, mLibVulkanLibrary, VK_ERROR_INITIALIZATION_FAILED); + INFO() << "Using Vulkan loader: " << mLibVulkanLibrary->getPath(); + + PFN_vkGetInstanceProcAddr vulkanLoaderGetInstanceProcAddr = nullptr; + mLibVulkanLibrary->getAs("vkGetInstanceProcAddr", &vulkanLoaderGetInstanceProcAddr); + // Set all vk* function ptrs ANGLE_VK_TRY(displayVk, volkInitialize()); diff --git a/src/libANGLE/renderer/vulkan/RendererVk.h b/src/libANGLE/renderer/vulkan/RendererVk.h index 183ecdbfa..2dfc8c8ed 100644 --- a/src/libANGLE/renderer/vulkan/RendererVk.h +++ b/src/libANGLE/renderer/vulkan/RendererVk.h @@ -35,6 +35,11 @@ #include "libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h" #include "libANGLE/renderer/vulkan/vk_mem_alloc_wrapper.h" +namespace angle +{ +class Library; +} // namespace angle + namespace egl { class Display; @@ -414,6 +419,8 @@ class RendererVk : angle::NonCopyable egl::Display *mDisplay; + std::unique_ptr mLibVulkanLibrary; + mutable bool mCapsInitialized; mutable gl::Caps mNativeCaps; mutable gl::TextureCapsMap mNativeTextureCaps; diff --git a/src/libEGL/libEGL_autogen.cpp b/src/libEGL/libEGL_autogen.cpp index 85b3ab9db..6f8ec74ab 100644 --- a/src/libEGL/libEGL_autogen.cpp +++ b/src/libEGL/libEGL_autogen.cpp @@ -43,7 +43,7 @@ void EnsureEGLLoaded() } EntryPointsLib().reset( - angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ApplicationDir)); + angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ModuleDir)); angle::LoadEGL_EGL(GlobalLoad); if (!EGL_GetPlatformDisplay) { diff --git a/src/libOpenCL/dispatch.cpp b/src/libOpenCL/dispatch.cpp index d7586f0a1..d513ce353 100644 --- a/src/libOpenCL/dispatch.cpp +++ b/src/libOpenCL/dispatch.cpp @@ -37,7 +37,7 @@ IcdDispatch CreateDispatch() // Try to find ANGLE's GLESv2 library in the consistent way, which might fail // if the current library or a link to it is not in ANGLE's binary directory EntryPointsLib().reset( - angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ApplicationDir)); + angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ModuleDir)); if (EntryPointsLib() && EntryPointsLib()->getNative() != nullptr) { EntryPointsLib()->getAs("gCLIcdDispatchTable", &clIcdDispatch); diff --git a/src/tests/angle_system_info_tests_main.cpp b/src/tests/angle_system_info_tests_main.cpp index 909a3e55e..ea1eb2935 100644 --- a/src/tests/angle_system_info_tests_main.cpp +++ b/src/tests/angle_system_info_tests_main.cpp @@ -42,6 +42,8 @@ namespace js = rapidjson; +bool gFailedToFindGPU; + int main(int argc, char **argv) { angle::SystemInfo info; @@ -81,6 +83,11 @@ int main(int argc, char **argv) angle::GetSystemInfo(&info); } + if (info.gpus.empty()) + { + gFailedToFindGPU = true; + } + js::Document doc; doc.SetObject(); @@ -145,4 +152,10 @@ int main(int argc, char **argv) return RUN_ALL_TESTS(); } -TEST(ANGLE, SystemInfo) {} \ No newline at end of file +TEST(ANGLE, SystemInfo) +{ + if (gFailedToFindGPU) + { + FAIL() << "Failed to find GPU info."; + } +} \ No newline at end of file diff --git a/src/tests/gl_tests/ProgramBinaryTest.cpp b/src/tests/gl_tests/ProgramBinaryTest.cpp index 0d3813544..4e8c71ff8 100644 --- a/src/tests/gl_tests/ProgramBinaryTest.cpp +++ b/src/tests/gl_tests/ProgramBinaryTest.cpp @@ -1174,7 +1174,7 @@ class ProgramBinariesAcrossPlatforms : public testing::TestWithParaminitialize("EGLMakeCurrent Test", 64, 64); mEGLLibrary.reset( - angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ApplicationDir)); + angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ModuleDir)); angle::LoadProc getProc = reinterpret_cast(mEGLLibrary->getSymbol("eglGetProcAddress")); diff --git a/src/tests/restricted_traces/restricted_trace_gold_tests.py b/src/tests/restricted_traces/restricted_trace_gold_tests.py index fcfaec0e0..54202dd1e 100755 --- a/src/tests/restricted_traces/restricted_trace_gold_tests.py +++ b/src/tests/restricted_traces/restricted_trace_gold_tests.py @@ -81,7 +81,7 @@ def temporary_dir(prefix=''): try: yield path finally: - logging.info("Removing temporary directory: %s" + path) + logging.info("Removing temporary directory: %s" % path) shutil.rmtree(path) diff --git a/src/tests/test_utils/ANGLETest.cpp b/src/tests/test_utils/ANGLETest.cpp index 5dabadeff..c92813690 100644 --- a/src/tests/test_utils/ANGLETest.cpp +++ b/src/tests/test_utils/ANGLETest.cpp @@ -1485,8 +1485,7 @@ Library *ANGLETestEnvironment::GetAngleEGLLibrary() #if defined(ANGLE_USE_UTIL_LOADER) if (!gAngleEGLLibrary) { - gAngleEGLLibrary.reset( - OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, SearchType::ApplicationDir)); + gAngleEGLLibrary.reset(OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, SearchType::ModuleDir)); } #endif // defined(ANGLE_USE_UTIL_LOADER) return gAngleEGLLibrary.get(); diff --git a/src/tests/test_utils/angle_test_instantiate.cpp b/src/tests/test_utils/angle_test_instantiate.cpp index f1703eba4..c65776b0f 100644 --- a/src/tests/test_utils/angle_test_instantiate.cpp +++ b/src/tests/test_utils/angle_test_instantiate.cpp @@ -44,7 +44,7 @@ bool IsAngleEGLConfigSupported(const PlatformParameters ¶m, OSWindow *osWind #if defined(ANGLE_USE_UTIL_LOADER) eglLibrary.reset( - angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ApplicationDir)); + angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ModuleDir)); #endif EGLWindow *eglWindow = EGLWindow::New(param.majorVersion, param.minorVersion); diff --git a/util/frame_capture_test_utils.h b/util/frame_capture_test_utils.h index 231fbbbdb..cc08adb39 100644 --- a/util/frame_capture_test_utils.h +++ b/util/frame_capture_test_utils.h @@ -76,7 +76,7 @@ class TraceLibrary traceNameStr << ".cr"; #endif // defined(ANGLE_PLATFORM_ANDROID) && defined(COMPONENT_BUILD) std::string traceName = traceNameStr.str(); - mTraceLibrary.reset(OpenSharedLibrary(traceName.c_str(), SearchType::ApplicationDir)); + mTraceLibrary.reset(OpenSharedLibrary(traceName.c_str(), SearchType::ModuleDir)); } bool valid() const { return mTraceLibrary != nullptr; }