vulkan_library.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <string>
  4. #include "common/dynamic_library.h"
  5. #include "common/fs/path_util.h"
  6. #include "common/logging/log.h"
  7. #include "video_core/vulkan_common/vulkan_library.h"
  8. namespace Vulkan {
  9. std::shared_ptr<Common::DynamicLibrary> OpenLibrary(
  10. [[maybe_unused]] Core::Frontend::GraphicsContext* context) {
  11. LOG_DEBUG(Render_Vulkan, "Looking for a Vulkan library");
  12. #if defined(ANDROID) && defined(ARCHITECTURE_arm64)
  13. // Android manages its Vulkan driver from the frontend.
  14. return context->GetDriverLibrary();
  15. #else
  16. auto library = std::make_shared<Common::DynamicLibrary>();
  17. #ifdef __APPLE__
  18. const auto libvulkan_filename =
  19. Common::FS::GetBundleDirectory() / "Contents/Frameworks/libvulkan.1.dylib";
  20. const auto libmoltenvk_filename =
  21. Common::FS::GetBundleDirectory() / "Contents/Frameworks/libMoltenVK.dylib";
  22. const char* library_paths[] = {std::getenv("LIBVULKAN_PATH"), libvulkan_filename.c_str(),
  23. libmoltenvk_filename.c_str()};
  24. // Check if a path to a specific Vulkan library has been specified.
  25. for (const auto& library_path : library_paths) {
  26. if (library_path && library->Open(library_path)) {
  27. break;
  28. }
  29. }
  30. #else
  31. std::string filename = Common::DynamicLibrary::GetVersionedFilename("vulkan", 1);
  32. LOG_DEBUG(Render_Vulkan, "Trying Vulkan library: {}", filename);
  33. if (!library->Open(filename.c_str())) {
  34. // Android devices may not have libvulkan.so.1, only libvulkan.so.
  35. filename = Common::DynamicLibrary::GetVersionedFilename("vulkan");
  36. LOG_DEBUG(Render_Vulkan, "Trying Vulkan library (second attempt): {}", filename);
  37. void(library->Open(filename.c_str()));
  38. }
  39. #endif
  40. return library;
  41. #endif
  42. }
  43. } // namespace Vulkan