summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-03-17 01:39:38 -0300
committerGravatar ReinUsesLisp2020-04-07 02:23:23 -0300
commitbc1b4b85b01aee30a14c234143e72ef3435f9660 (patch)
tree2ed6568512ce8c93114ada1a3c9e32178f1e5dd2 /src/video_core
parentcommon/dynamic_library: Import and adapt helper from Dolphin (diff)
downloadyuzu-bc1b4b85b01aee30a14c234143e72ef3435f9660.tar.gz
yuzu-bc1b4b85b01aee30a14c234143e72ef3435f9660.tar.xz
yuzu-bc1b4b85b01aee30a14c234143e72ef3435f9660.zip
renderer_vulkan: Query device names from the backend
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_vulkan/declarations.h1
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp69
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.h3
3 files changed, 73 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/declarations.h b/src/video_core/renderer_vulkan/declarations.h
index 323bf6b39..d2a1140c1 100644
--- a/src/video_core/renderer_vulkan/declarations.h
+++ b/src/video_core/renderer_vulkan/declarations.h
@@ -39,6 +39,7 @@ using UniqueFence = UniqueHandle<vk::Fence>;
39using UniqueFramebuffer = UniqueHandle<vk::Framebuffer>; 39using UniqueFramebuffer = UniqueHandle<vk::Framebuffer>;
40using UniqueImage = UniqueHandle<vk::Image>; 40using UniqueImage = UniqueHandle<vk::Image>;
41using UniqueImageView = UniqueHandle<vk::ImageView>; 41using UniqueImageView = UniqueHandle<vk::ImageView>;
42using UniqueInstance = UniqueHandle<vk::Instance>;
42using UniqueIndirectCommandsLayoutNVX = UniqueHandle<vk::IndirectCommandsLayoutNVX>; 43using UniqueIndirectCommandsLayoutNVX = UniqueHandle<vk::IndirectCommandsLayoutNVX>;
43using UniqueObjectTableNVX = UniqueHandle<vk::ObjectTableNVX>; 44using UniqueObjectTableNVX = UniqueHandle<vk::ObjectTableNVX>;
44using UniquePipeline = UniqueHandle<vk::Pipeline>; 45using UniquePipeline = UniqueHandle<vk::Pipeline>;
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
index 6953aaafe..9c323a1aa 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
@@ -9,6 +9,7 @@
9#include <fmt/format.h> 9#include <fmt/format.h>
10 10
11#include "common/assert.h" 11#include "common/assert.h"
12#include "common/dynamic_library.h"
12#include "common/logging/log.h" 13#include "common/logging/log.h"
13#include "common/telemetry.h" 14#include "common/telemetry.h"
14#include "core/core.h" 15#include "core/core.h"
@@ -53,6 +54,45 @@ VkBool32 DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT severity_,
53 return VK_FALSE; 54 return VK_FALSE;
54} 55}
55 56
57Common::DynamicLibrary OpenVulkanLibrary() {
58 Common::DynamicLibrary library;
59#ifdef __APPLE__
60 // Check if a path to a specific Vulkan library has been specified.
61 char* libvulkan_env = getenv("LIBVULKAN_PATH");
62 if (!libvulkan_env || !library.Open(libvulkan_env)) {
63 // Use the libvulkan.dylib from the application bundle.
64 std::string filename = File::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib";
65 library.Open(filename.c_str());
66 }
67#else
68 std::string filename = Common::DynamicLibrary::GetVersionedFilename("vulkan", 1);
69 if (!library.Open(filename.c_str())) {
70 // Android devices may not have libvulkan.so.1, only libvulkan.so.
71 filename = Common::DynamicLibrary::GetVersionedFilename("vulkan");
72 library.Open(filename.c_str());
73 }
74#endif
75 return library;
76}
77
78UniqueInstance CreateInstance(Common::DynamicLibrary& library, vk::DispatchLoaderDynamic& dld) {
79 PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
80 if (!library.GetSymbol("vkGetInstanceProcAddr", &vkGetInstanceProcAddr)) {
81 return UniqueInstance{};
82 }
83 dld.init(vkGetInstanceProcAddr);
84
85 const vk::ApplicationInfo application_info("yuzu", VK_MAKE_VERSION(0, 1, 0), "yuzu",
86 VK_MAKE_VERSION(0, 1, 0), VK_API_VERSION_1_1);
87 const vk::InstanceCreateInfo instance_ci({}, &application_info, 0, nullptr, 0, nullptr);
88 vk::Instance unsafe_instance;
89 if (vk::createInstance(&instance_ci, nullptr, &unsafe_instance, dld) != vk::Result::eSuccess) {
90 return UniqueInstance{};
91 }
92 dld.init(unsafe_instance, vkGetInstanceProcAddr);
93 return UniqueInstance(unsafe_instance, {nullptr, dld});
94}
95
56std::string GetReadableVersion(u32 version) { 96std::string GetReadableVersion(u32 version) {
57 return fmt::format("{}.{}.{}", VK_VERSION_MAJOR(version), VK_VERSION_MINOR(version), 97 return fmt::format("{}.{}.{}", VK_VERSION_MAJOR(version), VK_VERSION_MINOR(version),
58 VK_VERSION_PATCH(version)); 98 VK_VERSION_PATCH(version));
@@ -276,4 +316,33 @@ void RendererVulkan::Report() const {
276 telemetry_session.AddField(field, "GPU_Vulkan_Extensions", extensions); 316 telemetry_session.AddField(field, "GPU_Vulkan_Extensions", extensions);
277} 317}
278 318
319std::vector<std::string> RendererVulkan::EnumerateDevices() {
320 Common::DynamicLibrary library = OpenVulkanLibrary();
321 if (!library.IsOpen()) {
322 return {};
323 }
324 vk::DispatchLoaderDynamic dld;
325 UniqueInstance instance = CreateInstance(library, dld);
326 if (!instance) {
327 return {};
328 }
329
330 u32 num_devices;
331 if (instance->enumeratePhysicalDevices(&num_devices, nullptr, dld) != vk::Result::eSuccess) {
332 return {};
333 }
334 std::vector<vk::PhysicalDevice> devices(num_devices);
335 if (instance->enumeratePhysicalDevices(&num_devices, devices.data(), dld) !=
336 vk::Result::eSuccess) {
337 return {};
338 }
339
340 std::vector<std::string> names;
341 names.reserve(num_devices);
342 for (auto& device : devices) {
343 names.push_back(device.getProperties(dld).deviceName);
344 }
345 return names;
346}
347
279} // namespace Vulkan 348} // namespace Vulkan
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h
index d14384e79..7a17c546d 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.h
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.h
@@ -6,6 +6,7 @@
6 6
7#include <memory> 7#include <memory>
8#include <optional> 8#include <optional>
9#include <string>
9#include <vector> 10#include <vector>
10 11
11#include "video_core/renderer_base.h" 12#include "video_core/renderer_base.h"
@@ -44,6 +45,8 @@ public:
44 void SwapBuffers(const Tegra::FramebufferConfig* framebuffer) override; 45 void SwapBuffers(const Tegra::FramebufferConfig* framebuffer) override;
45 bool TryPresent(int timeout_ms) override; 46 bool TryPresent(int timeout_ms) override;
46 47
48 static std::vector<std::string> EnumerateDevices();
49
47private: 50private:
48 std::optional<vk::DebugUtilsMessengerEXT> CreateDebugCallback( 51 std::optional<vk::DebugUtilsMessengerEXT> CreateDebugCallback(
49 const vk::DispatchLoaderDynamic& dldi); 52 const vk::DispatchLoaderDynamic& dldi);