diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp index c394205..73f656c 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp @@ -29,17 +29,17 @@ UwURenderEngine::SwapchainSupportDetails UwURenderEngine::query_swapchain_detail { SwapchainSupportDetails details; - vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device_, surface_, &details.capabilities); + vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device_, surface_.get_native(), &details.capabilities); uint32_t surface_format_cnt = 0; - VK_CHECK(vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device_, surface_, &surface_format_cnt, nullptr)) + VK_CHECK(vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device_, surface_.get_native(), &surface_format_cnt, nullptr)) details.formats.resize(surface_format_cnt); - VK_CHECK(vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device_, surface_, &surface_format_cnt, details.formats.data())) + VK_CHECK(vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device_, surface_.get_native(), &surface_format_cnt, details.formats.data())) uint32_t present_modes_cnt = 0; - VK_CHECK(vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device_, surface_, &present_modes_cnt, nullptr)) + VK_CHECK(vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device_, surface_.get_native(), &present_modes_cnt, nullptr)) details.present_modes.resize(surface_format_cnt); - VK_CHECK(vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device_, surface_, &present_modes_cnt, details.present_modes.data())) + VK_CHECK(vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device_, surface_.get_native(), &present_modes_cnt, details.present_modes.data())) return details; } @@ -199,7 +199,7 @@ void UwURenderEngine::pick_physical_device() for (const auto& device : devices) { - if (is_device_suitable(device, surface_)) + if (is_device_suitable(device, surface_.get_native())) { physical_device_ = device; VkPhysicalDeviceProperties device_properties; @@ -215,7 +215,7 @@ void UwURenderEngine::pick_physical_device() void UwURenderEngine::create_logical_device() { - QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_); + QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_.get_native()); VkPhysicalDeviceFeatures device_features{}; @@ -273,7 +273,7 @@ void UwURenderEngine::create_swapchain() VkSwapchainCreateInfoKHR swapchain_create_info{}; swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; - swapchain_create_info.surface = surface_; + swapchain_create_info.surface = surface_.get_native(); swapchain_create_info.minImageCount = image_count; swapchain_create_info.imageFormat = surface_format.format; swapchain_create_info.imageColorSpace = surface_format.colorSpace; @@ -286,7 +286,7 @@ void UwURenderEngine::create_swapchain() swapchain_create_info.clipped = VK_TRUE; swapchain_create_info.oldSwapchain = VK_NULL_HANDLE; - QueueFamilyIndices family_indices = find_queue_family_indices(physical_device_, surface_); + QueueFamilyIndices family_indices = find_queue_family_indices(physical_device_, surface_.get_native()); const std::set queue_family_indices = { family_indices.graphics_family, family_indices.present_family, family_indices.transfer_family }; @@ -407,7 +407,7 @@ void UwURenderEngine::create_uniform_buffers() uniform_buffers_memory_.resize(swapchain_images_.size()); uniform_buffers_mapped_.resize(swapchain_images_.size()); - std::vector arr_indices = get_unique_family_indices(find_queue_family_indices(physical_device_, surface_)); + std::vector arr_indices = get_unique_family_indices(find_queue_family_indices(physical_device_, surface_.get_native())); for (size_t i = 0; i < swapchain_images_.size(); ++i) { const VkDeviceSize size = sizeof(UniformBufferObject); @@ -631,7 +631,7 @@ void UwURenderEngine::create_framebuffers() void UwURenderEngine::create_command_pool() { - QueueFamilyIndices queue_family_indices = find_queue_family_indices(physical_device_, surface_); + QueueFamilyIndices queue_family_indices = find_queue_family_indices(physical_device_, surface_.get_native()); VkCommandPoolCreateInfo command_pool_info{}; command_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; @@ -656,7 +656,7 @@ std::vector UwURenderEngine::get_unique_family_indices(const QueueFami void UwURenderEngine::allocate_vertex_buffer() { - QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_); + QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_.get_native()); std::vector arr_indices = get_unique_family_indices(indices); @@ -688,7 +688,7 @@ void UwURenderEngine::allocate_vertex_buffer() void UwURenderEngine::allocate_index_buffer() { - QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_); + QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_.get_native()); std::set set_indices = {indices.graphics_family, indices.present_family, indices.transfer_family}; @@ -872,16 +872,11 @@ void UwURenderEngine::draw_frame() current_frame_ = (current_frame_ + 1) % static_cast(swapchain_images_.size()); } -void UwURenderEngine::create_surface() -{ - VK_CHECK(glfwCreateWindowSurface(instance_.get_native(), get_window(), nullptr, &surface_)) -} - UwURenderEngine::UwURenderEngine(CoreInstance& core):RenderEngineBase(core), instance_(core), +surface_(instance_, get_window()), core_(core) { - create_surface(); pick_physical_device(); create_logical_device(); create_swapchain(); @@ -970,9 +965,6 @@ UwURenderEngine::~UwURenderEngine() if (device_ != VK_NULL_HANDLE) vkDestroyDevice(device_, nullptr); - - if (surface_ != VK_NULL_HANDLE) - vkDestroySurfaceKHR(instance_.get_native(), surface_, nullptr); } void UwURenderEngine::start() diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp index 0b6166c..ec23627 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp @@ -12,6 +12,7 @@ #include #include "VkObjects/Instance.hpp" +#include "VkObjects/Surface.hpp" class Camera; class GPU_GarbageCollector; @@ -71,8 +72,9 @@ class UwURenderEngine : public RenderEngineBase std::weak_ptr active_camera_; std::mutex m_active_camera_; - Instance instance_; - VkSurfaceKHR surface_ = VK_NULL_HANDLE; + VkObjects::Instance instance_; + VkObjects::Surface surface_; + //VkSurfaceKHR surface_ = VK_NULL_HANDLE; VkPhysicalDevice physical_device_ = VK_NULL_HANDLE; VkDevice device_ = VK_NULL_HANDLE; VkQueue graphics_queue_ = VK_NULL_HANDLE; @@ -114,7 +116,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_surface(); void pick_physical_device(); void create_logical_device(); void create_swapchain(); diff --git a/UwURenderEngine/RenderEngine/VkObjects/Instance.cpp b/UwURenderEngine/RenderEngine/VkObjects/Instance.cpp index ea69426..728041d 100644 --- a/UwURenderEngine/RenderEngine/VkObjects/Instance.cpp +++ b/UwURenderEngine/RenderEngine/VkObjects/Instance.cpp @@ -4,83 +4,86 @@ #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() +namespace VkObjects { #ifdef _DEBUG - if (debug_messenger_ != nullptr && instance_ != nullptr) { - PFN_vkDestroyDebugUtilsMessengerEXT destroyer_messenger = reinterpret_cast(vkGetInstanceProcAddr(instance_, "vkDestroyDebugUtilsMessengerEXT")); - destroyer_messenger(instance_, debug_messenger_, nullptr); + 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 - vkDestroyInstance(instance_, nullptr); -} + + 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); + } +} \ No newline at end of file diff --git a/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp b/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp index 0d164b1..f3e7558 100644 --- a/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp +++ b/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp @@ -5,26 +5,29 @@ class CoreInstance; -class Instance +namespace VkObjects { - VkInstance instance_ = nullptr; + class Instance + { + VkInstance instance_ = nullptr; - static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( - VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, - VkDebugUtilsMessageTypeFlagsEXT messageType, - const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, - void* pUserData - ); + 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_; + VkResult enable_layer_validation(const VkDebugUtilsMessengerCreateInfoEXT* create_info); + VkDebugUtilsMessengerEXT debug_messenger_; #endif - std::vector Instance::get_required_extensions(); -public: - Instance(CoreInstance& core); - ~Instance(); + std::vector Instance::get_required_extensions(); + public: + Instance(CoreInstance& core); + ~Instance(); - inline VkInstance get_native() const { return instance_; } -}; + inline VkInstance get_native() const { return instance_; } + }; +} diff --git a/UwURenderEngine/RenderEngine/VkObjects/Surface.cpp b/UwURenderEngine/RenderEngine/VkObjects/Surface.cpp new file mode 100644 index 0000000..195a7b4 --- /dev/null +++ b/UwURenderEngine/RenderEngine/VkObjects/Surface.cpp @@ -0,0 +1,17 @@ +#include "Surface.hpp" + +#include "Instance.hpp" +#include "DeviceFunctions/DeviceFunctions.hpp" + +namespace VkObjects +{ + Surface::Surface(const Instance& instance, GLFWwindow* window):instance_(instance) + { + VK_CHECK(glfwCreateWindowSurface(instance_.get_native(), window, nullptr, &surface_)) + } + + Surface::~Surface() + { + vkDestroySurfaceKHR(instance_.get_native(), surface_, nullptr); + } +} diff --git a/UwURenderEngine/RenderEngine/VkObjects/Surface.hpp b/UwURenderEngine/RenderEngine/VkObjects/Surface.hpp new file mode 100644 index 0000000..4ed4686 --- /dev/null +++ b/UwURenderEngine/RenderEngine/VkObjects/Surface.hpp @@ -0,0 +1,21 @@ +#pragma once + +#define GLFW_INCLUDE_VULKAN +#include "GLFW/glfw3.h" + + +namespace VkObjects +{ + class Instance; + + class Surface + { + VkSurfaceKHR surface_ = nullptr; + const Instance& instance_; + public: + Surface(const Instance& instance, GLFWwindow* window); + ~Surface(); + + inline VkSurfaceKHR get_native() const { return surface_; } + }; +}