diff --git a/src/core/bridge.cpp b/src/core/bridge.cpp index 8b97a54..beedec8 100644 --- a/src/core/bridge.cpp +++ b/src/core/bridge.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:35:20 by maldavid #+# #+# */ -/* Updated: 2023/12/28 16:56:23 by maldavid ### ########.fr */ +/* Updated: 2023/12/31 00:22:58 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/renderer/core/render_core.h b/src/renderer/core/render_core.h index a318ff4..a4cd398 100644 --- a/src/renderer/core/render_core.h +++ b/src/renderer/core/render_core.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/08 19:16:32 by maldavid #+# #+# */ -/* Updated: 2023/12/15 20:31:08 by maldavid ### ########.fr */ +/* Updated: 2023/12/31 00:42:42 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/renderer/core/vk_device.cpp b/src/renderer/core/vk_device.cpp index 0322030..f10c599 100644 --- a/src/renderer/core/vk_device.cpp +++ b/src/renderer/core/vk_device.cpp @@ -6,11 +6,12 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/08 19:14:29 by maldavid #+# #+# */ -/* Updated: 2023/12/12 15:50:02 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/30 23:29:41 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ #include "render_core.h" +#include #include #include #include @@ -85,8 +86,10 @@ namespace mlx std::vector> devices_score; - for(const auto& device : devices) - devices_score.emplace_back(deviceScore(device, surface), device); + std::transform(devices.cbegin(), devices.cend(), std::back_inserter(devices_score), [&](VkPhysicalDevice device) + { + return std::make_pair(deviceScore(device, surface), device); + }); vkDestroySurfaceKHR(Render_Core::get().getInstance().get(), surface, nullptr); SDL_DestroyWindow(window); diff --git a/src/renderer/core/vk_instance.cpp b/src/renderer/core/vk_instance.cpp index 3a51c75..d93f342 100644 --- a/src/renderer/core/vk_instance.cpp +++ b/src/renderer/core/vk_instance.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/08 19:04:21 by maldavid #+# #+# */ -/* Updated: 2023/12/15 16:20:26 by maldavid ### ########.fr */ +/* Updated: 2023/12/31 00:40:10 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,13 +25,15 @@ namespace mlx appInfo.engineVersion = VK_MAKE_VERSION(1, 2, 1); appInfo.apiVersion = VK_API_VERSION_1_2; + auto extensions = getRequiredExtensions(); + VkInstanceCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &appInfo; - - auto extensions = getRequiredExtensions(); createInfo.enabledExtensionCount = static_cast(extensions.size()); createInfo.ppEnabledExtensionNames = extensions.data(); + createInfo.enabledLayerCount = 0; // will be replaced if validation layers are enabled + createInfo.pNext = nullptr; VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo; if constexpr(enableValidationLayers) @@ -41,14 +43,9 @@ namespace mlx createInfo.enabledLayerCount = static_cast(validationLayers.size()); createInfo.ppEnabledLayerNames = validationLayers.data(); Render_Core::get().getLayers().populateDebugMessengerCreateInfo(debugCreateInfo); - createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &debugCreateInfo; + createInfo.pNext = static_cast(&debugCreateInfo); } } - else - { - createInfo.enabledLayerCount = 0; - createInfo.pNext = nullptr; - } VkResult res; if((res = vkCreateInstance(&createInfo, nullptr, &_instance)) != VK_SUCCESS) diff --git a/src/renderer/core/vk_surface.cpp b/src/renderer/core/vk_surface.cpp index fdc027c..3a5fed2 100644 --- a/src/renderer/core/vk_surface.cpp +++ b/src/renderer/core/vk_surface.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/08 18:58:49 by maldavid #+# #+# */ -/* Updated: 2023/11/18 17:22:38 by maldavid ### ########.fr */ +/* Updated: 2023/12/30 23:14:54 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ #include #include #include +#include namespace mlx { @@ -29,13 +30,12 @@ namespace mlx VkSurfaceFormatKHR Surface::chooseSwapSurfaceFormat(const std::vector& availableFormats) { - for(const auto& availableFormat : availableFormats) + auto it = std::find_if(availableFormats.begin(), availableFormats.end(), [](VkSurfaceFormatKHR format) { - if(availableFormat.format == VK_FORMAT_R8G8B8A8_SRGB && availableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) - return availableFormat; - } + return format.format == VK_FORMAT_R8G8B8A8_SRGB && format.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; + }); - return availableFormats[0]; + return (it == availableFormats.end() ? availableFormats[0] : *it); } void Surface::destroy() noexcept diff --git a/src/renderer/core/vk_validation_layers.cpp b/src/renderer/core/vk_validation_layers.cpp index dfb3443..837aa1b 100644 --- a/src/renderer/core/vk_validation_layers.cpp +++ b/src/renderer/core/vk_validation_layers.cpp @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* vk_validation_layers.cpp :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: maldavid +#+ +:+ +#+ */ +/* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/19 14:05:25 by maldavid #+# #+# */ -/* Updated: 2023/12/28 01:01:03 by maldavid ### ########.fr */ +/* Updated: 2023/12/31 00:41:39 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,7 @@ #include #include #include +#include namespace mlx { @@ -24,7 +25,7 @@ namespace mlx if constexpr(!enableValidationLayers) return; - VkDebugUtilsMessengerCreateInfoEXT createInfo; + VkDebugUtilsMessengerCreateInfoEXT createInfo{}; populateDebugMessengerCreateInfo(createInfo); if(createDebugUtilsMessengerEXT(&createInfo, nullptr) != VK_SUCCESS) core::error::report(e_kind::warning, "Vulkan : failed to set up debug messenger"); @@ -42,36 +43,15 @@ namespace mlx std::vector availableLayers(layerCount); vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); - for(const char* layerName : validationLayers) + return std::all_of(validationLayers.begin(), validationLayers.end(), [&](const char* layerName) { - bool layerFound = false; - - for(const auto& layerProperties : availableLayers) + if(!std::any_of(availableLayers.begin(), availableLayers.end(), [=](VkLayerProperties props) { return std::strcmp(layerName, props.layerName) == 0; })) { - if(std::strcmp(layerName, layerProperties.layerName) == 0) - { - layerFound = true; - break; - } - } - - if(!layerFound) + core::error::report(e_kind::error, "Vulkan : a validation layer was requested but was not found ('%s')", layerName); return false; - } - return true; - } - - void ValidationLayers::destroy() - { - if constexpr(!enableValidationLayers) - return; - destroyDebugUtilsMessengerEXT(nullptr); - } - - VkResult ValidationLayers::createDebugUtilsMessengerEXT(const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator) - { - auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(Render_Core::get().getInstance().get(), "vkCreateDebugUtilsMessengerEXT"); - return func != nullptr ? func(Render_Core::get().getInstance().get(), pCreateInfo, pAllocator, &_debugMessenger) : VK_ERROR_EXTENSION_NOT_PRESENT; + } + return true; + }); } void ValidationLayers::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo) @@ -83,6 +63,19 @@ namespace mlx createInfo.pfnUserCallback = ValidationLayers::debugCallback; } + + void ValidationLayers::destroy() + { + if constexpr(enableValidationLayers) + destroyDebugUtilsMessengerEXT(nullptr); + } + + VkResult ValidationLayers::createDebugUtilsMessengerEXT(const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator) + { + auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(Render_Core::get().getInstance().get(), "vkCreateDebugUtilsMessengerEXT"); + return func != nullptr ? func(Render_Core::get().getInstance().get(), pCreateInfo, pAllocator, &_debugMessenger) : VK_ERROR_EXTENSION_NOT_PRESENT; + } + VKAPI_ATTR VkBool32 VKAPI_CALL ValidationLayers::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, [[maybe_unused]] VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, [[maybe_unused]] void* pUserData) { if(messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) diff --git a/src/renderer/core/vk_validation_layers.h b/src/renderer/core/vk_validation_layers.h index 41a0909..1d3a586 100644 --- a/src/renderer/core/vk_validation_layers.h +++ b/src/renderer/core/vk_validation_layers.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/19 14:04:25 by maldavid #+# #+# */ -/* Updated: 2023/12/08 19:09:02 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/31 00:38:25 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,16 +21,19 @@ namespace mlx class ValidationLayers { public: + ValidationLayers() = default; void init(); - void destroy(); bool checkValidationLayerSupport(); void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo); + void destroy(); + ~ValidationLayers() = default; private: VkResult createDebugUtilsMessengerEXT(const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator); static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData); void destroyDebugUtilsMessengerEXT(const VkAllocationCallbacks* pAllocator); + private: VkDebugUtilsMessengerEXT _debugMessenger; }; } diff --git a/src/renderer/images/texture.cpp b/src/renderer/images/texture.cpp index 35fe3e4..5a3b3da 100644 --- a/src/renderer/images/texture.cpp +++ b/src/renderer/images/texture.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/31 18:03:35 by maldavid #+# #+# */ -/* Updated: 2023/12/23 18:49:53 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/31 00:49:16 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -54,18 +54,27 @@ namespace mlx _ibo.create(sizeof(uint16_t) * indexData.size(), indexData.data(), nullptr); #endif + Buffer staging_buffer; + std::size_t size = width * height * formatSize(format); if(pixels != nullptr) { - Buffer staging_buffer; - std::size_t size = width * height * formatSize(format); #ifdef DEBUG staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, name, pixels); #else staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, nullptr, pixels); #endif - Image::copyFromBuffer(staging_buffer); - staging_buffer.destroy(); } + else + { + std::vector default_pixels(width * height, 0x00000000); + #ifdef DEBUG + staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, name, default_pixels.data()); + #else + staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, nullptr, default_pixels.data()); + #endif + } + Image::copyFromBuffer(staging_buffer); + staging_buffer.destroy(); } void Texture::setPixel(int x, int y, uint32_t color) noexcept diff --git a/src/renderer/images/texture_atlas.cpp b/src/renderer/images/texture_atlas.cpp index 5a6d9a9..b6eb61b 100644 --- a/src/renderer/images/texture_atlas.cpp +++ b/src/renderer/images/texture_atlas.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/07 16:40:09 by maldavid #+# #+# */ -/* Updated: 2023/12/22 23:39:38 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/31 00:52:01 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,14 +27,16 @@ namespace mlx Image::createSampler(); transitionLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - if(pixels != nullptr) + if(pixels == nullptr) { - Buffer staging_buffer; - std::size_t size = width * height * formatSize(format); - staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, name, pixels); - Image::copyFromBuffer(staging_buffer); - staging_buffer.destroy(); + core::error::report(e_kind::warning, "Renderer : creating an empty texture atlas. They cannot be updated after creation, this might be a mistake or a bug, please report"); + return; } + Buffer staging_buffer; + std::size_t size = width * height * formatSize(format); + staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, name, pixels); + Image::copyFromBuffer(staging_buffer); + staging_buffer.destroy(); } void TextureAtlas::render(Renderer& renderer, int x, int y, uint32_t ibo_size) const diff --git a/xmake.lua b/xmake.lua index e8008bb..b15260a 100644 --- a/xmake.lua +++ b/xmake.lua @@ -50,7 +50,7 @@ target("mlx") add_options("graphics_memory_dump") add_includedirs("includes", "src", "third_party") - add_defines("MLX_BUILD") + add_defines("MLX_BUILD", "SDL_MAIN_HANDLED") add_files("src/**.cpp")