mirror of
https://github.com/PancakeTAS/lsfg-vk.git
synced 2025-10-30 07:01:10 +00:00
base application class
This commit is contained in:
parent
e9bee45a36
commit
b4e00d2d65
3 changed files with 97 additions and 1 deletions
45
include/application.hpp
Normal file
45
include/application.hpp
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
#ifndef APPLICATION_HPP
|
||||||
|
#define APPLICATION_HPP
|
||||||
|
|
||||||
|
#include <vulkan/vulkan_core.h>
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Main application class, wrapping around the Vulkan device.
|
||||||
|
///
|
||||||
|
class Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Create the application.
|
||||||
|
///
|
||||||
|
/// @param device Vulkan device
|
||||||
|
/// @param physicalDevice Vulkan physical device
|
||||||
|
///
|
||||||
|
/// @throws std::invalid_argument if the device or physicalDevice is null.
|
||||||
|
/// @throws LSFG::vulkan_error if any Vulkan call fails.
|
||||||
|
///
|
||||||
|
Application(VkDevice device, VkPhysicalDevice physicalDevice);
|
||||||
|
|
||||||
|
/// Get the Vulkan device.
|
||||||
|
[[nodiscard]] VkDevice getDevice() const { return this->device; }
|
||||||
|
/// Get the Vulkan physical device.
|
||||||
|
[[nodiscard]] VkPhysicalDevice getPhysicalDevice() const { return this->physicalDevice; }
|
||||||
|
|
||||||
|
// Non-copyable and non-movable
|
||||||
|
Application(const Application&) = delete;
|
||||||
|
Application& operator=(const Application&) = delete;
|
||||||
|
Application(Application&&) = delete;
|
||||||
|
Application& operator=(Application&&) = delete;
|
||||||
|
|
||||||
|
/// Destructor, cleans up resources.
|
||||||
|
~Application() = default; // no resources to clean up as of right now.
|
||||||
|
private:
|
||||||
|
// (non-owned resources)
|
||||||
|
VkDevice device;
|
||||||
|
VkPhysicalDevice physicalDevice;
|
||||||
|
|
||||||
|
// (owned resources)
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // APPLICATION_HPP
|
||||||
9
src/application.cpp
Normal file
9
src/application.cpp
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
#include "application.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
Application::Application(VkDevice device, VkPhysicalDevice physicalDevice)
|
||||||
|
: device(device), physicalDevice(physicalDevice) {
|
||||||
|
if (device == VK_NULL_HANDLE || physicalDevice == VK_NULL_HANDLE)
|
||||||
|
throw std::invalid_argument("Invalid Vulkan device or physical device");
|
||||||
|
}
|
||||||
|
|
@ -2,14 +2,18 @@
|
||||||
#include "vulkan/funcs.hpp"
|
#include "vulkan/funcs.hpp"
|
||||||
#include "loader/dl.hpp"
|
#include "loader/dl.hpp"
|
||||||
#include "loader/vk.hpp"
|
#include "loader/vk.hpp"
|
||||||
|
#include "application.hpp"
|
||||||
#include "log.hpp"
|
#include "log.hpp"
|
||||||
|
|
||||||
#include <vulkan/vulkan_core.h>
|
#include <lsfg.hpp>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
using namespace Vulkan;
|
using namespace Vulkan;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
bool initialized{false};
|
bool initialized{false};
|
||||||
|
std::optional<Application> application;
|
||||||
|
|
||||||
VkResult myvkCreateInstance(
|
VkResult myvkCreateInstance(
|
||||||
const VkInstanceCreateInfo* pCreateInfo,
|
const VkInstanceCreateInfo* pCreateInfo,
|
||||||
|
|
@ -31,9 +35,41 @@ namespace {
|
||||||
|
|
||||||
Funcs::initializeDevice(*pDevice);
|
Funcs::initializeDevice(*pDevice);
|
||||||
|
|
||||||
|
// create the main application
|
||||||
|
if (application.has_value()) {
|
||||||
|
Log::error("Application already initialized, are you trying to create a second device?");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
application.emplace(*pDevice, physicalDevice);
|
||||||
|
Log::info("lsfg-vk(hooks): Application created successfully");
|
||||||
|
} catch (const LSFG::vulkan_error& e) {
|
||||||
|
Log::error("Encountered Vulkan error {:x} while creating application: {}",
|
||||||
|
static_cast<uint32_t>(e.error()), e.what());
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
Log::error("Encountered error while creating application: {}", e.what());
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void myvkDestroyDevice(
|
||||||
|
VkDevice device,
|
||||||
|
const VkAllocationCallbacks* pAllocator) {
|
||||||
|
// destroy the main application
|
||||||
|
if (application.has_value()) {
|
||||||
|
application.reset();
|
||||||
|
Log::info("lsfg-vk(hooks): Application destroyed successfully");
|
||||||
|
} else {
|
||||||
|
Log::warn("lsfg-vk(hooks): No application to destroy, continuing");
|
||||||
|
}
|
||||||
|
|
||||||
|
Funcs::ovkDestroyDevice(device, pAllocator);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Hooks::initialize() {
|
void Hooks::initialize() {
|
||||||
|
|
@ -47,6 +83,8 @@ void Hooks::initialize() {
|
||||||
reinterpret_cast<void*>(myvkCreateInstance));
|
reinterpret_cast<void*>(myvkCreateInstance));
|
||||||
Loader::VK::registerSymbol("vkCreateDevice",
|
Loader::VK::registerSymbol("vkCreateDevice",
|
||||||
reinterpret_cast<void*>(myvkCreateDevice));
|
reinterpret_cast<void*>(myvkCreateDevice));
|
||||||
|
Loader::VK::registerSymbol("vkDestroyDevice",
|
||||||
|
reinterpret_cast<void*>(myvkDestroyDevice));
|
||||||
|
|
||||||
// register hooks to dynamic loader under libvulkan.so.1
|
// register hooks to dynamic loader under libvulkan.so.1
|
||||||
Loader::DL::File vk1("libvulkan.so.1");
|
Loader::DL::File vk1("libvulkan.so.1");
|
||||||
|
|
@ -54,6 +92,8 @@ void Hooks::initialize() {
|
||||||
reinterpret_cast<void*>(myvkCreateInstance));
|
reinterpret_cast<void*>(myvkCreateInstance));
|
||||||
vk1.defineSymbol("vkCreateDevice",
|
vk1.defineSymbol("vkCreateDevice",
|
||||||
reinterpret_cast<void*>(myvkCreateDevice));
|
reinterpret_cast<void*>(myvkCreateDevice));
|
||||||
|
vk1.defineSymbol("vkDestroyDevice",
|
||||||
|
reinterpret_cast<void*>(myvkDestroyDevice));
|
||||||
Loader::DL::registerFile(vk1);
|
Loader::DL::registerFile(vk1);
|
||||||
|
|
||||||
// register hooks to dynamic loader under libvulkan.so
|
// register hooks to dynamic loader under libvulkan.so
|
||||||
|
|
@ -62,5 +102,7 @@ void Hooks::initialize() {
|
||||||
reinterpret_cast<void*>(myvkCreateInstance));
|
reinterpret_cast<void*>(myvkCreateInstance));
|
||||||
vk2.defineSymbol("vkCreateDevice",
|
vk2.defineSymbol("vkCreateDevice",
|
||||||
reinterpret_cast<void*>(myvkCreateDevice));
|
reinterpret_cast<void*>(myvkCreateDevice));
|
||||||
|
vk2.defineSymbol("vkDestroyDevice",
|
||||||
|
reinterpret_cast<void*>(myvkDestroyDevice));
|
||||||
Loader::DL::registerFile(vk2);
|
Loader::DL::registerFile(vk2);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue