diff --git a/src/platform/window.cpp b/src/platform/window.cpp index b960bcf..328fc92 100644 --- a/src/platform/window.cpp +++ b/src/platform/window.cpp @@ -6,16 +6,23 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:36:44 by maldavid #+# #+# */ -/* Updated: 2022/12/19 00:46:55 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 15:53:35 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ #include "window.h" #include +#include +#include + +#include + namespace mlx { - MLX_Window::MLX_Window(std::size_t w, std::size_t h, std::string title, int id) : _id(id), _renderer(new Renderer()) + static glm::mat4 proj = glm::mat4(1.0); + + MLX_Window::MLX_Window(std::size_t w, std::size_t h, std::string title, int id) : _id(id), _renderer(new Renderer()), _width(w), _height(h) { _win = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w, h, SDL_WINDOW_VULKAN | SDL_WINDOW_SHOWN); if(!_win) @@ -23,24 +30,31 @@ namespace mlx _renderer->setWindow(this); _renderer->init(); _vbo.create(sizeof(Vertex)); + + proj = glm::ortho(_width, 0, _height, 0); } bool MLX_Window::beginFrame() { - return _renderer->beginFrame(); + bool success = _renderer->beginFrame(); + if(success) + _vbo.bind(*_renderer); + return success; } void MLX_Window::pixel_put(int x, int y, int color) { - uint32_t ucolor = color; Vertex vert; - vert.pos = glm::vec2(x, y); - vert.color.r = (ucolor >> 16) & 0xFF; - vert.color.g = (ucolor >> 8) & 0xFF; - vert.color.b = ucolor & 0xFF; + float xf = glm::vec4(glm::vec4((float)x, (float)y, 0.0, 0.0) * proj).x; + float yf = glm::vec4(glm::vec4((float)x, (float)y, 0.0, 0.0) * proj).y; + + std::cout << xf << " " << yf << " " << std::endl; + vert.pos = glm::vec2(xf, yf); + vert.color.r = (color >> 16) & 0xFF; + vert.color.g = (color >> 8) & 0xFF; + vert.color.b = color & 0xFF; _vbo.setData(sizeof(Vertex), &vert); - _vbo.bind(*_renderer); vkCmdDraw(_renderer->getActiveCmdBuffer().get(), 1, 1, 0, 0); } @@ -51,8 +65,8 @@ namespace mlx MLX_Window::~MLX_Window() { - _vbo.destroy(); _renderer->destroy(); + _vbo.destroy(); if(_win) SDL_DestroyWindow(_win); } diff --git a/src/platform/window.h b/src/platform/window.h index 388eb8a..fe1f6a3 100644 --- a/src/platform/window.h +++ b/src/platform/window.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 21:53:12 by maldavid #+# #+# */ -/* Updated: 2022/12/19 00:40:26 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 14:43:19 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,6 +40,8 @@ namespace mlx std::unique_ptr _renderer; VBO _vbo; SDL_Window* _win = nullptr; + int _width = 0; + int _height = 0; int _id; }; } diff --git a/src/renderer/buffers/vk_vbo.cpp b/src/renderer/buffers/vk_vbo.cpp index be6ec5b..c20cb47 100644 --- a/src/renderer/buffers/vk_vbo.cpp +++ b/src/renderer/buffers/vk_vbo.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:28:08 by maldavid #+# #+# */ -/* Updated: 2022/12/18 00:28:52 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 15:38:45 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,7 +18,7 @@ namespace mlx void VBO::setData(uint32_t size, const void* data) { if(size > _size) - core::error::report(e_kind::error, "Vulkan : trying to store to much data in a vertex buffer (%d on %d)", size, _size); + core::error::report(e_kind::error, "Vulkan : trying to store to much data in a vertex buffer (%d bytes in %d bytes)", size, _size); if(data == nullptr) core::error::report(e_kind::warning, "Vulkan : mapping null data in a vertex buffer"); @@ -27,23 +27,5 @@ namespace mlx mapMem(&temp); std::memcpy(temp, data, static_cast(size)); unmapMem(); - - _used_size += size; - } - - void VBO::setSubData(uint32_t offset, uint32_t size, const void* data) - { - if(size + _used_size > _size) - core::error::report(e_kind::error, "Vulkan : trying to store to much data in a vertex buffer (%d on %d)", size + _used_size, _size); - - if(data == nullptr) - core::error::report(e_kind::warning, "Vulkan : mapping null data in a vertex buffer"); - - void* temp = nullptr; - mapMem(&temp, size, offset); - std::memcpy(temp, data, static_cast(size)); - unmapMem(); - - _used_size += size; } } diff --git a/src/renderer/buffers/vk_vbo.h b/src/renderer/buffers/vk_vbo.h index fbd8c8c..1e9fd33 100644 --- a/src/renderer/buffers/vk_vbo.h +++ b/src/renderer/buffers/vk_vbo.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:27:38 by maldavid #+# #+# */ -/* Updated: 2022/12/18 20:10:12 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 15:16:42 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,12 +24,8 @@ namespace mlx inline void create(uint32_t size) { Buffer::create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); } void setData(uint32_t size, const void* data); - void setSubData(uint32_t offset, uint32_t size, const void* data); inline void bind(Renderer& renderer) noexcept { vkCmdBindVertexBuffers(renderer.getActiveCmdBuffer().get(), 0, 1, &_buffer, &_offset); } - - private: - uint32_t _used_size = 0; }; } diff --git a/src/renderer/core/render_core.cpp b/src/renderer/core/render_core.cpp index 0aaa1a9..882ceef 100644 --- a/src/renderer/core/render_core.cpp +++ b/src/renderer/core/render_core.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/17 23:33:34 by maldavid #+# #+# */ -/* Updated: 2022/12/18 22:40:58 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 14:08:57 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -71,6 +71,7 @@ namespace mlx volkInitialize(); _instance.init(); + _layers.init(); _device.init(); _queues.init(); _is_init = true; @@ -87,6 +88,7 @@ namespace mlx vkDeviceWaitIdle(_device()); _device.destroy(); + _layers.destroy(); _instance.destroy(); _is_init = false; diff --git a/src/renderer/core/render_core.h b/src/renderer/core/render_core.h index 9885a19..933576e 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: 2022/12/18 17:51:47 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 14:16:25 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,7 @@ #include "vk_queues.h" #include "vk_device.h" #include "vk_instance.h" +#include "vk_validation_layers.h" #include #include @@ -29,6 +30,14 @@ namespace mlx void checkVk(VkResult result); } + #ifndef NDEBUG + constexpr const bool enableValidationLayers = true; + #else + constexpr const bool enableValidationLayers = false; + #endif + + const std::vector validationLayers = { "VK_LAYER_KHRONOS_validation" }; + constexpr const int MAX_FRAMES_IN_FLIGHT = 2; class Render_Core : public Singleton @@ -42,10 +51,12 @@ namespace mlx inline Instance& getInstance() noexcept { return _instance; } inline Device& getDevice() noexcept { return _device; } inline Queues& getQueue() noexcept { return _queues; } + inline ValidationLayers& getLayers() noexcept { return _layers; } ~Render_Core() = default; private: + ValidationLayers _layers; Queues _queues; Device _device; Instance _instance; diff --git a/src/renderer/core/vk_instance.cpp b/src/renderer/core/vk_instance.cpp index c403fc4..ae68903 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: 2022/12/18 22:37:00 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 14:26:31 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,9 +37,22 @@ namespace mlx createInfo.enabledExtensionCount = static_cast(extensions.size()); createInfo.ppEnabledExtensionNames = extensions.data(); - VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo; - createInfo.enabledLayerCount = 0; - createInfo.pNext = nullptr; + VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo; + if constexpr(enableValidationLayers) + { + if(Render_Core::get().getLayers().checkValidationLayerSupport()) + { + createInfo.enabledLayerCount = static_cast(validationLayers.size()); + createInfo.ppEnabledLayerNames = validationLayers.data(); + Render_Core::get().getLayers().populateDebugMessengerCreateInfo(debugCreateInfo); + createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &debugCreateInfo; + } + } + else + { + createInfo.enabledLayerCount = 0; + createInfo.pNext = nullptr; + } VkResult res; if((res = vkCreateInstance(&createInfo, nullptr, &_instance)) != VK_SUCCESS) @@ -64,6 +77,9 @@ namespace mlx if(!SDL_Vulkan_GetInstanceExtensions(window, &count, extensions.data() + additional_extension_count)) core::error::report(e_kind::error, "Vulkan : cannot get instance extentions from window : %s", SDL_GetError()); + if constexpr(enableValidationLayers) + extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + SDL_DestroyWindow(window); return extensions; } diff --git a/src/renderer/core/vk_validation_layers.cpp b/src/renderer/core/vk_validation_layers.cpp new file mode 100644 index 0000000..39a40c7 --- /dev/null +++ b/src/renderer/core/vk_validation_layers.cpp @@ -0,0 +1,105 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* vk_validation_layers.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maldavid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/12/19 14:05:25 by maldavid #+# #+# */ +/* Updated: 2022/12/19 14:11:12 by maldavid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "vk_validation_layers.h" +#include "render_core.h" + +#include +#include +#include + +namespace mlx +{ + void ValidationLayers::init() + { + if constexpr(!enableValidationLayers) + return; + + VkDebugUtilsMessengerCreateInfoEXT createInfo; + populateDebugMessengerCreateInfo(createInfo); + if(createDebugUtilsMessengerEXT(&createInfo, nullptr) != VK_SUCCESS) + core::error::report(e_kind::error, "Vulkan : failed to set up debug messenger"); + } + + bool ValidationLayers::checkValidationLayerSupport() + { + uint32_t layerCount; + vkEnumerateInstanceLayerProperties(&layerCount, nullptr); + + std::vector availableLayers(layerCount); + vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); + + for(const char* layerName : validationLayers) + { + bool layerFound = false; + + for(const auto& layerProperties : availableLayers) + { + if(std::strcmp(layerName, layerProperties.layerName) == 0) + { + layerFound = true; + break; + } + } + + if(!layerFound) + 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; + } + + void ValidationLayers::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo) + { + createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; + createInfo.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; + createInfo.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; + createInfo.pfnUserCallback = ValidationLayers::debugCallback; + } + + VKAPI_ATTR VkBool32 VKAPI_CALL ValidationLayers::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) + { + if(messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) + { + std::cout << '\n'; + core::error::report(e_kind::error, std::string("Vulkan layer error: ") + pCallbackData->pMessage); + } + else if(messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) + { + std::cout << '\n'; + core::error::report(e_kind::warning, std::string("Vulkan layer warning: ") + pCallbackData->pMessage); + } + + return VK_FALSE; + } + + void ValidationLayers::destroyDebugUtilsMessengerEXT(const VkAllocationCallbacks* pAllocator) + { + auto func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(Render_Core::get().getInstance().get(), "vkDestroyDebugUtilsMessengerEXT"); + if(func != nullptr) + func(Render_Core::get().getInstance().get(), _debugMessenger, pAllocator); + } + +} diff --git a/src/renderer/core/vk_validation_layers.h b/src/renderer/core/vk_validation_layers.h new file mode 100644 index 0000000..8fb08c0 --- /dev/null +++ b/src/renderer/core/vk_validation_layers.h @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* vk_validation_layers.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maldavid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/12/19 14:04:25 by maldavid #+# #+# */ +/* Updated: 2022/12/19 14:05:19 by maldavid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef __VK_VALIDATION_LAYERS__ +#define __VK_VALIDATION_LAYERS__ + +#include + +namespace mlx +{ + class ValidationLayers + { + public: + void init(); + void destroy(); + bool checkValidationLayerSupport(); + void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo); + + 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); + + VkDebugUtilsMessengerEXT _debugMessenger; + }; +} + +#endif diff --git a/src/renderer/pipeline/pipeline.cpp b/src/renderer/pipeline/pipeline.cpp index 0137195..9b1d1e6 100644 --- a/src/renderer/pipeline/pipeline.cpp +++ b/src/renderer/pipeline/pipeline.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/18 21:27:38 by maldavid #+# #+# */ -/* Updated: 2022/12/19 00:26:39 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 15:09:20 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,73 +17,74 @@ namespace mlx { const std::vector vertex_shader = { - 0x07230203,0x00010000,0x0008000a,0x00000021,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x07230203,0x00010000,0x0008000a,0x00000024,0x00000000,0x00020011,0x00000001,0x0006000b, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, - 0x0009000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00000012,0x0000001d, - 0x0000001f,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000, + 0x0009000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00000016,0x00000020, + 0x00000022,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000, 0x00060005,0x0000000b,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x0000000b, 0x00000000,0x505f6c67,0x7469736f,0x006e6f69,0x00070006,0x0000000b,0x00000001,0x505f6c67, 0x746e696f,0x657a6953,0x00000000,0x00070006,0x0000000b,0x00000002,0x435f6c67,0x4470696c, 0x61747369,0x0065636e,0x00070006,0x0000000b,0x00000003,0x435f6c67,0x446c6c75,0x61747369, - 0x0065636e,0x00030005,0x0000000d,0x00000000,0x00050005,0x00000012,0x6f506e69,0x69746973, - 0x00006e6f,0x00050005,0x0000001d,0x67617266,0x6f6c6f43,0x00000072,0x00040005,0x0000001f, + 0x0065636e,0x00030005,0x0000000d,0x00000000,0x00050005,0x00000016,0x6f506e69,0x69746973, + 0x00006e6f,0x00050005,0x00000020,0x67617266,0x6f6c6f43,0x00000072,0x00040005,0x00000022, 0x6f436e69,0x00726f6c,0x00050048,0x0000000b,0x00000000,0x0000000b,0x00000000,0x00050048, 0x0000000b,0x00000001,0x0000000b,0x00000001,0x00050048,0x0000000b,0x00000002,0x0000000b, 0x00000003,0x00050048,0x0000000b,0x00000003,0x0000000b,0x00000004,0x00030047,0x0000000b, - 0x00000002,0x00040047,0x00000012,0x0000001e,0x00000000,0x00040047,0x0000001d,0x0000001e, - 0x00000000,0x00040047,0x0000001f,0x0000001e,0x00000001,0x00020013,0x00000002,0x00030021, + 0x00000002,0x00040047,0x00000016,0x0000001e,0x00000000,0x00040047,0x00000020,0x0000001e, + 0x00000000,0x00040047,0x00000022,0x0000001e,0x00000001,0x00020013,0x00000002,0x00030021, 0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006, 0x00000004,0x00040015,0x00000008,0x00000020,0x00000000,0x0004002b,0x00000008,0x00000009, 0x00000001,0x0004001c,0x0000000a,0x00000006,0x00000009,0x0006001e,0x0000000b,0x00000007, 0x00000006,0x0000000a,0x0000000a,0x00040020,0x0000000c,0x00000003,0x0000000b,0x0004003b, 0x0000000c,0x0000000d,0x00000003,0x00040015,0x0000000e,0x00000020,0x00000001,0x0004002b, - 0x0000000e,0x0000000f,0x00000000,0x00040017,0x00000010,0x00000006,0x00000002,0x00040020, - 0x00000011,0x00000001,0x00000010,0x0004003b,0x00000011,0x00000012,0x00000001,0x0004002b, - 0x00000006,0x00000014,0x00000000,0x0004002b,0x00000006,0x00000015,0x3f800000,0x00040020, - 0x00000019,0x00000003,0x00000007,0x00040017,0x0000001b,0x00000006,0x00000003,0x00040020, - 0x0000001c,0x00000003,0x0000001b,0x0004003b,0x0000001c,0x0000001d,0x00000003,0x00040020, - 0x0000001e,0x00000001,0x0000001b,0x0004003b,0x0000001e,0x0000001f,0x00000001,0x00050036, - 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x00000010, - 0x00000013,0x00000012,0x00050051,0x00000006,0x00000016,0x00000013,0x00000000,0x00050051, - 0x00000006,0x00000017,0x00000013,0x00000001,0x00070050,0x00000007,0x00000018,0x00000016, - 0x00000017,0x00000014,0x00000015,0x00050041,0x00000019,0x0000001a,0x0000000d,0x0000000f, - 0x0003003e,0x0000001a,0x00000018,0x0004003d,0x0000001b,0x00000020,0x0000001f,0x0003003e, - 0x0000001d,0x00000020,0x000100fd,0x00010038 + 0x0000000e,0x0000000f,0x00000001,0x0004002b,0x00000006,0x00000010,0x3f800000,0x00040020, + 0x00000011,0x00000003,0x00000006,0x0004002b,0x0000000e,0x00000013,0x00000000,0x00040017, + 0x00000014,0x00000006,0x00000002,0x00040020,0x00000015,0x00000001,0x00000014,0x0004003b, + 0x00000015,0x00000016,0x00000001,0x0004002b,0x00000006,0x00000018,0x00000000,0x00040020, + 0x0000001c,0x00000003,0x00000007,0x00040017,0x0000001e,0x00000006,0x00000003,0x00040020, + 0x0000001f,0x00000003,0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000003,0x00040020, + 0x00000021,0x00000001,0x0000001e,0x0004003b,0x00000021,0x00000022,0x00000001,0x00050036, + 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x00000011, + 0x00000012,0x0000000d,0x0000000f,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000014, + 0x00000017,0x00000016,0x00050051,0x00000006,0x00000019,0x00000017,0x00000000,0x00050051, + 0x00000006,0x0000001a,0x00000017,0x00000001,0x00070050,0x00000007,0x0000001b,0x00000019, + 0x0000001a,0x00000018,0x00000010,0x00050041,0x0000001c,0x0000001d,0x0000000d,0x00000013, + 0x0003003e,0x0000001d,0x0000001b,0x0004003d,0x0000001e,0x00000023,0x00000022,0x0003003e, + 0x00000020,0x00000023,0x000100fd,0x00010038 }; const std::vector fragment_shader = { 0x07230203,0x00010000,0x0008000a,0x00000013,0x00000000,0x00020011,0x00000001,0x0006000b, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000c,0x00030010, - 0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, - 0x00000000,0x00050005,0x00000009,0x4374756f,0x726f6c6f,0x00000000,0x00050005,0x0000000c, - 0x67617266,0x6f6c6f43,0x00000072,0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047, - 0x0000000c,0x0000001e,0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002, - 0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020, - 0x00000008,0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040017, - 0x0000000a,0x00000006,0x00000003,0x00040020,0x0000000b,0x00000001,0x0000000a,0x0004003b, - 0x0000000b,0x0000000c,0x00000001,0x0004002b,0x00000006,0x0000000e,0x3f800000,0x00050036, - 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x0000000a, - 0x0000000d,0x0000000c,0x00050051,0x00000006,0x0000000f,0x0000000d,0x00000000,0x00050051, - 0x00000006,0x00000010,0x0000000d,0x00000001,0x00050051,0x00000006,0x00000011,0x0000000d, - 0x00000002,0x00070050,0x00000007,0x00000012,0x0000000f,0x00000010,0x00000011,0x0000000e, - 0x0003003e,0x00000009,0x00000012,0x000100fd,0x00010038 + 0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00090004,0x415f4c47,0x735f4252, + 0x72617065,0x5f657461,0x64616873,0x6f5f7265,0x63656a62,0x00007374,0x00040005,0x00000004, + 0x6e69616d,0x00000000,0x00050005,0x00000009,0x4374756f,0x726f6c6f,0x00000000,0x00050005, + 0x0000000c,0x67617266,0x6f6c6f43,0x00000072,0x00040047,0x00000009,0x0000001e,0x00000000, + 0x00040047,0x0000000c,0x0000001e,0x00000000,0x00020013,0x00000002,0x00030021,0x00000003, + 0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004, + 0x00040020,0x00000008,0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003, + 0x00040017,0x0000000a,0x00000006,0x00000003,0x00040020,0x0000000b,0x00000001,0x0000000a, + 0x0004003b,0x0000000b,0x0000000c,0x00000001,0x0004002b,0x00000006,0x0000000e,0x3f800000, + 0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d, + 0x0000000a,0x0000000d,0x0000000c,0x00050051,0x00000006,0x0000000f,0x0000000d,0x00000000, + 0x00050051,0x00000006,0x00000010,0x0000000d,0x00000001,0x00050051,0x00000006,0x00000011, + 0x0000000d,0x00000002,0x00070050,0x00000007,0x00000012,0x0000000f,0x00000010,0x00000011, + 0x0000000e,0x0003003e,0x00000009,0x00000012,0x000100fd,0x00010038 }; void GraphicPipeline::init(Renderer& renderer) { - std::vector stages; - VkShaderModuleCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - createInfo.codeSize = vertex_shader.size(); + createInfo.codeSize = vertex_shader.size() * sizeof(uint32_t); createInfo.pCode = vertex_shader.data(); VkShaderModule vshader; if(vkCreateShaderModule(Render_Core::get().getDevice().get(), &createInfo, nullptr, &vshader) != VK_SUCCESS) core::error::report(e_kind::fatal_error, "Vulkan : failed to create a vertex shader module"); createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - createInfo.codeSize = fragment_shader.size(); + createInfo.codeSize = fragment_shader.size() * sizeof(uint32_t); createInfo.pCode = fragment_shader.data(); VkShaderModule fshader; if(vkCreateShaderModule(Render_Core::get().getDevice().get(), &createInfo, nullptr, &fshader) != VK_SUCCESS) @@ -101,7 +102,7 @@ namespace mlx fragShaderStageInfo.module = fshader; fragShaderStageInfo.pName = "main"; - VkPipelineShaderStageCreateInfo shaderStages[] = {vertShaderStageInfo, fragShaderStageInfo}; + std::vector stages = {vertShaderStageInfo, fragShaderStageInfo}; auto bindingDescription = Vertex::getBindingDescription(); auto attributeDescriptions = Vertex::getAttributeDescriptions(); @@ -149,7 +150,7 @@ namespace mlx rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rasterizer.depthClampEnable = VK_FALSE; rasterizer.rasterizerDiscardEnable = VK_FALSE; - rasterizer.polygonMode = VK_POLYGON_MODE_POINT; + rasterizer.polygonMode = VK_POLYGON_MODE_FILL; //VK_POLYGON_MODE_POINT; rasterizer.lineWidth = 1.0f; rasterizer.cullMode = VK_CULL_MODE_BACK_BIT; rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE; diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp index d37b575..02ee696 100644 --- a/src/renderer/renderer.cpp +++ b/src/renderer/renderer.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/18 17:25:16 by maldavid #+# #+# */ -/* Updated: 2022/12/19 00:00:46 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 15:27:44 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -134,6 +134,7 @@ namespace mlx for(int i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) _cmd_buffers[i].destroy(); + _pipeline.destroy(); _swapchain.destroyFB(); _pass.destroy(); _swapchain.destroy(); diff --git a/src/renderer/swapchain/vk_swapchain.cpp b/src/renderer/swapchain/vk_swapchain.cpp index 79d3ed0..4baff2f 100644 --- a/src/renderer/swapchain/vk_swapchain.cpp +++ b/src/renderer/swapchain/vk_swapchain.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:22:28 by maldavid #+# #+# */ -/* Updated: 2022/12/19 00:05:32 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 15:01:34 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,7 +43,7 @@ namespace mlx createInfo.imageArrayLayers = 1; createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; - Queues::QueueFamilyIndices indices = Render_Core::get().getQueue().getFamilies(); + Queues::QueueFamilyIndices indices = Render_Core::get().getQueue().findQueueFamilies(Render_Core::get().getDevice().getPhysicalDevice(), renderer->getSurface().get()); uint32_t queueFamilyIndices[] = {indices.graphicsFamily.value(), indices.presentFamily.value()}; if(indices.graphicsFamily != indices.presentFamily) diff --git a/test/main.c b/test/main.c index 3c6d1d3..6b815c8 100644 --- a/test/main.c +++ b/test/main.c @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:55:21 by maldavid #+# #+# */ -/* Updated: 2022/12/19 00:55:44 by maldavid ### ########.fr */ +/* Updated: 2022/12/19 15:52:54 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,8 +23,13 @@ int update(t_mlx *mlx) { static int i = 0; - printf("%d\r", i); - mlx_pixel_put(mlx->mlx, mlx->win, 0, 0, 0xFF0000); + printf("%d\n", i); + mlx_pixel_put(mlx->mlx, mlx->win, 200, 50, 0xFF0000); + mlx_pixel_put(mlx->mlx, mlx->win, 200, 60, 0x00FF00); + mlx_pixel_put(mlx->mlx, mlx->win, 200, 70, 0x0000FF); + mlx_pixel_put(mlx->mlx, mlx->win, 200, 80, 0xFF00FF); + mlx_pixel_put(mlx->mlx, mlx->win, 200, 90, 0xFFFF00); + mlx_pixel_put(mlx->mlx, mlx->win, 200, 100, 0xFFFFFF); i++; if (i > 20000) mlx_loop_end(mlx->mlx);