Skip to content

Commit

Permalink
build-in vulkan loader
Browse files Browse the repository at this point in the history
  • Loading branch information
msemegen committed Oct 18, 2024
1 parent ca613eb commit 6e11edf
Show file tree
Hide file tree
Showing 8 changed files with 304 additions and 25 deletions.
10 changes: 9 additions & 1 deletion game/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ using namespace ::lxf::utils;

// logger config
std::string_view config::log::file_path = "log.log";
logger::Severity config::log::severity = logger::Severity::omg | logger::Severity::error | logger::Severity::info;
logger::Severity config::log::severity = logger::Severity::omg | logger::Severity::error | logger::Severity::info | logger::Severity::debug;
bool config::log::console = true;

// app config
Expand All @@ -27,6 +27,14 @@ std::string_view config::engine::name = "lxe";
Version config::engine::version = Version { 0u, 0u, 1u };

// vulkan config
bool config::vulkan::validation_layer::enabled = true;
config::vulkan::validation_layer::Severity config::vulkan::validation_layer::severity =
config::vulkan::validation_layer::Severity::info | config::vulkan::validation_layer::Severity::warning |
config::vulkan::validation_layer::Severity::error | config::vulkan::validation_layer::Severity::verbose;
config::vulkan::validation_layer::Type config::vulkan::validation_layer::type =
config::vulkan::validation_layer::Type::general | config::vulkan::validation_layer::Type::performance |
config::vulkan::validation_layer::Type::validation | config::vulkan::validation_layer::Type::device_address_binding;

Version config::vulkan::version = Version { VK_API_VERSION_1_3 };

constexpr std::string_view module_name = "game:main";
Expand Down
3 changes: 3 additions & 0 deletions lxf/canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
// std
#include <string_view>

// lxf
#include <lxf/loader.hpp>

extern VkInstance vk_instance;

namespace {
Expand Down
50 changes: 50 additions & 0 deletions lxf/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
#include <cstdint>
#include <string_view>

// platform
#include <vulkan/vulkan.h>

// lxf
#include <lxf/common/Version.hpp>
#include <lxf/common/non_constructible.hpp>
Expand Down Expand Up @@ -41,7 +44,54 @@ struct config : private common::non_constructible

struct vulkan
{
struct validation_layer : private common::non_constructible
{
enum class Severity : std::uint32_t
{
none = 0xFFFFFFFFu,
info = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT,
warning = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT,
error = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT,
verbose = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT
};
enum class Type : std::uint32_t
{
none = 0xFFFFFFFFu,
general = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT,
validation = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
performance = VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
device_address_binding = VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT
};

static bool enabled;
static Severity severity;
static Type type;
};
static common::Version version;
};
};

constexpr config::vulkan::validation_layer::Severity operator|(config::vulkan::validation_layer::Severity left_a,
config::vulkan::validation_layer::Severity right_a)
{
return static_cast<config::vulkan::validation_layer::Severity>(static_cast<std::uint64_t>(left_a) |
static_cast<std::uint64_t>(right_a));
}
constexpr config::vulkan::validation_layer::Severity operator&(config::vulkan::validation_layer::Severity left_a,
config::vulkan::validation_layer::Severity right_a)
{
return static_cast<config::vulkan::validation_layer::Severity>(static_cast<std::uint64_t>(left_a) &
static_cast<std::uint64_t>(right_a));
}

constexpr config::vulkan::validation_layer::Type operator|(config::vulkan::validation_layer::Type left_a,
config::vulkan::validation_layer::Type right_a)
{
return static_cast<config::vulkan::validation_layer::Type>(static_cast<std::uint64_t>(left_a) | static_cast<std::uint64_t>(right_a));
}
constexpr config::vulkan::validation_layer::Type operator&(config::vulkan::validation_layer::Type left_a,
config::vulkan::validation_layer::Type right_a)
{
return static_cast<config::vulkan::validation_layer::Type>(static_cast<std::uint64_t>(left_a) & static_cast<std::uint64_t>(right_a));
}
} // namespace lxf
3 changes: 3 additions & 0 deletions lxf/device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
// std
#include <limits>

// lxf
#include <lxf/loader.hpp>

namespace lxf {
using namespace common;

Expand Down
121 changes: 103 additions & 18 deletions lxf/entry_point.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,43 @@
#include <cstdint>
#include <memory>

// platform
#include <Windows.h>
#include <vulkan/vulkan.h>

// lxf
#include <lxf/Windower.hpp>
#include <lxf/common/bit.hpp>
#include <lxf/common/non_constructible.hpp>
#include <lxf/config.hpp>
#include <lxf/device.hpp>
#include <lxf/loader.hpp>
#include <lxf/system.hpp>
#include <lxf/utils/config_parser.hpp>
#include <lxf/utils/logger.hpp>

VkInstance vk_instance;
VkDebugUtilsMessengerEXT vk_debug_messenger;

PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;

// instance level functions
PFN_vkCreateDevice vkCreateDevice;
PFN_vkDestroyDevice vkDestroyDevice;
PFN_vkDestroyInstance vkDestroyInstance;
PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
#if defined(VK_KHR_win32_surface)
PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR;
#endif
#if defined(VK_KHR_surface)
PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
#endif
#if defined(VK_EXT_debug_utils)
PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;
PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;
#endif

namespace {
using namespace ::lxf;
Expand Down Expand Up @@ -107,10 +129,18 @@ BOOL enum_monitors_handler(HMONITOR monitor_handle_a, HDC, LPRECT, LPARAM user_d
return FALSE;
}

VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT,
VkDebugUtilsMessageTypeFlagsEXT,
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
void*)
{
printf("VALIDATION LAYER: %s\n", pCallbackData->pMessage);
return VK_FALSE;
}

} // namespace

namespace lxf {
namespace utils {
namespace lxf::utils {
void logger::timestamp(std::time_t timestamp_a)
{
std::tm tim;
Expand Down Expand Up @@ -171,8 +201,7 @@ const char* logger::to_string(Level level_a)
}
return "";
}
} // namespace utils
} // namespace lxf
} // namespace lxf::utils

using namespace ::lxf;
int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR p_cmd_line_a, _In_ int)
Expand Down Expand Up @@ -224,6 +253,26 @@ int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR p_cmd_line_a,
logger::set_severity(config::log::severity);
logger::write_line(logger::info, module_name, "Log started.");

bool vk_loaded = loader::load();

if (false == vk_loaded)
{
logger::write_line(logger::omg, module_name, "Vulkan not present in system");

fclose(p_log_file);

if (true == console_allocated)
{
printf("Press any key...\n");
std::ignore = getc(stdin);
FreeConsole();
}

return -1;
}

logger::write_line(logger::omg, module_name, "Vulkan successfully loaded");

// instance layers enumeration an logging
{
std::uint32_t instance_layers_count = 0;
Expand Down Expand Up @@ -275,11 +324,17 @@ int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR p_cmd_line_a,
if (false == found)
{
logger::write_line(logger::omg, module_name, "No primary display adapter found.");
return -1;
}
}

std::vector<const char*> instance_extensions = { "VK_KHR_surface", "VK_KHR_win32_surface" };
std::vector<const char*> instance_layers;

if (true == config::vulkan::validation_layer::enabled)
{
instance_extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
instance_layers.push_back("VK_LAYER_KHRONOS_validation");
}

const VkApplicationInfo application_info { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pNext = nullptr,
Expand All @@ -292,9 +347,9 @@ int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR p_cmd_line_a,
.pNext = nullptr,
.flags = 0x0u,
.pApplicationInfo = &application_info,
.enabledLayerCount = 0u, /* + gathered from config*/
.ppEnabledLayerNames = nullptr,
.enabledExtensionCount = 2u /* + gathered from config*/,
.enabledLayerCount = static_cast<std::uint32_t>(instance_layers.size()),
.ppEnabledLayerNames = instance_layers.data(),
.enabledExtensionCount = static_cast<std::uint32_t>(instance_extensions.size()),
.ppEnabledExtensionNames = instance_extensions.data() };

// instance creation
Expand All @@ -316,14 +371,34 @@ int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR p_cmd_line_a,
config::vulkan::version.get().minor,
config::vulkan::version.get().path);

if (false == instance_extensions.empty())
logger::write_line(logger::info, module_name, "Selected layers {}", vk_instance_create_info.enabledLayerCount);
for (std::uint32_t layer_index = 0u; layer_index < vk_instance_create_info.enabledLayerCount; layer_index++)
{
logger::write_line(logger::info, module_name, "Selected extensions:");
logger::write_line(logger::info, module_name, "\t - {}", vk_instance_create_info.ppEnabledLayerNames[layer_index]);
}

for (const char* p_extension_name : instance_extensions)
{
logger::write_line(logger::info, module_name, "\t - {}", p_extension_name);
}
logger::write_line(logger::info, module_name, "Selected extensions {}", vk_instance_create_info.enabledExtensionCount);
for (std::uint32_t extension_index = 0u; extension_index < vk_instance_create_info.enabledExtensionCount; extension_index++)
{
logger::write_line(logger::info, module_name, "\t - {}", vk_instance_create_info.ppEnabledExtensionNames[extension_index]);
}

if (true == config::vulkan::validation_layer::enabled)
{
assert(config::vulkan::validation_layer::Type::none != config::vulkan::validation_layer::type &&
config::vulkan::validation_layer::Severity::none != config::vulkan::validation_layer::severity);

VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo {
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
.pNext = nullptr,
.flags = 0x0u,
.messageSeverity = static_cast<VkDebugUtilsMessageSeverityFlagsEXT>(config::vulkan::validation_layer::severity),
.messageType = static_cast<VkDebugUtilsMessageTypeFlagsEXT>(config::vulkan::validation_layer::type),
.pfnUserCallback = debugCallback,
.pUserData = nullptr
};

vkCreateDebugUtilsMessengerEXT(vk_instance, &debugCreateInfo, nullptr, &vk_debug_messenger);
}
}

Expand Down Expand Up @@ -517,9 +592,19 @@ int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR p_cmd_line_a,

entry_point(p_cmd_line_a, std::span<device::GPU> { &(gpus[0]), gpus_count }, { &displays[0], displays_count }, &windower);

if (true == config::vulkan::validation_layer::enabled)
{
vkDestroyDebugUtilsMessengerEXT(vk_instance, vk_debug_messenger, nullptr);
}

vkDestroyInstance(vk_instance, nullptr);
logger::write_line(logger::info, module_name, "Vulkan instance destroyed.");

loader::close();
logger::write_line(logger::info, module_name, "Vulkan unloaded.");

logger::write_line(logger::info, module_name, "Log ended.");

fclose(p_log_file);

if (true == console_allocated)
Expand Down
Loading

0 comments on commit 6e11edf

Please sign in to comment.