mirror of
https://github.com/PancakeTAS/lsfg-vk.git
synced 2025-10-30 07:01:10 +00:00
second batch of original vulkan pointers alongside basic hooks
This commit is contained in:
parent
f31b5842d8
commit
e9bee45a36
6 changed files with 159 additions and 4 deletions
|
|
@ -20,6 +20,7 @@ add_subdirectory(lsfg-vk-gen)
|
|||
|
||||
file(GLOB SOURCES
|
||||
"src/loader/*.cpp"
|
||||
"src/vulkan/*.cpp"
|
||||
"src/*.cpp"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -10,17 +10,44 @@ namespace Vulkan::Funcs {
|
|||
///
|
||||
void initialize();
|
||||
|
||||
///
|
||||
/// Initialize the instance Vulkan function pointers.
|
||||
///
|
||||
/// @param instance The Vulkan instance to initialize.
|
||||
///
|
||||
void initializeInstance(VkInstance instance);
|
||||
|
||||
///
|
||||
/// Initialize the device Vulkan function pointers.
|
||||
///
|
||||
/// @param device The Vulkan device to initialize.
|
||||
///
|
||||
void initializeDevice(VkDevice device);
|
||||
|
||||
/// Call to the original vkCreateInstance function.
|
||||
VkResult vkCreateInstanceOriginal(
|
||||
VkResult ovkCreateInstance(
|
||||
const VkInstanceCreateInfo* pCreateInfo,
|
||||
const VkAllocationCallbacks* pAllocator,
|
||||
VkInstance* pInstance
|
||||
);
|
||||
/// Call to the original vkDestroyInstance function.
|
||||
void vkDestroyInstanceOriginal(
|
||||
void ovkDestroyInstance(
|
||||
VkInstance instance,
|
||||
const VkAllocationCallbacks* pAllocator
|
||||
);
|
||||
|
||||
/// Call to the original vkCreateDevice function.
|
||||
VkResult ovkCreateDevice(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
const VkDeviceCreateInfo* pCreateInfo,
|
||||
const VkAllocationCallbacks* pAllocator,
|
||||
VkDevice* pDevice
|
||||
);
|
||||
/// Call to the original vkDestroyDevice function.
|
||||
void ovkDestroyDevice(
|
||||
VkDevice device,
|
||||
const VkAllocationCallbacks* pAllocator
|
||||
);
|
||||
}
|
||||
|
||||
#endif // FUNCS_HPP
|
||||
|
|
|
|||
13
include/vulkan/hooks.hpp
Normal file
13
include/vulkan/hooks.hpp
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#ifndef HOOKS_HPP
|
||||
#define HOOKS_HPP
|
||||
|
||||
namespace Vulkan::Hooks {
|
||||
|
||||
///
|
||||
/// Install overrides for hooked Vulkan functions.
|
||||
///
|
||||
void initialize();
|
||||
|
||||
}
|
||||
|
||||
#endif // HOOKS_HPP
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
#include "loader/dl.hpp"
|
||||
#include "loader/vk.hpp"
|
||||
#include "vulkan/funcs.hpp"
|
||||
#include "vulkan/hooks.hpp"
|
||||
#include "log.hpp"
|
||||
|
||||
extern "C" void __attribute__((constructor)) init();
|
||||
|
|
@ -11,6 +13,12 @@ void init() {
|
|||
// hook loaders
|
||||
Loader::DL::initialize();
|
||||
Loader::VK::initialize();
|
||||
|
||||
// setup vulkan stuff
|
||||
Vulkan::Funcs::initialize();
|
||||
Vulkan::Hooks::initialize();
|
||||
|
||||
Log::info("lsfg-vk: init() completed successfully");
|
||||
}
|
||||
|
||||
void deinit() {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include "vulkan/funcs.hpp"
|
||||
#include "loader/dl.hpp"
|
||||
#include "loader/vk.hpp"
|
||||
#include "log.hpp"
|
||||
|
||||
using namespace Vulkan;
|
||||
|
|
@ -7,6 +8,9 @@ using namespace Vulkan;
|
|||
namespace {
|
||||
PFN_vkCreateInstance vkCreateInstance_ptr{};
|
||||
PFN_vkDestroyInstance vkDestroyInstance_ptr{};
|
||||
|
||||
PFN_vkCreateDevice vkCreateDevice_ptr{};
|
||||
PFN_vkDestroyDevice vkDestroyDevice_ptr{};
|
||||
}
|
||||
|
||||
void Funcs::initialize() {
|
||||
|
|
@ -28,17 +32,53 @@ void Funcs::initialize() {
|
|||
Log::debug("lsfg-vk(funcs): Initialized global Vulkan functions with original pointers");
|
||||
}
|
||||
|
||||
void Funcs::initializeInstance(VkInstance instance) {
|
||||
if (vkCreateDevice_ptr || vkDestroyDevice_ptr) {
|
||||
Log::warn("lsfg-vk(funcs): Instance Vulkan functions already initialized, did you call it twice?");
|
||||
return;
|
||||
}
|
||||
|
||||
vkCreateDevice_ptr = reinterpret_cast<PFN_vkCreateDevice>(
|
||||
Loader::VK::ovkGetInstanceProcAddr(instance, "vkCreateDevice"));
|
||||
vkDestroyDevice_ptr = reinterpret_cast<PFN_vkDestroyDevice>(
|
||||
Loader::VK::ovkGetInstanceProcAddr(instance, "vkDestroyDevice"));
|
||||
if (!vkCreateDevice_ptr || !vkDestroyDevice_ptr) {
|
||||
Log::error("lsfg-vk(funcs): Failed to initialize Vulkan instance functions, missing symbols");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
Log::debug("lsfg-vk(funcs): Initialized instance Vulkan functions with original pointers");
|
||||
}
|
||||
|
||||
void Funcs::initializeDevice(VkDevice device) {
|
||||
Log::debug("lsfg-vk(funcs): Initialized device Vulkan functions with original pointers");
|
||||
}
|
||||
|
||||
// original function calls
|
||||
|
||||
VkResult Funcs::vkCreateInstanceOriginal(
|
||||
VkResult Funcs::ovkCreateInstance(
|
||||
const VkInstanceCreateInfo* pCreateInfo,
|
||||
const VkAllocationCallbacks* pAllocator,
|
||||
VkInstance* pInstance) {
|
||||
return vkCreateInstance_ptr(pCreateInfo, pAllocator, pInstance);
|
||||
}
|
||||
|
||||
void Funcs::vkDestroyInstanceOriginal(
|
||||
void Funcs::ovkDestroyInstance(
|
||||
VkInstance instance,
|
||||
const VkAllocationCallbacks* pAllocator) {
|
||||
vkDestroyInstance_ptr(instance, pAllocator);
|
||||
}
|
||||
|
||||
VkResult Funcs::ovkCreateDevice(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
const VkDeviceCreateInfo* pCreateInfo,
|
||||
const VkAllocationCallbacks* pAllocator,
|
||||
VkDevice* pDevice) {
|
||||
return vkCreateDevice_ptr(physicalDevice, pCreateInfo, pAllocator, pDevice);
|
||||
}
|
||||
|
||||
void Funcs::ovkDestroyDevice(
|
||||
VkDevice device,
|
||||
const VkAllocationCallbacks* pAllocator) {
|
||||
vkDestroyDevice_ptr(device, pAllocator);
|
||||
}
|
||||
|
|
|
|||
66
src/vulkan/hooks.cpp
Normal file
66
src/vulkan/hooks.cpp
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
#include "vulkan/hooks.hpp"
|
||||
#include "vulkan/funcs.hpp"
|
||||
#include "loader/dl.hpp"
|
||||
#include "loader/vk.hpp"
|
||||
#include "log.hpp"
|
||||
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
using namespace Vulkan;
|
||||
|
||||
namespace {
|
||||
bool initialized{false};
|
||||
|
||||
VkResult myvkCreateInstance(
|
||||
const VkInstanceCreateInfo* pCreateInfo,
|
||||
const VkAllocationCallbacks* pAllocator,
|
||||
VkInstance* pInstance) {
|
||||
auto res = Funcs::ovkCreateInstance(pCreateInfo, pAllocator, pInstance);
|
||||
|
||||
Funcs::initializeInstance(*pInstance);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
VkResult myvkCreateDevice(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
const VkDeviceCreateInfo* pCreateInfo,
|
||||
const VkAllocationCallbacks* pAllocator,
|
||||
VkDevice* pDevice) {
|
||||
auto res = Funcs::ovkCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
|
||||
|
||||
Funcs::initializeDevice(*pDevice);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Hooks::initialize() {
|
||||
if (initialized) {
|
||||
Log::warn("Vulkan hooks already initialized, did you call it twice?");
|
||||
return;
|
||||
}
|
||||
|
||||
// register hooks to vulkan loader
|
||||
Loader::VK::registerSymbol("vkCreateInstance",
|
||||
reinterpret_cast<void*>(myvkCreateInstance));
|
||||
Loader::VK::registerSymbol("vkCreateDevice",
|
||||
reinterpret_cast<void*>(myvkCreateDevice));
|
||||
|
||||
// register hooks to dynamic loader under libvulkan.so.1
|
||||
Loader::DL::File vk1("libvulkan.so.1");
|
||||
vk1.defineSymbol("vkCreateInstance",
|
||||
reinterpret_cast<void*>(myvkCreateInstance));
|
||||
vk1.defineSymbol("vkCreateDevice",
|
||||
reinterpret_cast<void*>(myvkCreateDevice));
|
||||
Loader::DL::registerFile(vk1);
|
||||
|
||||
// register hooks to dynamic loader under libvulkan.so
|
||||
Loader::DL::File vk2("libvulkan.so");
|
||||
vk2.defineSymbol("vkCreateInstance",
|
||||
reinterpret_cast<void*>(myvkCreateInstance));
|
||||
vk2.defineSymbol("vkCreateDevice",
|
||||
reinterpret_cast<void*>(myvkCreateDevice));
|
||||
Loader::DL::registerFile(vk2);
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue