From 72d680223052298c3450660dae4621f554b1b62a Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Tue, 24 Jan 2023 17:27:55 +0100 Subject: [PATCH] adding uniform buffers and projection matrix management in vertex shader --- src/platform/window.cpp | 15 +++---- src/platform/window.h | 3 +- src/renderer/pipeline/pipeline.cpp | 71 ++++++++++++++++-------------- src/renderer/renderer.cpp | 13 +++++- src/renderer/renderer.h | 12 +++-- test/main.c | 8 +++- 6 files changed, 73 insertions(+), 49 deletions(-) diff --git a/src/platform/window.cpp b/src/platform/window.cpp index 3863c1a..b93dcd4 100644 --- a/src/platform/window.cpp +++ b/src/platform/window.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:36:44 by maldavid #+# #+# */ -/* Updated: 2023/01/22 18:53:41 by maldavid ### ########.fr */ +/* Updated: 2023/01/24 17:21:40 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,8 +20,6 @@ namespace mlx { - 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); @@ -30,8 +28,6 @@ namespace mlx _renderer->setWindow(this); _renderer->init(); _vbo.create(sizeof(Vertex)); - - proj = glm::ortho(0, _width, 0, _height); } bool MLX_Window::beginFrame() @@ -39,17 +35,16 @@ namespace mlx bool success = _renderer->beginFrame(); if(success) _vbo.bind(*_renderer); + _proj = glm::ortho(0, _width, 0, _height); + _renderer->getUniformBuffer()->setData(sizeof(_proj), &_proj); + vkCmdBindDescriptorSets(_renderer->getActiveCmdBuffer().get(), VK_PIPELINE_BIND_POINT_GRAPHICS, _renderer->getPipeline().getPipelineLayout(), 0, 1, &_renderer->getDescriptorSet().get(), 0, nullptr); return success; } void MLX_Window::pixel_put(int x, int y, int color) { Vertex vert; - 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.pos = glm::vec2(x, y); vert.color.r = (color >> 16) & 0xFF; vert.color.g = (color >> 8) & 0xFF; vert.color.b = color & 0xFF; diff --git a/src/platform/window.h b/src/platform/window.h index fe1f6a3..711c01d 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 14:43:19 by maldavid ### ########.fr */ +/* Updated: 2023/01/24 17:15:09 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,6 +38,7 @@ namespace mlx private: std::unique_ptr _renderer; + glm::mat4 _proj = glm::mat4(1.0); VBO _vbo; SDL_Window* _win = nullptr; int _width = 0; diff --git a/src/renderer/pipeline/pipeline.cpp b/src/renderer/pipeline/pipeline.cpp index 9b1d1e6..ee803d8 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 15:09:20 by maldavid ### ########.fr */ +/* Updated: 2023/01/24 16:42:19 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,40 +17,47 @@ namespace mlx { const std::vector vertex_shader = { - 0x07230203,0x00010000,0x0008000a,0x00000024,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x07230203,0x00010000,0x0008000a,0x00000029,0x00000000,0x00020011,0x00000001,0x0006000b, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, - 0x0009000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00000016,0x00000020, - 0x00000022,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000, + 0x0009000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00000019,0x00000025, + 0x00000027,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,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,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,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 + 0x0065636e,0x00030005,0x0000000d,0x00000000,0x00040005,0x00000011,0x7274614d,0x00007869, + 0x00050006,0x00000011,0x00000000,0x6a6f7270,0x00000000,0x00040005,0x00000013,0x7274616d, + 0x00007869,0x00050005,0x00000019,0x6f506e69,0x69746973,0x00006e6f,0x00050005,0x00000025, + 0x67617266,0x6f6c6f43,0x00000072,0x00040005,0x00000027,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,0x00040048,0x00000011, + 0x00000000,0x00000005,0x00050048,0x00000011,0x00000000,0x00000023,0x00000000,0x00050048, + 0x00000011,0x00000000,0x00000007,0x00000010,0x00030047,0x00000011,0x00000002,0x00040047, + 0x00000013,0x00000022,0x00000000,0x00040047,0x00000013,0x00000021,0x00000000,0x00040047, + 0x00000019,0x0000001e,0x00000000,0x00040047,0x00000025,0x0000001e,0x00000000,0x00040047, + 0x00000027,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,0x00040018,0x00000010,0x00000007,0x00000004,0x0003001e,0x00000011,0x00000010, + 0x00040020,0x00000012,0x00000002,0x00000011,0x0004003b,0x00000012,0x00000013,0x00000002, + 0x00040020,0x00000014,0x00000002,0x00000010,0x00040017,0x00000017,0x00000006,0x00000002, + 0x00040020,0x00000018,0x00000001,0x00000017,0x0004003b,0x00000018,0x00000019,0x00000001, + 0x0004002b,0x00000006,0x0000001b,0x00000000,0x0004002b,0x00000006,0x0000001c,0x3f800000, + 0x00040020,0x00000021,0x00000003,0x00000007,0x00040017,0x00000023,0x00000006,0x00000003, + 0x00040020,0x00000024,0x00000003,0x00000023,0x0004003b,0x00000024,0x00000025,0x00000003, + 0x00040020,0x00000026,0x00000001,0x00000023,0x0004003b,0x00000026,0x00000027,0x00000001, + 0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041, + 0x00000014,0x00000015,0x00000013,0x0000000f,0x0004003d,0x00000010,0x00000016,0x00000015, + 0x0004003d,0x00000017,0x0000001a,0x00000019,0x00050051,0x00000006,0x0000001d,0x0000001a, + 0x00000000,0x00050051,0x00000006,0x0000001e,0x0000001a,0x00000001,0x00070050,0x00000007, + 0x0000001f,0x0000001d,0x0000001e,0x0000001b,0x0000001c,0x00050091,0x00000007,0x00000020, + 0x00000016,0x0000001f,0x00050041,0x00000021,0x00000022,0x0000000d,0x0000000f,0x0003003e, + 0x00000022,0x00000020,0x0004003d,0x00000023,0x00000028,0x00000027,0x0003003e,0x00000025, + 0x00000028,0x000100fd,0x00010038 }; const std::vector fragment_shader = { @@ -178,8 +185,8 @@ namespace mlx VkPipelineLayoutCreateInfo pipelineLayoutInfo{}; pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; - pipelineLayoutInfo.setLayoutCount = 0; - pipelineLayoutInfo.pSetLayouts = 0; + pipelineLayoutInfo.setLayoutCount = 1; + pipelineLayoutInfo.pSetLayouts = &renderer.getDescriptorSetLayout().get(); if(vkCreatePipelineLayout(Render_Core::get().getDevice().get(), &pipelineLayoutInfo, nullptr, &_pipelineLayout) != VK_SUCCESS) core::error::report(e_kind::fatal_error, "Vulkan : failed to create a graphics pipeline layout"); diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp index 02ee696..7ddd4c3 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 15:27:44 by maldavid ### ########.fr */ +/* Updated: 2023/01/24 17:02:39 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,14 @@ namespace mlx _cmd_buffers[i].init(this); _semaphore.init(*this); + + _uniform_buffer.reset(new UBO); + _uniform_buffer->create(this, sizeof(glm::mat4)); + _layout.init(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER); + VkDescriptorPoolSize pool_sizes{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, MAX_FRAMES_IN_FLIGHT }; + _desc_pool.init(1, &pool_sizes); + _set.init(this, _uniform_buffer.get(), _layout, _desc_pool); + _pipeline.init(*this); _framebufferResized = false; @@ -135,6 +143,9 @@ namespace mlx _cmd_buffers[i].destroy(); _pipeline.destroy(); + _uniform_buffer->destroy(); + _layout.destroy(); + _desc_pool.destroy(); _swapchain.destroyFB(); _pass.destroy(); _swapchain.destroy(); diff --git a/src/renderer/renderer.h b/src/renderer/renderer.h index fba06b0..0c3d400 100644 --- a/src/renderer/renderer.h +++ b/src/renderer/renderer.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/18 17:14:45 by maldavid #+# #+# */ -/* Updated: 2023/01/23 19:08:29 by maldavid ### ########.fr */ +/* Updated: 2023/01/24 17:21:02 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -85,11 +86,15 @@ namespace mlx inline Surface& getSurface() noexcept { return _surface; } inline CmdPool& getCmdPool() noexcept { return _cmd_pool; } + inline UBO* getUniformBuffer() noexcept { return _uniform_buffer.get(); } inline SwapChain& getSwapChain() noexcept { return _swapchain; } inline Semaphore& getSemaphore() noexcept { return _semaphore; } inline RenderPass& getRenderPass() noexcept { return _pass; } inline CmdBuffer& getCmdBuffer(int i) noexcept { return _cmd_buffers[i]; } + inline GraphicPipeline& getPipeline() noexcept { return _pipeline; } inline CmdBuffer& getActiveCmdBuffer() noexcept { return _cmd_buffers[_active_image_index]; } + inline DescriptorSet& getDescriptorSet() noexcept { return _set; } + inline DescriptorSetLayout& getDescriptorSetLayout() noexcept { return _layout; } inline uint32_t getActiveImageIndex() noexcept { return _active_image_index; } inline uint32_t getImageIndex() noexcept { return _image_index; } @@ -105,9 +110,10 @@ namespace mlx SwapChain _swapchain; Semaphore _semaphore; DescriptorPool _desc_pool; - std::vector _sets; - std::vector _layouts; + DescriptorSet _set; + DescriptorSetLayout _layout; std::array _cmd_buffers; + std::unique_ptr _uniform_buffer = nullptr; class MLX_Window* _window; diff --git a/test/main.c b/test/main.c index 327eeae..bc6d792 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: 2023/01/22 18:17:53 by maldavid ### ########.fr */ +/* Updated: 2023/01/24 17:22:54 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,7 +24,11 @@ int update(t_mlx *mlx) static int i = 0; printf("%d\n", i); - mlx_pixel_put(mlx->mlx, mlx->win, 200, 50, 0xFF0000); + mlx_pixel_put(mlx->mlx, mlx->win, 12, 50, 0xFF0000); + mlx_pixel_put(mlx->mlx, mlx->win, 12, 60, 0x00FF00); + mlx_pixel_put(mlx->mlx, mlx->win, 12, 70, 0x0000FF); + mlx_pixel_put(mlx->mlx, mlx->win, 12, 80, 0xFF00FF); + mlx_pixel_put(mlx->mlx, mlx->win, 12, 90, 0xFFFF00); i++; if (i > 20000) mlx_loop_end(mlx->mlx);