From 9aaa26ddf5448dcde4277844b9472e09b10660c9 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Sun, 24 Dec 2023 16:07:09 +0100 Subject: [PATCH] fixing frame capture --- src/core/application.cpp | 6 +-- src/core/graphics.cpp | 10 ++++- src/core/graphics.h | 5 +-- src/core/graphics.inl | 8 ---- src/renderer/command/vk_cmd_buffer.cpp | 10 ++++- .../descriptors/vk_descriptor_set.cpp | 11 +++--- src/renderer/descriptors/vk_descriptor_set.h | 4 +- src/renderer/images/texture.cpp | 7 +--- src/renderer/images/texture.h | 4 +- src/renderer/images/texture_atlas.h | 4 +- src/renderer/pixel_put.cpp | 4 +- src/renderer/renderer.cpp | 24 +++++++----- src/renderer/renderpass/vk_render_pass.cpp | 39 ++++++++++++++----- src/renderer/renderpass/vk_render_pass.h | 2 +- test/main.c | 2 +- 15 files changed, 82 insertions(+), 58 deletions(-) diff --git a/src/core/application.cpp b/src/core/application.cpp index 5c77a04..1335786 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 22:10:52 by maldavid #+# #+# */ -/* Updated: 2023/12/21 00:17:54 by maldavid ### ########.fr */ +/* Updated: 2023/12/24 08:56:33 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,14 +37,12 @@ namespace mlx::core while(_in->is_running()) { _in->update(); - for(auto& gs : _graphics) - gs->beginRender(); if(_loop_hook) _loop_hook(_param); for(auto& gs : _graphics) - gs->endRender(); + gs->render(); } } diff --git a/src/core/graphics.cpp b/src/core/graphics.cpp index a0555ef..69db6e3 100644 --- a/src/core/graphics.cpp +++ b/src/core/graphics.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/02 15:13:55 by maldavid #+# #+# */ -/* Updated: 2023/12/22 23:10:51 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/24 09:39:45 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,8 +42,12 @@ namespace mlx _text_put_pipeline->init(_renderer.get()); } - void GraphicsSupport::endRender() noexcept + void GraphicsSupport::render() noexcept { + if(!_renderer->beginFrame()) + return; + _proj = glm::ortho(0, _width, 0, _height); + _renderer->getUniformBuffer()->setData(sizeof(_proj), &_proj); auto cmd_buff = _renderer->getActiveCmdBuffer().get(); static std::array sets = { @@ -57,6 +61,8 @@ namespace mlx continue; if(data.texture->getSet() == VK_NULL_HANDLE) data.texture->setDescriptor(_renderer->getFragDescriptorSet().duplicate()); + if(data.texture->getLayout() != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) + data.texture->transitionLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); if(!data.texture->hasBeenUpdated()) data.texture->updateSet(0); sets[1] = data.texture->getSet(); diff --git a/src/core/graphics.h b/src/core/graphics.h index 05cc2e7..04f66b0 100644 --- a/src/core/graphics.h +++ b/src/core/graphics.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/02 14:49:49 by maldavid #+# #+# */ -/* Updated: 2023/12/22 23:10:14 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/24 08:56:14 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,8 +39,7 @@ namespace mlx inline int& getID() noexcept; inline std::shared_ptr getWindow(); - inline void beginRender() noexcept; - void endRender() noexcept; + void render() noexcept; inline void clearRenderData() noexcept; inline void pixelPut(int x, int y, uint32_t color) noexcept; diff --git a/src/core/graphics.inl b/src/core/graphics.inl index 2906b2d..b5555e8 100644 --- a/src/core/graphics.inl +++ b/src/core/graphics.inl @@ -19,14 +19,6 @@ namespace mlx int& GraphicsSupport::getID() noexcept { return _id; } std::shared_ptr GraphicsSupport::getWindow() { return _window; } - void GraphicsSupport::beginRender() noexcept - { - if(!_renderer->beginFrame()) - return; - _proj = glm::ortho(0, _width, 0, _height); - _renderer->getUniformBuffer()->setData(sizeof(_proj), &_proj); - } - void GraphicsSupport::clearRenderData() noexcept { _textures_to_render.clear(); diff --git a/src/renderer/command/vk_cmd_buffer.cpp b/src/renderer/command/vk_cmd_buffer.cpp index 2c47f76..b1dade7 100644 --- a/src/renderer/command/vk_cmd_buffer.cpp +++ b/src/renderer/command/vk_cmd_buffer.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:26:06 by maldavid #+# #+# */ -/* Updated: 2023/12/23 01:32:02 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/24 12:58:36 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -85,7 +85,8 @@ namespace mlx VkFence fence; vkCreateFence(device, &fenceCreateInfo, nullptr, &fence); vkResetFences(device, 1, &fence); - vkQueueSubmit(Render_Core::get().getQueue().getGraphic(), 1, &submitInfo, fence); + if(vkQueueSubmit(Render_Core::get().getQueue().getGraphic(), 1, &submitInfo, fence) != VK_SUCCESS) + core::error::report(e_kind::fatal_error, "Vulkan error : failed to submit a single time command buffer"); _state = state::submitted; vkWaitForFences(device, 1, &fence, VK_TRUE, UINT64_MAX); vkDestroyFence(device, fence, nullptr); @@ -102,6 +103,11 @@ namespace mlx signalSemaphores[0] = semaphores->getRenderImageSemaphore(); waitSemaphores[0] = semaphores->getImageSemaphore(); } + else + { + signalSemaphores[0] = nullptr; + waitSemaphores[0] = nullptr; + } VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }; VkSubmitInfo submitInfo{}; diff --git a/src/renderer/descriptors/vk_descriptor_set.cpp b/src/renderer/descriptors/vk_descriptor_set.cpp index f0365a1..cf6a624 100644 --- a/src/renderer/descriptors/vk_descriptor_set.cpp +++ b/src/renderer/descriptors/vk_descriptor_set.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/23 18:40:44 by maldavid #+# #+# */ -/* Updated: 2023/12/14 16:45:11 by maldavid ### ########.fr */ +/* Updated: 2023/12/24 09:37:55 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ #include "vk_descriptor_set_layout.h" #include #include +#include namespace mlx { @@ -66,14 +67,14 @@ namespace mlx } } - void DescriptorSet::writeDescriptor(int binding, VkImageView view, VkSampler sampler) const noexcept + void DescriptorSet::writeDescriptor(int binding, const Image& image) const noexcept { auto device = Render_Core::get().getDevice().get(); VkDescriptorImageInfo imageInfo{}; - imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - imageInfo.imageView = view; - imageInfo.sampler = sampler; + imageInfo.imageLayout = image.getLayout(); + imageInfo.imageView = image.getImageView(); + imageInfo.sampler = image.getSampler(); VkWriteDescriptorSet descriptorWrite{}; descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; diff --git a/src/renderer/descriptors/vk_descriptor_set.h b/src/renderer/descriptors/vk_descriptor_set.h index 601032f..f1e627d 100644 --- a/src/renderer/descriptors/vk_descriptor_set.h +++ b/src/renderer/descriptors/vk_descriptor_set.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/23 18:39:36 by maldavid #+# #+# */ -/* Updated: 2023/12/14 17:12:49 by maldavid ### ########.fr */ +/* Updated: 2023/12/23 18:47:49 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,7 +26,7 @@ namespace mlx void init(class Renderer* renderer, class DescriptorPool* pool, class DescriptorSetLayout* layout); void writeDescriptor(int binding, class UBO* ubo) const noexcept; - void writeDescriptor(int binding, VkImageView view, VkSampler sampler) const noexcept; + void writeDescriptor(int binding, const class Image& image) const noexcept; inline bool isInit() const noexcept { return _pool != nullptr && _renderer != nullptr; } diff --git a/src/renderer/images/texture.cpp b/src/renderer/images/texture.cpp index d013652..35fe3e4 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 01:52:49 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/23 18:49:53 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -121,16 +121,11 @@ namespace mlx _has_been_modified = false; } auto cmd = renderer.getActiveCmdBuffer(); - VkImageLayout layout_save = getLayout(); - if(getLayout() != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - transitionLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, &cmd); _vbo.bind(renderer); _ibo.bind(renderer); glm::vec2 translate(x, y); vkCmdPushConstants(cmd.get(), renderer.getPipeline().getPipelineLayout(), VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(translate), &translate); vkCmdDrawIndexed(cmd.get(), static_cast(_ibo.getSize() / sizeof(uint16_t)), 1, 0, 0, 0); - if(getLayout() != layout_save) - transitionLayout(layout_save, &cmd); } void Texture::destroy() noexcept diff --git a/src/renderer/images/texture.h b/src/renderer/images/texture.h index 725b37a..19f7d24 100644 --- a/src/renderer/images/texture.h +++ b/src/renderer/images/texture.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/08 02:24:58 by maldavid #+# #+# */ -/* Updated: 2023/12/14 14:37:08 by maldavid ### ########.fr */ +/* Updated: 2023/12/23 18:49:12 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,7 +40,7 @@ namespace mlx inline void setDescriptor(DescriptorSet set) noexcept { _set = std::move(set); } inline VkDescriptorSet getSet() noexcept { return _set.isInit() ? _set.get() : VK_NULL_HANDLE; } - inline void updateSet(int binding) noexcept { _set.writeDescriptor(binding, getImageView(), getSampler()); _has_been_updated = true; } + inline void updateSet(int binding) noexcept { _set.writeDescriptor(binding, *this); _has_been_updated = true; } inline bool hasBeenUpdated() const noexcept { return _has_been_updated; } inline constexpr void resetUpdate() noexcept { _has_been_updated = false; } diff --git a/src/renderer/images/texture_atlas.h b/src/renderer/images/texture_atlas.h index 1cb8c09..6191ca9 100644 --- a/src/renderer/images/texture_atlas.h +++ b/src/renderer/images/texture_atlas.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/07 16:36:33 by maldavid #+# #+# */ -/* Updated: 2023/12/14 17:12:54 by maldavid ### ########.fr */ +/* Updated: 2023/12/23 18:49:25 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,7 +31,7 @@ namespace mlx inline void setDescriptor(DescriptorSet&& set) noexcept { _set = set; } inline VkDescriptorSet getSet() noexcept { return _set.isInit() ? _set.get() : VK_NULL_HANDLE; } - inline void updateSet(int binding) const noexcept { _set.writeDescriptor(binding, getImageView(), getSampler()); } + inline void updateSet(int binding) const noexcept { _set.writeDescriptor(binding, *this); } ~TextureAtlas() = default; diff --git a/src/renderer/pixel_put.cpp b/src/renderer/pixel_put.cpp index 7dcff20..c94d30b 100644 --- a/src/renderer/pixel_put.cpp +++ b/src/renderer/pixel_put.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/31 15:14:50 by maldavid #+# #+# */ -/* Updated: 2023/12/14 18:26:03 by maldavid ### ########.fr */ +/* Updated: 2023/12/23 19:34:30 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -56,7 +56,7 @@ namespace mlx { _texture.render(renderer, 0, 0); } - + void PixelPutPipeline::destroy() noexcept { _buffer.destroy(); diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp index 7fbe199..2a57b20 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: 2023/12/23 01:28:03 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/24 16:04:04 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,7 +38,7 @@ namespace mlx for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) _semaphores[i].init(); - + _uniform_buffer.reset(new UBO); #ifdef DEBUG _uniform_buffer->create(this, sizeof(glm::mat4), "__mlx_matrices_uniform_buffer_"); @@ -51,14 +51,14 @@ namespace mlx { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 4096 } }; _desc_pool.init(2, pool_sizes); - + _vert_layout.init({ {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER} }, VK_SHADER_STAGE_VERTEX_BIT); _frag_layout.init({ {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER} }, VK_SHADER_STAGE_FRAGMENT_BIT); - + _vert_set.init(this, &_desc_pool, &_vert_layout); _frag_set.init(this, &_desc_pool, &_frag_layout); @@ -73,9 +73,9 @@ namespace mlx { auto device = Render_Core::get().getDevice().get(); - _cmd.getCmdBuffer(_current_frame_index).waitForExecution(); if(_render_target == nullptr) { + _cmd.getCmdBuffer(_current_frame_index).waitForExecution(); VkResult result = vkAcquireNextImageKHR(device, _swapchain(), UINT64_MAX, _semaphores[_current_frame_index].getImageSemaphore(), VK_NULL_HANDLE, &_image_index); if(result == VK_ERROR_OUT_OF_DATE_KHR) @@ -87,7 +87,11 @@ namespace mlx core::error::report(e_kind::fatal_error, "Vulkan error : failed to acquire swapchain image"); } else + { _image_index = 0; + if(_render_target->getLayout() != VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) + _render_target->transitionLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + } _cmd.getCmdBuffer(_current_frame_index).reset(); _cmd.getCmdBuffer(_current_frame_index).beginRecord(); @@ -107,7 +111,7 @@ namespace mlx VkRect2D scissor{}; scissor.offset = { 0, 0 }; - scissor.extent = _swapchain.getExtent(); + scissor.extent = { fb.getWidth(), fb.getHeight()}; vkCmdSetScissor(_cmd.getCmdBuffer(_current_frame_index).get(), 0, 1, &scissor); return true; @@ -142,11 +146,13 @@ namespace mlx } else if(result != VK_SUCCESS) core::error::report(e_kind::fatal_error, "Vulkan error : failed to present swap chain image"); + _current_frame_index = (_current_frame_index + 1) % MAX_FRAMES_IN_FLIGHT; } else - _cmd.getCmdBuffer(_current_frame_index).submit(nullptr); - - _current_frame_index = (_current_frame_index + 1) % MAX_FRAMES_IN_FLIGHT; + { + _cmd.getCmdBuffer(_current_frame_index).submitIdle(); + _current_frame_index = 0; + } } void Renderer::destroy() diff --git a/src/renderer/renderpass/vk_render_pass.cpp b/src/renderer/renderpass/vk_render_pass.cpp index a2dc03c..2c2dc9c 100644 --- a/src/renderer/renderpass/vk_render_pass.cpp +++ b/src/renderer/renderpass/vk_render_pass.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:21:36 by maldavid #+# #+# */ -/* Updated: 2023/12/22 23:05:38 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/24 15:31:02 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,6 @@ #include #include #include -#include namespace mlx { @@ -36,17 +35,40 @@ namespace mlx colorAttachmentRef.attachment = 0; colorAttachmentRef.layout = (layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : layout); - VkSubpassDescription subpass{}; - subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass.colorAttachmentCount = 1; - subpass.pColorAttachments = &colorAttachmentRef; + VkSubpassDescription subpass1{}; + subpass1.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass1.colorAttachmentCount = 1; + subpass1.pColorAttachments = &colorAttachmentRef; + + VkSubpassDescription subpasses[] = { subpass1 }; + + std::vector subpassesDeps; + subpassesDeps.emplace_back(); + subpassesDeps.back().srcSubpass = VK_SUBPASS_EXTERNAL; + subpassesDeps.back().dstSubpass = 0; + subpassesDeps.back().srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + subpassesDeps.back().dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + subpassesDeps.back().srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; + subpassesDeps.back().dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + subpassesDeps.back().dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + + subpassesDeps.emplace_back(); + subpassesDeps.back().srcSubpass = 0; + subpassesDeps.back().dstSubpass = VK_SUBPASS_EXTERNAL; + subpassesDeps.back().srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + subpassesDeps.back().dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + subpassesDeps.back().srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + subpassesDeps.back().dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + subpassesDeps.back().dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; VkRenderPassCreateInfo renderPassInfo{}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; renderPassInfo.attachmentCount = 1; renderPassInfo.pAttachments = &colorAttachment; - renderPassInfo.subpassCount = 1; - renderPassInfo.pSubpasses = &subpass; + renderPassInfo.subpassCount = sizeof(subpasses) / sizeof(VkSubpassDescription); + renderPassInfo.pSubpasses = subpasses; + renderPassInfo.dependencyCount = static_cast(subpassesDeps.size()); + renderPassInfo.pDependencies = subpassesDeps.data(); if(vkCreateRenderPass(Render_Core::get().getDevice().get(), &renderPassInfo, nullptr, &_renderPass) != VK_SUCCESS) core::error::report(e_kind::fatal_error, "Vulkan : failed to create render pass"); @@ -78,7 +100,6 @@ namespace mlx { if(!_is_running) return; - vkCmdEndRenderPass(cmd.get()); _is_running = false; } diff --git a/src/renderer/renderpass/vk_render_pass.h b/src/renderer/renderpass/vk_render_pass.h index 61625ec..3d57b4d 100644 --- a/src/renderer/renderpass/vk_render_pass.h +++ b/src/renderer/renderpass/vk_render_pass.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:22:00 by maldavid #+# #+# */ -/* Updated: 2023/12/22 23:00:00 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/24 13:01:56 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/test/main.c b/test/main.c index 851aeda..402ae5b 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/12/16 19:14:56 by maldavid ### ########.fr */ +/* Updated: 2023/12/24 16:02:35 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */