From 2ad423318c07e6b468747489aaa8d28e35f5c5d9 Mon Sep 17 00:00:00 2001 From: InkSoul Date: Sat, 9 Mar 2024 22:42:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=91=BD=E4=BB=A4=E7=BC=93?= =?UTF-8?q?=E5=86=B2=E5=8C=BA=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VulkanTutorial.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++++ VulkanTutorial.h | 11 ++++++ 2 files changed, 103 insertions(+) diff --git a/VulkanTutorial.cpp b/VulkanTutorial.cpp index 2b7828f..3154aff 100644 --- a/VulkanTutorial.cpp +++ b/VulkanTutorial.cpp @@ -116,6 +116,11 @@ void HelloTriangleApplication::initVulkan() { createGraphicPipeline(); creatFramebuffers(); + + createCommandPool(); + + createCommandBuffer(); + } @@ -125,6 +130,7 @@ void HelloTriangleApplication::mainLoop(GLFWwindow* window){ while (!glfwWindowShouldClose(window)) { glfwPollEvents(); + drawFrame(); } } @@ -135,6 +141,7 @@ void HelloTriangleApplication::cleanup(GLFWwindow* window) { std::cout << "\nstart to destroy resource\n" << std::endl; + vkDestroyCommandPool(device, commandPool, nullptr); for (auto framebuffer : swapChainFramebuffers) { @@ -640,6 +647,91 @@ void HelloTriangleApplication::creatFramebuffers() } } +void HelloTriangleApplication::createCommandPool() +{ + QueueFamilyIndices queueFamilyIndices = findQueueFamilies(physicalDevice); + + VkCommandPoolCreateInfo poolInfo{}; + poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value(); + + if (vkCreateCommandPool(device,&poolInfo,nullptr,&commandPool) != VK_SUCCESS) + { + throw std::runtime_error("failed to create command pool in createCommandpool"); + } + +} + +void HelloTriangleApplication::createCommandBuffer() +{ + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.commandPool = commandPool; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandBufferCount = 1; + + if (vkAllocateCommandBuffers(device,&allocInfo,&commandBuffer) != VK_SUCCESS) + { + throw std::runtime_error("failed to allocate command buffers in createCommandBuffer"); + } +} + +void HelloTriangleApplication::recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) +{ + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = 0; + beginInfo.pInheritanceInfo = nullptr; + + if (vkBeginCommandBuffer(commandBuffer,&beginInfo) != VK_SUCCESS) + { + throw std::runtime_error("failed to begin recording command buffer in recordCommandBuffer"); + } + + VkRenderPassBeginInfo renderPassBeginInfo{}; + renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + renderPassBeginInfo.renderPass = renderPass; + renderPassBeginInfo.framebuffer = swapChainFramebuffers[imageIndex]; + renderPassBeginInfo.renderArea.extent = swapChainExtent; + VkClearValue clearColor = { {{0.0f,0.0f,0.0f,1.0f}} }; + renderPassBeginInfo.clearValueCount = 1; + renderPassBeginInfo.pClearValues = &clearColor; + + vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); + + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); + + VkViewport viewport{}; + viewport.x = 0.0f; + viewport.y = 0.0f; + viewport.width = static_cast(swapChainExtent.width); + viewport.height = static_cast(swapChainExtent.height); + viewport.minDepth = 0.0f; + viewport.maxDepth = 1.0f; + vkCmdSetViewport(commandBuffer, 0, 1, &viewport); + + VkRect2D scissor{}; + scissor.offset = { 0,0 }; + scissor.extent = swapChainExtent; + vkCmdSetScissor(commandBuffer, 0, 1, &scissor); + + vkCmdDraw(commandBuffer, 3, 1, 0, 0); + + vkCmdEndRenderPass(commandBuffer); + + if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS) + { + throw std::runtime_error("failed to record command buffer in recordCommandBuffer"); + } + +} + +void HelloTriangleApplication::drawFrame() +{ + +} + void HelloTriangleApplication::createRenderPass() { diff --git a/VulkanTutorial.h b/VulkanTutorial.h index 15644ee..3702013 100644 --- a/VulkanTutorial.h +++ b/VulkanTutorial.h @@ -86,7 +86,10 @@ private: }; std::vector swapChainFramebuffers; + + VkCommandPool commandPool; + VkCommandBuffer commandBuffer; GLFWwindow* initWindow(int Width, int Height); @@ -142,6 +145,14 @@ private: void creatFramebuffers(); + void createCommandPool(); + + void createCommandBuffer(); + + void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex); + + void drawFrame(); + }; HelloTriangleApplication::HelloTriangleApplication()