Объекты синхронизации
This commit is contained in:
parent
158f8c76df
commit
fd4061639d
|
@ -31,6 +31,9 @@ class Vulkan
|
||||||
VkDeviceMemory vertexBufferMemory; // Память буфера вершин
|
VkDeviceMemory vertexBufferMemory; // Память буфера вершин
|
||||||
VkBuffer indexBuffer; // Буфер индексов
|
VkBuffer indexBuffer; // Буфер индексов
|
||||||
VkDeviceMemory indexBufferMemory; // Память буфера индексов
|
VkDeviceMemory indexBufferMemory; // Память буфера индексов
|
||||||
|
std::vector<VkSemaphore> imageAvailableSemaphores; // семафор доступности изображения
|
||||||
|
std::vector<VkSemaphore> renderFinishedSemaphores; // семафор окончания рендера
|
||||||
|
std::vector<VkFence> inWorkFences; // барьер кадра в работе
|
||||||
|
|
||||||
// Структура для хранения флагов
|
// Структура для хранения флагов
|
||||||
struct
|
struct
|
||||||
|
@ -53,6 +56,7 @@ class Vulkan
|
||||||
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
|
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
|
||||||
void createVertexBuffer(); // Создание буфера вершин
|
void createVertexBuffer(); // Создание буфера вершин
|
||||||
void createIndexBuffer(); // Создание буфера индексов
|
void createIndexBuffer(); // Создание буфера индексов
|
||||||
|
void createSyncObjects(); // Создание объектов синхронизации
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VK_H
|
#endif // VK_H
|
35
src/vk.cpp
35
src/vk.cpp
|
@ -22,6 +22,7 @@ void Vulkan::init(GLFWwindow* window)
|
||||||
createCommandPool(); // Создание пула команд
|
createCommandPool(); // Создание пула команд
|
||||||
createVertexBuffer(); // Создание буфера вершин
|
createVertexBuffer(); // Создание буфера вершин
|
||||||
createIndexBuffer(); // Создание буфера индексов
|
createIndexBuffer(); // Создание буфера индексов
|
||||||
|
createSyncObjects(); // Создание объектов синхронизации
|
||||||
}
|
}
|
||||||
|
|
||||||
// завершение работы
|
// завершение работы
|
||||||
|
@ -33,6 +34,14 @@ void Vulkan::destroy()
|
||||||
vkDestroyBuffer(logicalDevice, vertexBuffer, nullptr); // Уничтожение буфера вершин
|
vkDestroyBuffer(logicalDevice, vertexBuffer, nullptr); // Уничтожение буфера вершин
|
||||||
vkFreeMemory(logicalDevice, vertexBufferMemory, nullptr); // Освобождение памяти буфера вершин
|
vkFreeMemory(logicalDevice, vertexBufferMemory, nullptr); // Освобождение памяти буфера вершин
|
||||||
|
|
||||||
|
// Уничтожение объектов синхронизации
|
||||||
|
for (int i = 0; i < surface.imageCount; i++)
|
||||||
|
{
|
||||||
|
vkDestroySemaphore(logicalDevice, renderFinishedSemaphores[i], nullptr);
|
||||||
|
vkDestroySemaphore(logicalDevice, imageAvailableSemaphores[i], nullptr);
|
||||||
|
vkDestroyFence(logicalDevice, inWorkFences[i], nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
vkDestroyCommandPool(logicalDevice, commandPool, nullptr); // Уничтожение командного пула
|
vkDestroyCommandPool(logicalDevice, commandPool, nullptr); // Уничтожение командного пула
|
||||||
|
|
||||||
vkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr); // Уничтожение графического конвейера
|
vkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr); // Уничтожение графического конвейера
|
||||||
|
@ -920,3 +929,29 @@ void Vulkan::createIndexBuffer()
|
||||||
vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr);
|
vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr);
|
||||||
vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr);
|
vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Создание объектов синхронизации
|
||||||
|
void Vulkan::createSyncObjects()
|
||||||
|
{
|
||||||
|
imageAvailableSemaphores.resize(surface.imageCount);
|
||||||
|
renderFinishedSemaphores.resize(surface.imageCount);
|
||||||
|
inWorkFences.resize(surface.imageCount);
|
||||||
|
|
||||||
|
VkSemaphoreCreateInfo semaphoreInfo{};
|
||||||
|
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
||||||
|
|
||||||
|
VkFenceCreateInfo fenceInfo{};
|
||||||
|
fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||||
|
fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||||
|
|
||||||
|
for (int i = 0; i < surface.imageCount; i++)
|
||||||
|
{
|
||||||
|
if (vkCreateSemaphore(logicalDevice, &semaphoreInfo, nullptr, &imageAvailableSemaphores[i]) != VK_SUCCESS
|
||||||
|
|| vkCreateSemaphore(logicalDevice, &semaphoreInfo, nullptr, &renderFinishedSemaphores[i]) != VK_SUCCESS
|
||||||
|
|| vkCreateFence(logicalDevice, &fenceInfo, nullptr, &inWorkFences[i]) != VK_SUCCESS)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("Unable to create synchronization objects for frame");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue