diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index c4dee00b..2328f686 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -62,10 +62,22 @@ namespace MobileGL::MG_Backend::DirectVulkan { CreateSwapchain(); CreateSwapchainImageViews(); CreateCommandPool(); + CreateCommandBuffer(); + CreateDefaultRenderPass(); MGLOG_D("VulkanRenderer initialized"); } void VulkanRenderer::Shutdown() { + for (auto fb : m_framebuffers) { + vkDestroyFramebuffer(m_device, fb, nullptr); + } + m_framebuffers.clear(); + + if (m_renderPass != VK_NULL_HANDLE) { + vkDestroyRenderPass(m_device, m_renderPass, nullptr); + m_renderPass = VK_NULL_HANDLE; + } + if (m_commandPool != VK_NULL_HANDLE) { vkDestroyCommandPool(m_device, m_commandPool, nullptr); m_commandPool = VK_NULL_HANDLE; @@ -860,6 +872,49 @@ namespace MobileGL::MG_Backend::DirectVulkan { MGLOG_I("Command buffer created"); } + void VulkanRenderer::CreateDefaultRenderPass() { + VkAttachmentDescription color{}; + color.format = m_swapchainSurfaceFormat.format; + color.samples = VK_SAMPLE_COUNT_1_BIT; + color.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + color.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + color.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + color.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + + VkAttachmentReference colorRef{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}; + VkSubpassDescription sub{}; + sub.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + sub.colorAttachmentCount = 1; + sub.pColorAttachments = &colorRef; + + VkRenderPassCreateInfo rpci{VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO}; + rpci.attachmentCount = 1; + rpci.pAttachments = &color; + rpci.subpassCount = 1; + rpci.pSubpasses = ⊂ + + VK_VERIFY(vkCreateRenderPass(m_device, &rpci, nullptr, &m_renderPass), "vkCreateRenderPass"); + + // Create framebuffers now (use swapchain imageviews) + const auto& imageViews = m_swapChainImageViews; + Vector& fbs = m_framebuffers; + fbs.reserve(imageViews.size()); + for (auto iv : imageViews) { + VkImageView attachments[] = {iv}; + VkFramebufferCreateInfo fbci{VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO}; + fbci.renderPass = m_renderPass; + fbci.attachmentCount = 1; + fbci.pAttachments = attachments; + fbci.width = m_swapChainExtent.width; + fbci.height = m_swapChainExtent.height; + fbci.layers = 1; + VkFramebuffer fb; + VK_VERIFY(vkCreateFramebuffer(m_device, &fbci, nullptr, &fb), "vkCreateFramebuffer"); + fbs.push_back(fb); + } + MGLOG_D("RenderPass created and framebuffers set"); + } + void VulkanRenderer::CreateSurface() { #if defined VK_USE_PLATFORM_ANDROID_KHR auto* nativeWindow = static_cast(m_window); diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h index 50b8b027..2ca4e5a4 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h @@ -96,6 +96,9 @@ namespace MobileGL::MG_Backend::DirectVulkan { VkCommandPool m_commandPool = VK_NULL_HANDLE; VkCommandBuffer m_commandBuffer = VK_NULL_HANDLE; + VkRenderPass m_renderPass = VK_NULL_HANDLE; + Vector m_framebuffers; + void CreateInstance(); VkResult SetupDebugMessenger(); VkResult DestroyDebugMessenger(); @@ -107,6 +110,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { void CreateSwapchainImageViews(); void CreateCommandPool(); void CreateCommandBuffer(); + void CreateDefaultRenderPass(); static Int GetPresentQueueFamilyIndex( const PhysicalDevice& physicalDevice, VkSurfaceKHR surface,