From 7aec01ccc8658122d902fb5b05437a3e967f539d Mon Sep 17 00:00:00 2001 From: Jiga228 Date: Tue, 23 Jun 2026 17:46:21 +0700 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=B5=D1=81=20=D1=83=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20VkInstance?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Core/CoreInstance.hpp | 2 - RenderEngineSDK/RenderEngineBase.cpp | 6 +- RenderEngineSDK/RenderEngineBase.hpp | 2 +- .../RenderEngine/UwURenderEngine.cpp | 94 ++----------------- .../RenderEngine/UwURenderEngine.hpp | 10 +- .../RenderEngine/VkObjects/Instance.cpp | 86 +++++++++++++++++ .../RenderEngine/VkObjects/Instance.hpp | 30 ++++++ 7 files changed, 130 insertions(+), 100 deletions(-) create mode 100644 UwURenderEngine/RenderEngine/VkObjects/Instance.cpp create mode 100644 UwURenderEngine/RenderEngine/VkObjects/Instance.hpp diff --git a/Core/Core/CoreInstance.hpp b/Core/Core/CoreInstance.hpp index fe43957..37c159c 100644 --- a/Core/Core/CoreInstance.hpp +++ b/Core/Core/CoreInstance.hpp @@ -10,7 +10,6 @@ class SaveMap; class RenderEngineBase; class GameInstance; -struct GLFWwindow; /* * Внимательно следите, что бы у ваших объектов была "мягкая" зависимость @@ -42,7 +41,6 @@ class CoreInstance { double memorySize_ = 0; std::list modules_; - GLFWwindow* window_ = nullptr; RenderEngineBase* render_engine_ = nullptr; GameInstance* game_ = nullptr; diff --git a/RenderEngineSDK/RenderEngineBase.cpp b/RenderEngineSDK/RenderEngineBase.cpp index 7029ab3..a0c39c9 100644 --- a/RenderEngineSDK/RenderEngineBase.cpp +++ b/RenderEngineSDK/RenderEngineBase.cpp @@ -2,7 +2,9 @@ #include -RenderEngineBase::RenderEngineBase() +#include "Core/CoreInstance.hpp" + +RenderEngineBase::RenderEngineBase(CoreInstance& core) { if (!glfwInit()) throw std::runtime_error("Fail init glfw"); @@ -10,7 +12,7 @@ RenderEngineBase::RenderEngineBase() glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - window_ = glfwCreateWindow(800, 600, "UwU Engine", nullptr, nullptr); + window_ = glfwCreateWindow(800, 600, core.getGameName().c_str(), nullptr, nullptr); if (window_ == nullptr) throw std::runtime_error("Fail create window"); } diff --git a/RenderEngineSDK/RenderEngineBase.hpp b/RenderEngineSDK/RenderEngineBase.hpp index 565cb48..6e24196 100644 --- a/RenderEngineSDK/RenderEngineBase.hpp +++ b/RenderEngineSDK/RenderEngineBase.hpp @@ -10,7 +10,7 @@ class RenderEngineBase GLFWwindow* window_ = nullptr; public: - explicit RenderEngineBase(); + explicit RenderEngineBase(CoreInstance& core); virtual ~RenderEngineBase(); virtual void start() = 0; diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp index 562088d..c394205 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp @@ -24,26 +24,6 @@ const std::vector UwURenderEngine::deviceExtensions = { RENDER_ENGINE_FACTORY_GENERATE(UwURenderEngine) -#ifdef _DEBUG -static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( - VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, - VkDebugUtilsMessageTypeFlagsEXT messageType, - const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, - void* pUserData) { - - std::string msg = "validation layer: "; - msg += pCallbackData->pMessage; - Loging::Log(msg); - - return VK_FALSE; -} - -VkResult UwURenderEngine::enable_layer_validation(const VkDebugUtilsMessengerCreateInfoEXT* create_info) -{ - PFN_vkCreateDebugUtilsMessengerEXT debug_creator = reinterpret_cast(vkGetInstanceProcAddr(instance_, "vkCreateDebugUtilsMessengerEXT")); - return debug_creator(instance_, create_info, nullptr, &debug_messenger_); -} -#endif UwURenderEngine::SwapchainSupportDetails UwURenderEngine::query_swapchain_details() const { @@ -64,18 +44,6 @@ UwURenderEngine::SwapchainSupportDetails UwURenderEngine::query_swapchain_detail return details; } -std::vector UwURenderEngine::get_required_extensions() -{ - uint32_t extensions_count = 0; - const char** glfw_extension = glfwGetRequiredInstanceExtensions(&extensions_count); - std::vector extensions(glfw_extension, glfw_extension + extensions_count); - -#ifdef _DEBUG - extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); -#endif - return extensions; -} - bool UwURenderEngine::is_device_suitable(VkPhysicalDevice device, VkSurfaceKHR surface) { VkPhysicalDeviceProperties device_properties; @@ -221,50 +189,13 @@ VkShaderModule UwURenderEngine::create_shader_module(const std::string& code) co return shader_module; } -void UwURenderEngine::create_instance() -{ - std::vector extensions = get_required_extensions(); - - VkApplicationInfo app_info{}; - app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - app_info.apiVersion = VK_API_VERSION_1_0; - app_info.applicationVersion = VK_MAKE_VERSION(0, 0, 0); - app_info.pApplicationName = core_.getGameName().c_str(); - app_info.pEngineName = "UwU Engine"; - app_info.engineVersion = VK_MAKE_VERSION(0, 0, 0); - - - VkInstanceCreateInfo instance_create_info{}; - instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - instance_create_info.pApplicationInfo = &app_info; - instance_create_info.enabledExtensionCount = static_cast(extensions.size()); - instance_create_info.ppEnabledExtensionNames = extensions.data(); -#ifdef _DEBUG - const std::vector layers_validation = { - "VK_LAYER_KHRONOS_validation" - }; - instance_create_info.enabledLayerCount = static_cast(layers_validation.size()); - instance_create_info.ppEnabledLayerNames = layers_validation.data(); - VkDebugUtilsMessengerCreateInfoEXT debug_messenger_create_info{}; - debug_messenger_create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; - debug_messenger_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; - debug_messenger_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; - debug_messenger_create_info.pfnUserCallback = &debugCallback; - instance_create_info.pNext = &debug_messenger_create_info; -#endif - VK_CHECK(vkCreateInstance(&instance_create_info, nullptr, &instance_)) -#ifdef _DEBUG - VK_CHECK(enable_layer_validation(&debug_messenger_create_info)) -#endif -} - void UwURenderEngine::pick_physical_device() { uint32_t device_count = 0; std::vector devices; - VK_CHECK(vkEnumeratePhysicalDevices(instance_, &device_count, nullptr)) + VK_CHECK(vkEnumeratePhysicalDevices(instance_.get_native(), &device_count, nullptr)) devices.resize(device_count); - VK_CHECK(vkEnumeratePhysicalDevices(instance_, &device_count, devices.data())) + VK_CHECK(vkEnumeratePhysicalDevices(instance_.get_native(), &device_count, devices.data())) for (const auto& device : devices) { @@ -943,16 +874,13 @@ void UwURenderEngine::draw_frame() void UwURenderEngine::create_surface() { - VK_CHECK(glfwCreateWindowSurface(instance_, get_window(), nullptr, &surface_)) + VK_CHECK(glfwCreateWindowSurface(instance_.get_native(), get_window(), nullptr, &surface_)) } -UwURenderEngine::UwURenderEngine(CoreInstance& core): +UwURenderEngine::UwURenderEngine(CoreInstance& core):RenderEngineBase(core), +instance_(core), core_(core) -#ifdef _DEBUG -,debug_messenger_(nullptr) -#endif { - create_instance(); create_surface(); pick_physical_device(); create_logical_device(); @@ -1044,17 +972,7 @@ UwURenderEngine::~UwURenderEngine() vkDestroyDevice(device_, nullptr); if (surface_ != VK_NULL_HANDLE) - vkDestroySurfaceKHR(instance_, surface_, nullptr); - -#ifdef _DEBUG - if (debug_messenger_ != nullptr && instance_ != nullptr) { - PFN_vkDestroyDebugUtilsMessengerEXT destroyer_messenger = reinterpret_cast(vkGetInstanceProcAddr(instance_, "vkDestroyDebugUtilsMessengerEXT")); - destroyer_messenger(instance_, debug_messenger_, nullptr); - } -#endif - - if (instance_ != VK_NULL_HANDLE) - vkDestroyInstance(instance_, nullptr); + vkDestroySurfaceKHR(instance_.get_native(), surface_, nullptr); } void UwURenderEngine::start() diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp index 24ec707..0b6166c 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp @@ -11,6 +11,8 @@ #include #include +#include "VkObjects/Instance.hpp" + class Camera; class GPU_GarbageCollector; @@ -69,7 +71,7 @@ class UwURenderEngine : public RenderEngineBase std::weak_ptr active_camera_; std::mutex m_active_camera_; - VkInstance instance_ = VK_NULL_HANDLE; + Instance instance_; VkSurfaceKHR surface_ = VK_NULL_HANDLE; VkPhysicalDevice physical_device_ = VK_NULL_HANDLE; VkDevice device_ = VK_NULL_HANDLE; @@ -102,13 +104,8 @@ class UwURenderEngine : public RenderEngineBase std::vector image_available_semaphores_, render_finished_semaphores_; std::vector in_flight_fences_; -#ifdef _DEBUG - VkResult enable_layer_validation(const VkDebugUtilsMessengerCreateInfoEXT* create_info); - VkDebugUtilsMessengerEXT debug_messenger_; -#endif SwapchainSupportDetails query_swapchain_details() const; - static std::vector get_required_extensions(); static bool is_device_suitable(VkPhysicalDevice device, VkSurfaceKHR surface); static bool check_device_extensions_support(VkPhysicalDevice device); static QueueFamilyIndices find_queue_family_indices(VkPhysicalDevice physical_device, VkSurfaceKHR surface); @@ -117,7 +114,6 @@ class UwURenderEngine : public RenderEngineBase VkShaderModule create_shader_module(const std::string& code) const; static std::vector get_unique_family_indices(const QueueFamilyIndices& indices); - void create_instance(); void create_surface(); void pick_physical_device(); void create_logical_device(); diff --git a/UwURenderEngine/RenderEngine/VkObjects/Instance.cpp b/UwURenderEngine/RenderEngine/VkObjects/Instance.cpp new file mode 100644 index 0000000..ea69426 --- /dev/null +++ b/UwURenderEngine/RenderEngine/VkObjects/Instance.cpp @@ -0,0 +1,86 @@ +#include "Instance.hpp" + +#include "Core/CoreInstance.hpp" +#include "DeviceFunctions/DeviceFunctions.hpp" +#include "Log/Log.hpp" + +#ifdef _DEBUG +VkBool32 Instance::debugCallback( + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void* pUserData) { + + std::string msg = "validation layer: "; + msg += pCallbackData->pMessage; + Loging::Log(msg); + + return VK_FALSE; +} + +VkResult Instance::enable_layer_validation(const VkDebugUtilsMessengerCreateInfoEXT* create_info) +{ + PFN_vkCreateDebugUtilsMessengerEXT debug_creator = reinterpret_cast(vkGetInstanceProcAddr(instance_, "vkCreateDebugUtilsMessengerEXT")); + return debug_creator(instance_, create_info, nullptr, &debug_messenger_); +} +#endif + +std::vector Instance::get_required_extensions() +{ + uint32_t extensions_count = 0; + const char** glfw_extension = glfwGetRequiredInstanceExtensions(&extensions_count); + std::vector extensions(glfw_extension, glfw_extension + extensions_count); + +#ifdef _DEBUG + extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); +#endif + return extensions; +} + +Instance::Instance(CoreInstance& core) +{ + std::vector extensions = get_required_extensions(); + + VkApplicationInfo app_info{}; + app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + app_info.apiVersion = VK_API_VERSION_1_0; + app_info.applicationVersion = VK_MAKE_VERSION(0, 0, 0); + app_info.pApplicationName = core.getGameName().c_str(); + app_info.pEngineName = "UwU Engine"; + app_info.engineVersion = VK_MAKE_VERSION(0, 0, 0); + + + VkInstanceCreateInfo instance_create_info{}; + instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + instance_create_info.pApplicationInfo = &app_info; + instance_create_info.enabledExtensionCount = static_cast(extensions.size()); + instance_create_info.ppEnabledExtensionNames = extensions.data(); +#ifdef _DEBUG + const std::vector layers_validation = { + "VK_LAYER_KHRONOS_validation" + }; + instance_create_info.enabledLayerCount = static_cast(layers_validation.size()); + instance_create_info.ppEnabledLayerNames = layers_validation.data(); + VkDebugUtilsMessengerCreateInfoEXT debug_messenger_create_info{}; + debug_messenger_create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; + debug_messenger_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; + debug_messenger_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; + debug_messenger_create_info.pfnUserCallback = &Instance::debugCallback; + instance_create_info.pNext = &debug_messenger_create_info; +#endif + VK_CHECK(vkCreateInstance(&instance_create_info, nullptr, &instance_)) +#ifdef _DEBUG + VK_CHECK(enable_layer_validation(&debug_messenger_create_info)) +#endif +} + +Instance::~Instance() +{ +#ifdef _DEBUG + if (debug_messenger_ != nullptr && instance_ != nullptr) { + PFN_vkDestroyDebugUtilsMessengerEXT destroyer_messenger = reinterpret_cast(vkGetInstanceProcAddr(instance_, "vkDestroyDebugUtilsMessengerEXT")); + destroyer_messenger(instance_, debug_messenger_, nullptr); + } +#endif + vkDestroyInstance(instance_, nullptr); +} diff --git a/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp b/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp new file mode 100644 index 0000000..0d164b1 --- /dev/null +++ b/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +class CoreInstance; + +class Instance +{ + VkInstance instance_ = nullptr; + + static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void* pUserData + ); + +#ifdef _DEBUG + VkResult enable_layer_validation(const VkDebugUtilsMessengerCreateInfoEXT* create_info); + VkDebugUtilsMessengerEXT debug_messenger_; +#endif + + std::vector Instance::get_required_extensions(); +public: + Instance(CoreInstance& core); + ~Instance(); + + inline VkInstance get_native() const { return instance_; } +};