mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-25 23:29:44 -06:00
Merge pull request #7943 from stenzek/vulkan-android-library-load
Vulkan: Fix library load failure on Android
This commit is contained in:
@ -100,6 +100,19 @@ VkInstance VulkanContext::CreateVulkanInstance(WindowSystemType wstype, bool ena
|
|||||||
app_info.engineVersion = VK_MAKE_VERSION(5, 0, 0);
|
app_info.engineVersion = VK_MAKE_VERSION(5, 0, 0);
|
||||||
app_info.apiVersion = VK_MAKE_VERSION(1, 0, 0);
|
app_info.apiVersion = VK_MAKE_VERSION(1, 0, 0);
|
||||||
|
|
||||||
|
// Try for Vulkan 1.1 if the loader supports it.
|
||||||
|
if (vkEnumerateInstanceVersion)
|
||||||
|
{
|
||||||
|
u32 supported_api_version = 0;
|
||||||
|
VkResult res = vkEnumerateInstanceVersion(&supported_api_version);
|
||||||
|
if (res == VK_SUCCESS && (VK_VERSION_MAJOR(supported_api_version) > 1 ||
|
||||||
|
VK_VERSION_MINOR(supported_api_version) >= 1))
|
||||||
|
{
|
||||||
|
// The device itself may not support 1.1, so we check that before using any 1.1 functionality.
|
||||||
|
app_info.apiVersion = VK_MAKE_VERSION(1, 1, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VkInstanceCreateInfo instance_create_info = {};
|
VkInstanceCreateInfo instance_create_info = {};
|
||||||
instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||||
instance_create_info.pNext = nullptr;
|
instance_create_info.pNext = nullptr;
|
||||||
@ -868,9 +881,13 @@ void VulkanContext::InitDriverDetails()
|
|||||||
|
|
||||||
void VulkanContext::PopulateShaderSubgroupSupport()
|
void VulkanContext::PopulateShaderSubgroupSupport()
|
||||||
{
|
{
|
||||||
// If this function isn't available, we don't support Vulkan 1.1.
|
// Vulkan 1.1 support is required for vkGetPhysicalDeviceProperties2(), but we can't rely on the
|
||||||
if (!vkGetPhysicalDeviceProperties2)
|
// function pointer alone.
|
||||||
|
if (!vkGetPhysicalDeviceProperties2 || (VK_VERSION_MAJOR(m_device_properties.apiVersion) == 1 &&
|
||||||
|
VK_VERSION_MINOR(m_device_properties.apiVersion) < 1))
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
VkPhysicalDeviceProperties2 device_properties_2 = {};
|
VkPhysicalDeviceProperties2 device_properties_2 = {};
|
||||||
device_properties_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
|
device_properties_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
|
||||||
|
@ -15,6 +15,7 @@ VULKAN_MODULE_ENTRY_POINT(vkGetInstanceProcAddr, true)
|
|||||||
VULKAN_MODULE_ENTRY_POINT(vkGetDeviceProcAddr, true)
|
VULKAN_MODULE_ENTRY_POINT(vkGetDeviceProcAddr, true)
|
||||||
VULKAN_MODULE_ENTRY_POINT(vkEnumerateInstanceExtensionProperties, true)
|
VULKAN_MODULE_ENTRY_POINT(vkEnumerateInstanceExtensionProperties, true)
|
||||||
VULKAN_MODULE_ENTRY_POINT(vkEnumerateInstanceLayerProperties, true)
|
VULKAN_MODULE_ENTRY_POINT(vkEnumerateInstanceLayerProperties, true)
|
||||||
|
VULKAN_MODULE_ENTRY_POINT(vkEnumerateInstanceVersion, false)
|
||||||
|
|
||||||
#endif // VULKAN_MODULE_ENTRY_POINT
|
#endif // VULKAN_MODULE_ENTRY_POINT
|
||||||
|
|
||||||
|
@ -37,32 +37,32 @@ static void ResetVulkanLibraryFunctionPointers()
|
|||||||
|
|
||||||
static Common::DynamicLibrary s_vulkan_module;
|
static Common::DynamicLibrary s_vulkan_module;
|
||||||
|
|
||||||
static std::string GetVulkanLibraryFilename()
|
static bool OpenVulkanLibrary()
|
||||||
{
|
{
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
// Check if a path to a specific Vulkan library has been specified.
|
// Check if a path to a specific Vulkan library has been specified.
|
||||||
char* libvulkan_env = getenv("LIBVULKAN_PATH");
|
char* libvulkan_env = getenv("LIBVULKAN_PATH");
|
||||||
if (libvulkan_env)
|
if (libvulkan_env && s_vulkan_module.Open(libvulkan_env))
|
||||||
return std::string(libvulkan_env);
|
return true;
|
||||||
|
|
||||||
// Use the libvulkan.dylib from the application bundle.
|
// Use the libvulkan.dylib from the application bundle.
|
||||||
return File::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib";
|
std::string filename = File::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib";
|
||||||
|
return s_vulkan_module.Open(filename.c_str());
|
||||||
#else
|
#else
|
||||||
return Common::DynamicLibrary::GetVersionedFilename("vulkan", 1);
|
std::string filename = Common::DynamicLibrary::GetVersionedFilename("vulkan", 1);
|
||||||
|
if (s_vulkan_module.Open(filename.c_str()))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Android devices may not have libvulkan.so.1, only libvulkan.so.
|
||||||
|
filename = Common::DynamicLibrary::GetVersionedFilename("vulkan");
|
||||||
|
return s_vulkan_module.Open(filename.c_str());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LoadVulkanLibrary()
|
bool LoadVulkanLibrary()
|
||||||
{
|
{
|
||||||
if (!s_vulkan_module.IsOpen())
|
if (!s_vulkan_module.IsOpen() && !OpenVulkanLibrary())
|
||||||
{
|
|
||||||
const std::string filename = GetVulkanLibraryFilename();
|
|
||||||
if (!s_vulkan_module.Open(filename.c_str()))
|
|
||||||
{
|
|
||||||
ERROR_LOG(VIDEO, "Failed to load %s", filename.c_str());
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define VULKAN_MODULE_ENTRY_POINT(name, required) \
|
#define VULKAN_MODULE_ENTRY_POINT(name, required) \
|
||||||
if (!s_vulkan_module.GetSymbol(#name, &name) && required) \
|
if (!s_vulkan_module.GetSymbol(#name, &name) && required) \
|
||||||
|
Reference in New Issue
Block a user