From 90a4c9cf8dca04a4c456b51421377ea2f8d9349b Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Sat, 22 Jul 2023 17:11:06 -0700 Subject: [PATCH] Initialize command buffer allocationFix `SDL_Vulkan_GetDrawableSize` call --- include/renderer_vk/renderer_vk.hpp | 3 +++ src/core/renderer_vk/renderer_vk.cpp | 28 +++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/include/renderer_vk/renderer_vk.hpp b/include/renderer_vk/renderer_vk.hpp index 36fa46b3..1ffa2578 100644 --- a/include/renderer_vk/renderer_vk.hpp +++ b/include/renderer_vk/renderer_vk.hpp @@ -30,6 +30,9 @@ class RendererVK final : public Renderer { std::vector swapchainImages = {}; std::vector swapchainImageViews = {}; + vk::UniqueCommandPool commandPool = {}; + vk::UniqueCommandBuffer presentCommandBuffer = {}; + public: RendererVK(GPU& gpu, const std::array& internalRegs); ~RendererVK() override; diff --git a/src/core/renderer_vk/renderer_vk.cpp b/src/core/renderer_vk/renderer_vk.cpp index 135a07da..57dfb0b8 100644 --- a/src/core/renderer_vk/renderer_vk.cpp +++ b/src/core/renderer_vk/renderer_vk.cpp @@ -29,7 +29,7 @@ RendererVK::~RendererVK() {} void RendererVK::reset() {} void RendererVK::display() { - u32 swapchainImageIndex; + u32 swapchainImageIndex = ~0u; if (const auto acquireResult = device->acquireNextImageKHR(swapchain.get(), ~0ULL, presetWaitSemaphore.get()); acquireResult.result == vk::Result::eSuccess) { swapchainImageIndex = acquireResult.value; @@ -53,7 +53,7 @@ void RendererVK::display() { static const vk::PipelineStageFlags waitStageMask = vk::PipelineStageFlagBits::eAllCommands; submitInfo.setWaitDstStageMask(waitStageMask); - submitInfo.setCommandBuffers({}); + submitInfo.setCommandBuffers(presentCommandBuffer.get()); submitInfo.setSignalSemaphores(renderDoneSemaphore.get()); if (const vk::Result submitResult = presentQueue.submit({submitInfo}); submitResult != vk::Result::eSuccess) { @@ -284,7 +284,7 @@ void RendererVK::initGraphicsContext(SDL_Window* window) { vk::Extent2D swapchainExtent; { int windowWidth, windowHeight; - SDL_Vulkan_GetDrawableSize(window, &windowHeight, &windowWidth); + SDL_Vulkan_GetDrawableSize(window, &windowWidth, &windowHeight); swapchainExtent.width = windowWidth; swapchainExtent.height = windowHeight; } @@ -415,6 +415,28 @@ void RendererVK::initGraphicsContext(SDL_Window* window) { } else { Helpers::panic("Error creating acquiring swapchain images: %s\n", vk::to_string(getResult.result).c_str()); } + + // Command pool + vk::CommandPoolCreateInfo commandPoolInfo = {}; + commandPoolInfo.flags = vk::CommandPoolCreateFlagBits::eResetCommandBuffer; + + if (auto createResult = device->createCommandPoolUnique(commandPoolInfo); createResult.result == vk::Result::eSuccess) { + commandPool = std::move(createResult.value); + } else { + Helpers::panic("Error creating command pool: %s\n", vk::to_string(createResult.result).c_str()); + } + + // Command buffer(s) + vk::CommandBufferAllocateInfo commandBuffersInfo = {}; + commandBuffersInfo.commandPool = commandPool.get(); + commandBuffersInfo.level = vk::CommandBufferLevel::ePrimary; + commandBuffersInfo.commandBufferCount = 1; + + if (auto allocateResult = device->allocateCommandBuffersUnique(commandBuffersInfo); allocateResult.result == vk::Result::eSuccess) { + presentCommandBuffer = std::move(allocateResult.value[0]); + } else { + Helpers::panic("Error allocating command buffer: %s\n", vk::to_string(allocateResult.result).c_str()); + } } void RendererVK::clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) {}