From 2ab87dd3adda16a06656ae93dae36f1a61766815 Mon Sep 17 00:00:00 2001 From: kbz_8 Date: Sat, 1 Apr 2023 13:03:21 +0200 Subject: [PATCH] working pixel put pipeline --- src/platform/window.cpp | 24 +------- src/platform/window.h | 6 +- src/renderer/pipeline/pipeline.cpp | 90 ++++++++++++++--------------- src/renderer/pixel_put.cpp | 82 ++++++++++++++++++++------ src/renderer/pixel_put.h | 19 +++--- test/42_logo.png | Bin 12965 -> 22507 bytes test/main.c | 11 +++- 7 files changed, 125 insertions(+), 107 deletions(-) diff --git a/src/platform/window.cpp b/src/platform/window.cpp index 3dc9787..8052e01 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/03/31 20:30:14 by maldavid ### ########.fr */ +/* Updated: 2023/04/01 11:55:19 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,18 +29,6 @@ namespace mlx _renderer->setWindow(this); _renderer->init(); _renderer->getPixelPutPipeline().init(w, h, *_renderer); - - std::vector vertexData = { - {{0, 0}, {1.f, 0.f, 0.f}, {0.0f, 0.0f}}, - {{_width, 0}, {1.f, 0.f, 0.f}, {1.0f, 0.0f}}, - {{_width, _height}, {1.f, 0.f, 0.f}, {1.0f, 1.0f}}, - {{0, _height}, {1.f, 0.f, 0.}, {0.0f, 1.0f}} - }; - - std::vector indexData = { 0, 1, 2, 2, 3, 0 }; - - _vbo.create(sizeof(Vertex) * vertexData.size(), vertexData.data()); - _ibo.create(sizeof(uint16_t) * indexData.size(), indexData.data()); } bool MLX_Window::beginFrame() @@ -68,21 +56,15 @@ namespace mlx sets.push_back(_renderer->getPixelPutPipeline().getDescriptorSet()); vkCmdBindDescriptorSets(cmd_buff, VK_PIPELINE_BIND_POINT_GRAPHICS, _renderer->getPipeline().getPipelineLayout(), 0, sets.size(), sets.data(), 0, nullptr); + + _renderer->getPixelPutPipeline().render(*_renderer); - _vbo.bind(*_renderer); - _ibo.bind(*_renderer); - - vkCmdDrawIndexed(cmd_buff, static_cast(_ibo.getSize() / sizeof(uint16_t)), 1, 0, 0, 0); - _renderer->endFrame(); } MLX_Window::~MLX_Window() { _renderer->destroy(); - _staging_buffer.destroy(); - _vbo.destroy(); - _ibo.destroy(); if(_win) SDL_DestroyWindow(_win); } diff --git a/src/platform/window.h b/src/platform/window.h index 611e426..aa8fa1b 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: 2023/03/31 22:16:01 by maldavid ### ########.fr */ +/* Updated: 2023/04/01 11:54:09 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,8 +19,6 @@ #include #include #include -#include -#include namespace mlx { @@ -40,8 +38,6 @@ namespace mlx ~MLX_Window(); private: - C_VBO _vbo; - C_IBO _ibo; glm::mat4 _proj = glm::mat4(1.0); std::unique_ptr _renderer; SDL_Window* _win = nullptr; diff --git a/src/renderer/pipeline/pipeline.cpp b/src/renderer/pipeline/pipeline.cpp index d230a92..69595ba 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: 2023/03/31 18:56:25 by maldavid ### ########.fr */ +/* Updated: 2023/04/01 12:53:28 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,60 +41,54 @@ namespace mlx { Out.Color = aColor; Out.UV = aUV; - vec4 position = vec4(aPos.x, aPos.y, 0.0, 1.0) * uProj.mat; - gl_Position = vec4(position.x, position.y, 0.0, 1.0); + gl_Position = uProj.mat * vec4(aPos.x, aPos.y, 0.0, 1.0); } */ const std::vector vertex_shader = { - 0x07230203,0x00010000,0x0008000b,0x0000003b,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x07230203,0x00010000,0x0008000b,0x00000033,0x00000000,0x00020011,0x00000001,0x0006000b, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, 0x000a000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x00000015, - 0x0000001c,0x00000032,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, + 0x0000001c,0x00000024,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, 0x00000000,0x00030005,0x00000009,0x00000000,0x00050006,0x00000009,0x00000000,0x6f6c6f43, 0x00000072,0x00040006,0x00000009,0x00000001,0x00005655,0x00030005,0x0000000b,0x0074754f, - 0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00050005, - 0x0000001b,0x69736f70,0x6e6f6974,0x00000000,0x00040005,0x0000001c,0x736f5061,0x00000000, - 0x00050005,0x00000029,0x6f725075,0x7463656a,0x006e6f69,0x00040006,0x00000029,0x00000000, - 0x0074616d,0x00040005,0x0000002b,0x6f725075,0x0000006a,0x00060005,0x00000030,0x505f6c67, - 0x65567265,0x78657472,0x00000000,0x00060006,0x00000030,0x00000000,0x505f6c67,0x7469736f, - 0x006e6f69,0x00030005,0x00000032,0x00000000,0x00040047,0x0000000b,0x0000001e,0x00000000, - 0x00040047,0x0000000f,0x0000001e,0x00000001,0x00040047,0x00000015,0x0000001e,0x00000002, - 0x00040047,0x0000001c,0x0000001e,0x00000000,0x00040048,0x00000029,0x00000000,0x00000005, - 0x00050048,0x00000029,0x00000000,0x00000023,0x00000000,0x00050048,0x00000029,0x00000000, - 0x00000007,0x00000010,0x00030047,0x00000029,0x00000002,0x00040047,0x0000002b,0x00000022, - 0x00000000,0x00040047,0x0000002b,0x00000021,0x00000000,0x00050048,0x00000030,0x00000000, - 0x0000000b,0x00000000,0x00030047,0x00000030,0x00000002,0x00020013,0x00000002,0x00030021, - 0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006, - 0x00000003,0x00040017,0x00000008,0x00000006,0x00000002,0x0004001e,0x00000009,0x00000007, - 0x00000008,0x00040020,0x0000000a,0x00000003,0x00000009,0x0004003b,0x0000000a,0x0000000b, - 0x00000003,0x00040015,0x0000000c,0x00000020,0x00000001,0x0004002b,0x0000000c,0x0000000d, - 0x00000000,0x00040020,0x0000000e,0x00000001,0x00000007,0x0004003b,0x0000000e,0x0000000f, - 0x00000001,0x00040020,0x00000011,0x00000003,0x00000007,0x0004002b,0x0000000c,0x00000013, - 0x00000001,0x00040020,0x00000014,0x00000001,0x00000008,0x0004003b,0x00000014,0x00000015, - 0x00000001,0x00040020,0x00000017,0x00000003,0x00000008,0x00040017,0x00000019,0x00000006, - 0x00000004,0x00040020,0x0000001a,0x00000007,0x00000019,0x0004003b,0x00000014,0x0000001c, - 0x00000001,0x00040015,0x0000001d,0x00000020,0x00000000,0x0004002b,0x0000001d,0x0000001e, - 0x00000000,0x00040020,0x0000001f,0x00000001,0x00000006,0x0004002b,0x0000001d,0x00000022, - 0x00000001,0x0004002b,0x00000006,0x00000025,0x00000000,0x0004002b,0x00000006,0x00000026, - 0x3f800000,0x00040018,0x00000028,0x00000019,0x00000004,0x0003001e,0x00000029,0x00000028, - 0x00040020,0x0000002a,0x00000002,0x00000029,0x0004003b,0x0000002a,0x0000002b,0x00000002, - 0x00040020,0x0000002c,0x00000002,0x00000028,0x0003001e,0x00000030,0x00000019,0x00040020, - 0x00000031,0x00000003,0x00000030,0x0004003b,0x00000031,0x00000032,0x00000003,0x00040020, - 0x00000033,0x00000007,0x00000006,0x00040020,0x00000039,0x00000003,0x00000019,0x00050036, - 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x0000001a, - 0x0000001b,0x00000007,0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011, - 0x00000012,0x0000000b,0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008, - 0x00000016,0x00000015,0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e, - 0x00000018,0x00000016,0x00050041,0x0000001f,0x00000020,0x0000001c,0x0000001e,0x0004003d, - 0x00000006,0x00000021,0x00000020,0x00050041,0x0000001f,0x00000023,0x0000001c,0x00000022, - 0x0004003d,0x00000006,0x00000024,0x00000023,0x00070050,0x00000019,0x00000027,0x00000021, - 0x00000024,0x00000025,0x00000026,0x00050041,0x0000002c,0x0000002d,0x0000002b,0x0000000d, - 0x0004003d,0x00000028,0x0000002e,0x0000002d,0x00050090,0x00000019,0x0000002f,0x00000027, - 0x0000002e,0x0003003e,0x0000001b,0x0000002f,0x00050041,0x00000033,0x00000034,0x0000001b, - 0x0000001e,0x0004003d,0x00000006,0x00000035,0x00000034,0x00050041,0x00000033,0x00000036, - 0x0000001b,0x00000022,0x0004003d,0x00000006,0x00000037,0x00000036,0x00070050,0x00000019, - 0x00000038,0x00000035,0x00000037,0x00000025,0x00000026,0x00050041,0x00000039,0x0000003a, - 0x00000032,0x0000000d,0x0003003e,0x0000003a,0x00000038,0x000100fd,0x00010038 + 0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00060005, + 0x0000001a,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x0000001a,0x00000000, + 0x505f6c67,0x7469736f,0x006e6f69,0x00030005,0x0000001c,0x00000000,0x00050005,0x0000001e, + 0x6f725075,0x7463656a,0x006e6f69,0x00040006,0x0000001e,0x00000000,0x0074616d,0x00040005, + 0x00000020,0x6f725075,0x0000006a,0x00040005,0x00000024,0x736f5061,0x00000000,0x00040047, + 0x0000000b,0x0000001e,0x00000000,0x00040047,0x0000000f,0x0000001e,0x00000001,0x00040047, + 0x00000015,0x0000001e,0x00000002,0x00050048,0x0000001a,0x00000000,0x0000000b,0x00000000, + 0x00030047,0x0000001a,0x00000002,0x00040048,0x0000001e,0x00000000,0x00000005,0x00050048, + 0x0000001e,0x00000000,0x00000023,0x00000000,0x00050048,0x0000001e,0x00000000,0x00000007, + 0x00000010,0x00030047,0x0000001e,0x00000002,0x00040047,0x00000020,0x00000022,0x00000000, + 0x00040047,0x00000020,0x00000021,0x00000000,0x00040047,0x00000024,0x0000001e,0x00000000, + 0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020, + 0x00040017,0x00000007,0x00000006,0x00000003,0x00040017,0x00000008,0x00000006,0x00000002, + 0x0004001e,0x00000009,0x00000007,0x00000008,0x00040020,0x0000000a,0x00000003,0x00000009, + 0x0004003b,0x0000000a,0x0000000b,0x00000003,0x00040015,0x0000000c,0x00000020,0x00000001, + 0x0004002b,0x0000000c,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000001,0x00000007, + 0x0004003b,0x0000000e,0x0000000f,0x00000001,0x00040020,0x00000011,0x00000003,0x00000007, + 0x0004002b,0x0000000c,0x00000013,0x00000001,0x00040020,0x00000014,0x00000001,0x00000008, + 0x0004003b,0x00000014,0x00000015,0x00000001,0x00040020,0x00000017,0x00000003,0x00000008, + 0x00040017,0x00000019,0x00000006,0x00000004,0x0003001e,0x0000001a,0x00000019,0x00040020, + 0x0000001b,0x00000003,0x0000001a,0x0004003b,0x0000001b,0x0000001c,0x00000003,0x00040018, + 0x0000001d,0x00000019,0x00000004,0x0003001e,0x0000001e,0x0000001d,0x00040020,0x0000001f, + 0x00000002,0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000002,0x00040020,0x00000021, + 0x00000002,0x0000001d,0x0004003b,0x00000014,0x00000024,0x00000001,0x00040015,0x00000025, + 0x00000020,0x00000000,0x0004002b,0x00000025,0x00000026,0x00000000,0x00040020,0x00000027, + 0x00000001,0x00000006,0x0004002b,0x00000025,0x0000002a,0x00000001,0x0004002b,0x00000006, + 0x0000002d,0x00000000,0x0004002b,0x00000006,0x0000002e,0x3f800000,0x00040020,0x00000031, + 0x00000003,0x00000019,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8, + 0x00000005,0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011,0x00000012, + 0x0000000b,0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008,0x00000016, + 0x00000015,0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e,0x00000018, + 0x00000016,0x00050041,0x00000021,0x00000022,0x00000020,0x0000000d,0x0004003d,0x0000001d, + 0x00000023,0x00000022,0x00050041,0x00000027,0x00000028,0x00000024,0x00000026,0x0004003d, + 0x00000006,0x00000029,0x00000028,0x00050041,0x00000027,0x0000002b,0x00000024,0x0000002a, + 0x0004003d,0x00000006,0x0000002c,0x0000002b,0x00070050,0x00000019,0x0000002f,0x00000029, + 0x0000002c,0x0000002d,0x0000002e,0x00050091,0x00000019,0x00000030,0x00000023,0x0000002f, + 0x00050041,0x00000031,0x00000032,0x0000001c,0x0000000d,0x0003003e,0x00000032,0x00000030, + 0x000100fd,0x00010038 }; /** diff --git a/src/renderer/pixel_put.cpp b/src/renderer/pixel_put.cpp index 48cdd05..adc999e 100644 --- a/src/renderer/pixel_put.cpp +++ b/src/renderer/pixel_put.cpp @@ -6,51 +6,95 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/31 15:14:50 by maldavid #+# #+# */ -/* Updated: 2023/03/31 20:30:38 by maldavid ### ########.fr */ +/* Updated: 2023/04/01 12:57:32 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ +#include +#include +#include #include -#include #include namespace mlx { + struct PixelPutPipeline::_Pimpl + { + Image image; + C_VBO vbo; + C_IBO ibo; + Buffer buffer; + DescriptorSet image_set; + void* map = nullptr; + uint32_t width = 0; + uint32_t height = 0; + }; + + PixelPutPipeline::PixelPutPipeline() : _impl(std::make_unique<_Pimpl>()) {} + void PixelPutPipeline::init(uint32_t width, uint32_t height, Renderer& renderer) noexcept { - _image.create(width, height, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, + _impl->image.create(width, height, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - _image.createImageView(VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT); - _image.createSampler(); - _buffer.create(Buffer::kind::dynamic, sizeof(uint32_t) * (width * height), VK_BUFFER_USAGE_TRANSFER_SRC_BIT); - _image_set = renderer.getFragDescriptorSet().duplicate(); - _width = width; - _height = height; + _impl->image.createImageView(VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT); + _impl->image.createSampler(); + _impl->buffer.create(Buffer::kind::dynamic, sizeof(uint32_t) * (width * height), VK_BUFFER_USAGE_TRANSFER_SRC_BIT); + _impl->image_set = renderer.getFragDescriptorSet().duplicate(); + _impl->width = width; + _impl->height = height; + + std::vector vertexData = { + {{0, 0}, {1.f, 1.f, 1.f}, {0.0f, 0.0f}}, + {{_impl->width, 0}, {1.f, 1.f, 1.f}, {1.0f, 0.0f}}, + {{_impl->width, _impl->height}, {1.f, 1.f, 1.f}, {1.0f, 1.0f}}, + {{0, _impl->height}, {1.f, 1.f, 1.0}, {0.0f, 1.0f}} + }; + + std::vector indexData = { 0, 1, 2, 2, 3, 0 }; + + _impl->vbo.create(sizeof(Vertex) * vertexData.size(), vertexData.data()); + _impl->ibo.create(sizeof(uint16_t) * indexData.size(), indexData.data()); + } + + VkDescriptorSet& PixelPutPipeline::getDescriptorSet() noexcept + { + return _impl->image_set.get(); } void PixelPutPipeline::setPixel(uint32_t x, uint32_t y, int color) noexcept { - if(x < 0 || y < 0 || x > _width || y > _height) + if(x < 0 || y < 0 || x > _impl->width || y > _impl->height) return; - if(!_buffer.isMapped()) - _buffer.mapMem(&_map); + if(!_impl->buffer.isMapped()) + _impl->buffer.mapMem(&_impl->map); - unsigned char* mem = static_cast(_map) + y * _width + x * sizeof(uint32_t); + unsigned char* mem = static_cast(_impl->map) + (y * _impl->width * sizeof(uint32_t)) + (x * sizeof(uint32_t)); *reinterpret_cast(mem) = color; } void PixelPutPipeline::present() noexcept { - if(_buffer.isMapped()) - _buffer.unmapMem(); - _image.copyBuffer(_buffer); - _image_set.writeDescriptor(0, _image.getImageView(), _image.getSampler()); + if(_impl->buffer.isMapped()) + _impl->buffer.unmapMem(); + _impl->image.copyBuffer(_impl->buffer); + _impl->image_set.writeDescriptor(0, _impl->image.getImageView(), _impl->image.getSampler()); + } + + void PixelPutPipeline::render(Renderer& renderer) noexcept + { + _impl->vbo.bind(renderer); + _impl->ibo.bind(renderer); + vkCmdDrawIndexed(renderer.getActiveCmdBuffer().get(), static_cast(_impl->ibo.getSize() / sizeof(uint16_t)), 1, 0, 0, 0); } void PixelPutPipeline::destroy() noexcept { - _buffer.destroy(); - _image.destroy(); + _impl->vbo.destroy(); + _impl->ibo.destroy(); + _impl->buffer.destroy(); + _impl->image.destroy(); } + + PixelPutPipeline::~PixelPutPipeline() {} } diff --git a/src/renderer/pixel_put.h b/src/renderer/pixel_put.h index 3b5cc1b..13a1626 100644 --- a/src/renderer/pixel_put.h +++ b/src/renderer/pixel_put.h @@ -6,15 +6,13 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/31 13:18:50 by maldavid #+# #+# */ -/* Updated: 2023/03/31 20:30:25 by maldavid ### ########.fr */ +/* Updated: 2023/04/01 12:10:33 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef __MLX_PIXEL_PUT__ #define __MLX_PIXEL_PUT__ -#include -#include #include namespace mlx @@ -22,25 +20,22 @@ namespace mlx class PixelPutPipeline { public: - PixelPutPipeline() = default; + PixelPutPipeline(); void init(uint32_t width, uint32_t height, class Renderer& renderer) noexcept; void setPixel(uint32_t x, uint32_t y, int color) noexcept; void present() noexcept; - inline VkDescriptorSet& getDescriptorSet() noexcept { return _image_set.get(); } + void render(class Renderer& renderer) noexcept; + VkDescriptorSet& getDescriptorSet() noexcept; void destroy() noexcept; - ~PixelPutPipeline() = default; + ~PixelPutPipeline(); private: - Image _image; - Buffer _buffer; - DescriptorSet _image_set; - void* _map = nullptr; - uint32_t _width = 0; - uint32_t _height = 0; + struct _Pimpl; + std::unique_ptr<_Pimpl> _impl; }; } diff --git a/test/42_logo.png b/test/42_logo.png index dcc60aea7275fed2b3dccd2bf93a33748026c394..833ae16f171f02adf6cf88a937e4909e6097f39f 100644 GIT binary patch literal 22507 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 HE?xUyDHK4d literal 12965 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 Gh5jFiOw#QD diff --git a/test/main.c b/test/main.c index f36f023..8d46ac0 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/03/31 20:26:59 by maldavid ### ########.fr */ +/* Updated: 2023/04/01 13:00:56 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,8 +22,15 @@ typedef struct int update(t_mlx *mlx) { static int i = 0; + int j; - mlx_pixel_put(mlx->mlx, mlx->win, 100, 0, 0xFFFFFFFF); + j = 0; + while (j < 400) + { + mlx_pixel_put(mlx->mlx, mlx->win, j, j, 0xFFFFFFFF); + mlx_pixel_put(mlx->mlx, mlx->win, 399 - j, j, 0xFFFFFFFF); + j++; + } i++; if (i > 10000) mlx_loop_end(mlx->mlx);