diff --git a/src/vk.cpp b/src/vk.cpp index 8bc3728..349ddd2 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -986,7 +986,7 @@ void Vulkan::createFramebuffers() // Рендер кадра void Vulkan::renderFrame() { - renderBegin(); + renderBegin(); // Начало рендера VkBuffer vertexBuffers[] = {vertexBuffer}; VkDeviceSize offsets[] = {0}; @@ -996,33 +996,39 @@ void Vulkan::renderFrame() vkCmdDrawIndexed(commandBuffers[currentFrame], 6, 1, 0, 0, 0); - renderEnd(); + renderEnd(); // Конец рендера } // Начало рендера кадра void Vulkan::renderBegin() { + // Ожидание барьера текущего кадра и его сброс vkWaitForFences(logicalDevice, 1, &inWorkFences[currentFrame], VK_TRUE, UINT64_MAX); vkResetFences(logicalDevice, 1, &inWorkFences[currentFrame]); + // Получение изображения из списка показа VkResult result = vkAcquireNextImageKHR(logicalDevice, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex); - + // Если не получилось получить изображение - выдадим исключение if (result != VK_SUCCESS) { throw std::runtime_error("Unable to acquire swap chain image"); } + // Сбросим командный буфер для записи новых команд vkResetCommandBuffer(commandBuffers[currentFrame], 0); + // Информация о создаваемом буфере команд VkCommandBufferBeginInfo beginInfo{}; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - + // Начало записи команд. В случае ошибки - выдадим исключение if (vkBeginCommandBuffer(commandBuffers[currentFrame], &beginInfo) != VK_SUCCESS) { throw std::runtime_error("Unable to begin recording command buffer"); } + // Цвето фона VkClearValue clearColor = {0.0f, 0.0f, 0.0f, 1.0f}; + // Информация о проходе рендера VkRenderPassBeginInfo renderPassInfo{}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; renderPassInfo.renderPass = renderPass; @@ -1032,25 +1038,30 @@ void Vulkan::renderBegin() renderPassInfo.clearValueCount = 1; renderPassInfo.pClearValues = &clearColor; + // Начало записи прохода рендера vkCmdBeginRenderPass(commandBuffers[currentFrame], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); - + // Привязка конвейера vkCmdBindPipeline(commandBuffers[currentFrame], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); } // Окончание рендера кадра void Vulkan::renderEnd() { + // Окончание записи прохода буфера vkCmdEndRenderPass(commandBuffers[currentFrame]); - + // Окончание записи командного буфера. Если ошибка - выдадим исключение if (vkEndCommandBuffer(commandBuffers[currentFrame]) != VK_SUCCESS) { throw std::runtime_error("Unable to record command buffer"); } + // Массивы семафоров и стадий на которых их необходимо ждать VkSemaphore waitSemaphores[] = {imageAvailableSemaphores[currentFrame]}; VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; + // Сигнальный семафор об окончании рендера VkSemaphore signalSemaphores[] = {renderFinishedSemaphores[currentFrame]}; + // Информация об выполняемой очереди команд VkSubmitInfo submitInfo{}; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.waitSemaphoreCount = 1; @@ -1061,13 +1072,16 @@ void Vulkan::renderEnd() submitInfo.signalSemaphoreCount = 1; submitInfo.pSignalSemaphores = signalSemaphores; + // Выполнение очереди команд if (vkQueueSubmit(queue.descriptor, 1, &submitInfo, inWorkFences[currentFrame]) != VK_SUCCESS) { throw std::runtime_error("Unable to submit draw command buffer"); } + // Сдвиг текущего кадра currentFrame = (currentFrame + 1) % surface.imageCount; + // Информация о показе VkPresentInfoKHR presentInfo{}; presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; presentInfo.waitSemaphoreCount = 1; @@ -1076,6 +1090,7 @@ void Vulkan::renderEnd() presentInfo.pSwapchains = &swapChain; presentInfo.pImageIndices = &imageIndex; + // Выполнение показа. Если ошибка - выдадим исключение if (vkQueuePresentKHR(queue.descriptor, &presentInfo) != VK_SUCCESS) { throw std::runtime_error("Unable to present swap chain image");