From c3602e82ebc2f9ca5c332c81e2af6076b021134a Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Thu, 7 Apr 2022 09:11:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20ren?= =?UTF-8?q?derFrame?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 3 +++ src/vk.cpp | 33 ++++++++++++++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/include/vk.h b/include/vk.h index f642192..b5392d8 100644 --- a/include/vk.h +++ b/include/vk.h @@ -37,6 +37,7 @@ class Vulkan std::vector renderFinishedSemaphores; // семафор окончания рендера std::vector inWorkFences; // барьер кадра в работе uint32_t currentFrame = 0; // Текущий кадр рендера + uint32_t imageIndex; // Текущее изображение из списка показа std::map> databuffers; // Словарь для сопоставления дескриптору буфера дескрипторов лог. устройства и памяти @@ -63,6 +64,8 @@ class Vulkan VkBuffer createDataBuffer(void* data, VkDeviceSize size, VkBufferUsageFlags usage); // Создание буфера данных void createSyncObjects(); // Создание объектов синхронизации void createFramebuffers(); // Создание буферов кадра + void renderBegin(); // Начало рендера кадра + void renderEnd(); // Окончание рендера кадра }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index fd31ec8..8bc3728 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -985,11 +985,26 @@ void Vulkan::createFramebuffers() // Рендер кадра void Vulkan::renderFrame() +{ + renderBegin(); + + VkBuffer vertexBuffers[] = {vertexBuffer}; + VkDeviceSize offsets[] = {0}; + vkCmdBindVertexBuffers(commandBuffers[currentFrame], 0, 1, vertexBuffers, offsets); + + vkCmdBindIndexBuffer(commandBuffers[currentFrame], indexBuffer, 0, VK_INDEX_TYPE_UINT16); + + vkCmdDrawIndexed(commandBuffers[currentFrame], 6, 1, 0, 0, 0); + + renderEnd(); +} + +// Начало рендера кадра +void Vulkan::renderBegin() { vkWaitForFences(logicalDevice, 1, &inWorkFences[currentFrame], VK_TRUE, UINT64_MAX); vkResetFences(logicalDevice, 1, &inWorkFences[currentFrame]); - uint32_t imageIndex; VkResult result = vkAcquireNextImageKHR(logicalDevice, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex); if (result != VK_SUCCESS) @@ -1019,16 +1034,12 @@ void Vulkan::renderFrame() vkCmdBeginRenderPass(commandBuffers[currentFrame], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); - vkCmdBindPipeline(commandBuffers[currentFrame], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); - - VkBuffer vertexBuffers[] = {vertexBuffer}; - VkDeviceSize offsets[] = {0}; - vkCmdBindVertexBuffers(commandBuffers[currentFrame], 0, 1, vertexBuffers, offsets); - - vkCmdBindIndexBuffer(commandBuffers[currentFrame], indexBuffer, 0, VK_INDEX_TYPE_UINT16); - - vkCmdDrawIndexed(commandBuffers[currentFrame], 6, 1, 0, 0, 0); + vkCmdBindPipeline(commandBuffers[currentFrame], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); +} +// Окончание рендера кадра +void Vulkan::renderEnd() +{ vkCmdEndRenderPass(commandBuffers[currentFrame]); if (vkEndCommandBuffer(commandBuffers[currentFrame]) != VK_SUCCESS) @@ -1069,4 +1080,4 @@ void Vulkan::renderFrame() { throw std::runtime_error("Unable to present swap chain image"); } -} +}