mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-04-29 14:59:26 -04:00
128 lines
2.6 KiB
C++
128 lines
2.6 KiB
C++
#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h"
|
|
#define VKFUNC_DEFINE
|
|
#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h"
|
|
|
|
#if BOOST_OS_LINUX || BOOST_OS_MACOS
|
|
#include <dlfcn.h>
|
|
#endif
|
|
|
|
bool g_vulkan_available = false;
|
|
|
|
#if BOOST_OS_WINDOWS
|
|
|
|
bool InitializeGlobalVulkan()
|
|
{
|
|
const auto hmodule = LoadLibraryA("vulkan-1.dll");
|
|
|
|
if(g_vulkan_available)
|
|
return true;
|
|
|
|
if (hmodule == nullptr)
|
|
{
|
|
cemuLog_log(LogType::Force, "Vulkan loader not available. Outdated graphics driver or Vulkan runtime not installed?");
|
|
return false;
|
|
}
|
|
|
|
#define VKFUNC_INIT
|
|
#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h"
|
|
|
|
if(!vkEnumerateInstanceVersion)
|
|
{
|
|
cemuLog_log(LogType::Force, "vkEnumerateInstanceVersion not available. Outdated graphics driver or Vulkan runtime?");
|
|
FreeLibrary(hmodule);
|
|
return false;
|
|
}
|
|
|
|
g_vulkan_available = true;
|
|
return true;
|
|
}
|
|
|
|
bool InitializeInstanceVulkan(VkInstance instance)
|
|
{
|
|
const auto hmodule = GetModuleHandleA("vulkan-1.dll");
|
|
if (hmodule == nullptr)
|
|
return false;
|
|
|
|
#define VKFUNC_INSTANCE_INIT
|
|
#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h"
|
|
|
|
return true;
|
|
}
|
|
|
|
bool InitializeDeviceVulkan(VkDevice device)
|
|
{
|
|
const auto hmodule = GetModuleHandleA("vulkan-1.dll");
|
|
if (hmodule == nullptr)
|
|
return false;
|
|
|
|
#define VKFUNC_DEVICE_INIT
|
|
#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h"
|
|
|
|
return true;
|
|
}
|
|
|
|
#else
|
|
|
|
void* dlopen_vulkan_loader()
|
|
{
|
|
#if BOOST_OS_LINUX
|
|
void* vulkan_so = dlopen("libvulkan.so", RTLD_NOW);
|
|
if(!vulkan_so)
|
|
vulkan_so = dlopen("libvulkan.so.1", RTLD_NOW);
|
|
#elif BOOST_OS_MACOS
|
|
void* vulkan_so = dlopen("libMoltenVK.dylib", RTLD_NOW);
|
|
#endif
|
|
return vulkan_so;
|
|
}
|
|
|
|
bool InitializeGlobalVulkan()
|
|
{
|
|
void* vulkan_so = dlopen_vulkan_loader();
|
|
|
|
if(g_vulkan_available)
|
|
return true;
|
|
|
|
if (!vulkan_so)
|
|
{
|
|
cemuLog_log(LogType::Force, "Vulkan loader not available.");
|
|
return false;
|
|
}
|
|
|
|
#define VKFUNC_INIT
|
|
#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h"
|
|
|
|
if(!vkEnumerateInstanceVersion)
|
|
{
|
|
cemuLog_log(LogType::Force, "vkEnumerateInstanceVersion not available. Outdated graphics driver or Vulkan runtime?");
|
|
return false;
|
|
}
|
|
|
|
g_vulkan_available = true;
|
|
return true;
|
|
}
|
|
|
|
bool InitializeInstanceVulkan(VkInstance instance)
|
|
{
|
|
void* vulkan_so = dlopen_vulkan_loader();
|
|
if (!vulkan_so)
|
|
return false;
|
|
|
|
#define VKFUNC_INSTANCE_INIT
|
|
#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h"
|
|
|
|
return true;
|
|
}
|
|
|
|
bool InitializeDeviceVulkan(VkDevice device)
|
|
{
|
|
void* vulkan_so = dlopen_vulkan_loader();
|
|
if (!vulkan_so)
|
|
return false;
|
|
|
|
#define VKFUNC_DEVICE_INIT
|
|
#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h"
|
|
|
|
return true;
|
|
}
|
|
|
|
#endif
|