diff options
author | Frederico Linhares <fred@linhares.blue> | 2024-12-31 12:32:36 -0300 |
---|---|---|
committer | Frederico Linhares <fred@linhares.blue> | 2024-12-31 19:03:51 -0300 |
commit | 736637680ac7b2cd0d0b878401a7e044fde0ee6a (patch) | |
tree | bf4feaf3f3f0e48207bf7a31ad8bcbff0f244091 /src/blucat/core.cpp | |
parent | 083e64da1d4b5b68579288bc1690ca90d3f0a2c0 (diff) |
Diffstat (limited to 'src/blucat/core.cpp')
-rw-r--r-- | src/blucat/core.cpp | 503 |
1 files changed, 0 insertions, 503 deletions
diff --git a/src/blucat/core.cpp b/src/blucat/core.cpp deleted file mode 100644 index 8478f86..0000000 --- a/src/blucat/core.cpp +++ /dev/null @@ -1,503 +0,0 @@ -/* - * Copyright 2022-2024 Frederico de Oliveira Linhares - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "core.hpp" - -namespace -{ - -#ifdef DEBUG -VKAPI_ATTR VkBool32 VKAPI_CALL -vk_debug_callback( - VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, - VkDebugUtilsMessageTypeFlagsEXT message_type, - const VkDebugUtilsMessengerCallbackDataEXT* callback_data, - void* _obj) -{ - // Set level. - Log::Level log_level; - switch(message_severity) - { - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: - log_level = Log::Level::Trace; - break; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: - log_level = Log::Level::Information; - break; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: - log_level = Log::Level::Warning; - break; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: - default: - log_level = Log::Level::Error; - break; - } - - // Log message. - BluCat::core.log.message(log_level, callback_data->pMessage); - - return VK_FALSE; -} -#endif - -void -load_threads(void *obj) -{ - auto num_threads{std::thread::hardware_concurrency() - 1}; - for(auto i{0}; i < num_threads; i++) - BluCat::core.threads.emplace_back( - BluCat::core.workers.emplace_back(&BluCat::core.job_queue)); -} - -void -unload_threads(void *obj) -{ - BluCat::core.job_queue.stop(); - for(auto &t: BluCat::core.threads) t.join(); -} - -void -load_fps(void *obj) -{ - using namespace std::chrono; - - BluCat::core.max_frame_duration = - duration<long long, std::milli>(1000 / BluCat::core.fps); - // FIXME: actually calculates the real delta time. - BluCat::core.delta_time = 1.0f / BluCat::core.fps; -} - -void -load_font_library(void *obj) -{ - FT_Error error{FT_Init_FreeType(&BluCat::core.font_library)}; - if(error) throw CommandError{"Failed to open the FreeType library."}; -} - -void -unload_font_library(void *obj) -{ - FT_Done_FreeType(BluCat::core.font_library); -} - -#ifdef DEBUG -void -load_vk_debug_callback(void *obj) -{ - PFN_vkCreateDebugUtilsMessengerEXT debug_messenger; - - // A Vulkan instance extension named VK_EXT_debug_utils and a Vulkan instance - // layer named VK_LAYER_LUNARG_standard_validation are required to enable - // this callback. These instance extension and instance layer are loaded at - // Instance::load_blucat_instance. - VkDebugUtilsMessengerCreateInfoEXT create_info; - create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; - create_info.pNext = nullptr; - create_info.messageSeverity = - VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; - create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; - create_info.pfnUserCallback = vk_debug_callback; - create_info.pUserData = nullptr; - create_info.flags = 0; - - debug_messenger = (PFN_vkCreateDebugUtilsMessengerEXT) - vkGetInstanceProcAddr(BluCat::core.vk_instance, - "vkCreateDebugUtilsMessengerEXT"); - - if(debug_messenger(BluCat::core.vk_instance, &create_info, nullptr, - &BluCat::core.vk_callback) != VK_SUCCESS) - CommandError{"Failed to setup debug callback for Vulkan."}; -} - -void -unload_vk_debug_callback(void *obj) -{ - PFN_vkDestroyDebugUtilsMessengerEXT debug_messenger; - - debug_messenger = (PFN_vkDestroyDebugUtilsMessengerEXT) - vkGetInstanceProcAddr(BluCat::core.vk_instance, - "vkDestroyDebugUtilsMessengerEXT"); - - debug_messenger(BluCat::core.vk_instance, BluCat::core.vk_callback, nullptr); -} -#endif - -void -load_devices(void *obj) -{ - uint32_t devices_count; - std::vector<VkPhysicalDevice> vk_physical_devices; - - // Enumerate physical devices - { - vkEnumeratePhysicalDevices( - BluCat::core.vk_instance, &devices_count, nullptr); - if(devices_count < 1) - CommandError{"Failed to find GPUs with Vulkan support."}; - vk_physical_devices.resize(devices_count); - vkEnumeratePhysicalDevices( - BluCat::core.vk_instance, &devices_count, vk_physical_devices.data()); - } - -#ifdef DEBUG - BluCat::core.log.message(Log::Level::Trace, "Physical devices properties"); -#endif - - BluCat::core.vk_devices.reserve(devices_count); - for(auto i = 0; i < devices_count; i++) - { - // Use swapchain on first device. - if(i == 0) - { - BluCat::core.vk_devices.emplace_back(vk_physical_devices[i], true); - BluCat::core.vk_device_with_swapchain = &BluCat::core.vk_devices[i]; - } - else - BluCat::core.vk_devices.emplace_back(vk_physical_devices[i], false); - } -} - -void -unload_devices(void *obj) -{ - BluCat::core.vk_devices.clear(); -} - -static void -load_swapchain(void *obj) -{ - try { BluCat::core.vk_swapchain = new BluCat::Swapchain(); } - catch(const CommandError &error) - { - std::string error_message{"Failed to create swapchain → "}; - error_message += error.what(); - throw CommandError{error_message}; - } -} - -void -unload_swapchain(void *obj) -{ - delete BluCat::core.vk_swapchain; -} - -void -load_framebuffer(void *obj) -{ - try - { - BluCat::core.vk_framebuffer = new BluCat::Framebuffer(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create framebuffer."}; - } -} - -void -unload_framebuffer(void *obj) -{ - delete BluCat::core.vk_framebuffer; -} - -void -load_render_pass(void *obj) -{ - try - { - BluCat::core.vk_render_pass = new BluCat::RenderPass(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create render pass."}; - } -} - -void -unload_render_pass(void *obj) -{ - delete BluCat::core.vk_render_pass; -} - -void -load_descriptor_set_layout(void *obj) -{ - try - { - BluCat::core.vk_descriptor_set_layout = new BluCat::DescriptorSetLayout(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create descriptor set layouts."}; - } -} - -void -unload_descriptor_set_layout(void *obj) -{ - delete BluCat::core.vk_descriptor_set_layout; -} - -void -load_graphics_pipeline_3d_layout(void *obj) -{ - try - { - BluCat::core.vk_graphics_pipeline_3d_layout = - new BluCat::GraphicsPipeline3DLayout(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create 3d graphics pipeline."}; - } -} - -void -unload_graphics_pipeline_3d_layout(void *obj) -{ - delete BluCat::core.vk_graphics_pipeline_3d_layout; -} - -void -load_graphics_pipeline_2d_solid_layout(void *obj) -{ - try - { - BluCat::core.vk_graphics_pipeline_2d_solid_layout = - new BluCat::GraphicsPipeline2DSolidLayout(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create 2d graphics pipeline."}; - } -} - -void -unload_graphics_pipeline_2d_solid_layout(void *obj) -{ - delete BluCat::core.vk_graphics_pipeline_2d_solid_layout; -} - -void -load_graphics_pipeline_2d_wired_layout(void *obj) -{ - try - { - BluCat::core.vk_graphics_pipeline_2d_wired_layout = - new BluCat::GraphicsPipeline2DWiredLayout(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create 2d graphics pipeline."}; - } -} - -void -unload_graphics_pipeline_2d_wired_layout(void *obj) -{ - delete BluCat::core.vk_graphics_pipeline_2d_wired_layout; -} - -void -load_light(void *obj) -{ - try - { - BluCat::core.vk_light = new BluCat::Light(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to descriptor sets for light."}; - } -} - -void -unload_light(void *obj) -{ - delete BluCat::core.vk_light; -} - -void -load_graphics_pipeline_3d(void *obj) -{ - try - { - BluCat::core.vk_graphics_pipeline_3d = - std::make_unique<BluCat::GraphicsPipeline3D>(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create 3d graphics pipeline."}; - } -} - -void -unload_graphics_pipeline_3d(void *obj) -{ - BluCat::core.vk_graphics_pipeline_3d = nullptr; -} - -void -load_graphics_pipeline_3d_skeletal(void *obj) -{ - try - { - BluCat::core.vk_graphics_pipeline_3d_skeletal = - std::make_unique<BluCat::GraphicsPipeline3DSkeletal>(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create 3d skeletal graphics pipeline."}; - } -} - -void -unload_graphics_pipeline_3d_skeletal(void *obj) -{ - BluCat::core.vk_graphics_pipeline_3d_skeletal = nullptr; -} - -void -load_graphics_pipeline_sprite_3d(void *obj) -{ - try - { - BluCat::core.vk_graphics_pipeline_sprite_3d = - std::make_unique<BluCat::GraphicsPipelineSprite3D>(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create sprite 3d graphics pipeline."}; - } -} - -void -unload_graphics_pipeline_sprite_3d(void *obj) -{ - BluCat::core.vk_graphics_pipeline_sprite_3d = nullptr; -} - -void -load_graphics_pipeline_2d_solid(void *obj) -{ - try - { - BluCat::core.vk_graphics_pipeline_2d_solid = - std::make_unique<BluCat::GraphicsPipeline2DSolid>(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create 2d graphics pipeline."}; - } -} - -void -unload_graphics_pipeline_2d_solid(void *obj) -{ - BluCat::core.vk_graphics_pipeline_2d_solid = nullptr; -} - -void -load_graphics_pipeline_2d_wired(void *obj) -{ - try - { - BluCat::core.vk_graphics_pipeline_2d_wired = - std::make_unique<BluCat::GraphicsPipeline2DWired>(); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create 2d graphics pipeline."}; - } -} - -void -unload_graphics_pipeline_2d_wired(void *obj) -{ - BluCat::core.vk_graphics_pipeline_2d_wired = nullptr; -} - -void -load_renderer(void *obj) -{ - try - { - glm::vec4 region( - 0.f, 0.f, - static_cast<float>(BluCat::core.display_width), - static_cast<float>(BluCat::core.display_height)); - BluCat::core.vk_renderer = new BluCat::Renderer( - {}, - {std::make_shared<BluCat::View3D>(region, region.z, region.w)}); - } - catch(const CommandError &e) - { - throw CommandError{"Failed to create renderer."}; - } -} - -void -unload_renderer(void *obj) -{ - delete BluCat::core.vk_renderer; -} - -} - -namespace BluCat -{ - -std::random_device random_seed; -std::mt19937 random_number_generator; - -const CommandChain Core::loader{ - {&load_threads, &unload_threads}, - {&load_fps, nullptr}, - {&load_font_library, &unload_font_library}, -#ifdef DEBUG - {&load_vk_debug_callback, &unload_vk_debug_callback}, -#endif - {&load_devices, &unload_devices}, - {&load_swapchain, &unload_swapchain}, - - {&load_render_pass, &unload_render_pass}, - {&load_framebuffer, &unload_framebuffer}, - {&load_descriptor_set_layout, &unload_descriptor_set_layout}, - {&load_graphics_pipeline_3d_layout, - &unload_graphics_pipeline_3d_layout}, - {&load_graphics_pipeline_2d_solid_layout, - &unload_graphics_pipeline_2d_solid_layout}, - {&load_graphics_pipeline_2d_wired_layout, - &unload_graphics_pipeline_2d_wired_layout}, - {&load_light, &unload_light}, - {&load_graphics_pipeline_3d_skeletal, - &unload_graphics_pipeline_3d_skeletal}, - {&load_graphics_pipeline_3d, &unload_graphics_pipeline_3d}, - {&load_graphics_pipeline_sprite_3d, - &unload_graphics_pipeline_sprite_3d}, - {&load_graphics_pipeline_2d_solid, &unload_graphics_pipeline_2d_solid}, - {&load_graphics_pipeline_2d_wired, &unload_graphics_pipeline_2d_wired}, - {&load_renderer, &unload_renderer}, -}; - -Core core; - -} |