Use GEVulkanCommandLoader for all
This commit is contained in:
parent
da665fc4fd
commit
22f658239f
@ -291,8 +291,6 @@ namespace GE
|
||||
{ return m_features; }
|
||||
const VkPhysicalDeviceProperties& getPhysicalDeviceProperties() const
|
||||
{ return m_properties; }
|
||||
VkCommandBuffer beginSingleTimeCommands();
|
||||
void endSingleTimeCommands(VkCommandBuffer command_buffer);
|
||||
io::IFileSystem* getFileSystem() const { return FileSystem; }
|
||||
VkExtent2D getSwapChainExtent() const { return m_swap_chain_extent; }
|
||||
size_t getSwapChainImagesCount() const
|
||||
@ -378,7 +376,6 @@ namespace GE
|
||||
std::vector<VkSemaphore> image_available_semaphores;
|
||||
std::vector<VkSemaphore> render_finished_semaphores;
|
||||
std::vector<VkFence> in_flight_fences;
|
||||
VkCommandPool command_pool;
|
||||
std::vector<VkCommandBuffer> command_buffers;
|
||||
std::array<VkSampler, GVS_COUNT> samplers;
|
||||
VkRenderPass render_pass;
|
||||
@ -389,7 +386,6 @@ namespace GE
|
||||
surface = VK_NULL_HANDLE;
|
||||
device = VK_NULL_HANDLE;
|
||||
swap_chain = VK_NULL_HANDLE;
|
||||
command_pool = VK_NULL_HANDLE;
|
||||
samplers = {{}};
|
||||
render_pass = VK_NULL_HANDLE;
|
||||
}
|
||||
@ -401,14 +397,6 @@ namespace GE
|
||||
vkDestroyRenderPass(device, render_pass, NULL);
|
||||
for (unsigned i = 0; i < GVS_COUNT; i++)
|
||||
vkDestroySampler(device, samplers[i], NULL);
|
||||
if (!command_buffers.empty())
|
||||
{
|
||||
vkFreeCommandBuffers(device, command_pool,
|
||||
(uint32_t)(command_buffers.size()),
|
||||
&command_buffers[0]);
|
||||
}
|
||||
if (command_pool != VK_NULL_HANDLE)
|
||||
vkDestroyCommandPool(device, command_pool, NULL);
|
||||
for (VkSemaphore& semaphore : image_available_semaphores)
|
||||
vkDestroySemaphore(device, semaphore, NULL);
|
||||
for (VkSemaphore& semaphore : render_finished_semaphores)
|
||||
@ -468,7 +456,6 @@ namespace GE
|
||||
void createDevice();
|
||||
void createSwapChain();
|
||||
void createSyncObjects();
|
||||
void createCommandPool();
|
||||
void createCommandBuffers();
|
||||
void createSamplers();
|
||||
void createRenderPass();
|
||||
|
@ -529,7 +529,6 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
|
||||
|
||||
createSwapChain();
|
||||
createSyncObjects();
|
||||
createCommandPool();
|
||||
createSamplers();
|
||||
createRenderPass();
|
||||
createFramebuffers();
|
||||
@ -574,6 +573,13 @@ void GEVulkanDriver::destroyVulkan()
|
||||
GEVulkan2dRenderer::destroy();
|
||||
GEVulkanShaderManager::destroy();
|
||||
|
||||
if (!m_vk->command_buffers.empty())
|
||||
{
|
||||
vkFreeCommandBuffers(m_vk->device,
|
||||
GEVulkanCommandLoader::getCurrentCommandPool(),
|
||||
(uint32_t)(m_vk->command_buffers.size()),
|
||||
&m_vk->command_buffers[0]);
|
||||
}
|
||||
GEVulkanCommandLoader::destroy();
|
||||
for (std::mutex* m : m_graphics_queue_mutexes)
|
||||
delete m;
|
||||
@ -1172,21 +1178,6 @@ void GEVulkanDriver::createSyncObjects()
|
||||
}
|
||||
} // createSyncObjects
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void GEVulkanDriver::createCommandPool()
|
||||
{
|
||||
VkCommandPoolCreateInfo pool_info = {};
|
||||
pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||
pool_info.queueFamilyIndex = m_graphics_family;
|
||||
pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||
|
||||
VkResult result = vkCreateCommandPool(m_vk->device, &pool_info, NULL,
|
||||
&m_vk->command_pool);
|
||||
|
||||
if (result != VK_SUCCESS)
|
||||
throw std::runtime_error("vkCreateCommandPool failed");
|
||||
} // createCommandPool
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void GEVulkanDriver::createCommandBuffers()
|
||||
{
|
||||
@ -1194,7 +1185,7 @@ void GEVulkanDriver::createCommandBuffers()
|
||||
|
||||
VkCommandBufferAllocateInfo alloc_info = {};
|
||||
alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
||||
alloc_info.commandPool = m_vk->command_pool;
|
||||
alloc_info.commandPool = GEVulkanCommandLoader::getCurrentCommandPool();
|
||||
alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||
alloc_info.commandBufferCount = (uint32_t)buffers.size();
|
||||
|
||||
@ -1371,55 +1362,15 @@ bool GEVulkanDriver::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage,
|
||||
void GEVulkanDriver::copyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer,
|
||||
VkDeviceSize size)
|
||||
{
|
||||
VkCommandBuffer command_buffer = beginSingleTimeCommands();
|
||||
VkCommandBuffer command_buffer = GEVulkanCommandLoader::beginSingleTimeCommands();
|
||||
|
||||
VkBufferCopy copy_region = {};
|
||||
copy_region.size = size;
|
||||
vkCmdCopyBuffer(command_buffer, src_buffer, dst_buffer, 1, ©_region);
|
||||
|
||||
endSingleTimeCommands(command_buffer);
|
||||
GEVulkanCommandLoader::endSingleTimeCommands(command_buffer);
|
||||
} // copyBuffer
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
VkCommandBuffer GEVulkanDriver::beginSingleTimeCommands()
|
||||
{
|
||||
VkCommandBufferAllocateInfo alloc_info = {};
|
||||
alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
||||
alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||
alloc_info.commandPool = m_vk->command_pool;
|
||||
alloc_info.commandBufferCount = 1;
|
||||
|
||||
VkCommandBuffer command_buffer;
|
||||
vkAllocateCommandBuffers(m_vk->device, &alloc_info, &command_buffer);
|
||||
|
||||
VkCommandBufferBeginInfo begin_info = {};
|
||||
begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||
begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
|
||||
|
||||
vkBeginCommandBuffer(command_buffer, &begin_info);
|
||||
|
||||
return command_buffer;
|
||||
} // beginSingleTimeCommands
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void GEVulkanDriver::endSingleTimeCommands(VkCommandBuffer command_buffer)
|
||||
{
|
||||
vkEndCommandBuffer(command_buffer);
|
||||
|
||||
VkSubmitInfo submit_info = {};
|
||||
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||
submit_info.commandBufferCount = 1;
|
||||
submit_info.pCommandBuffers = &command_buffer;
|
||||
|
||||
VkQueue queue = VK_NULL_HANDLE;
|
||||
std::unique_lock<std::mutex> ul = getGraphicsQueue(&queue);
|
||||
vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
|
||||
vkQueueWaitIdle(queue);
|
||||
ul.unlock();
|
||||
|
||||
vkFreeCommandBuffers(m_vk->device, m_vk->command_pool, 1, &command_buffer);
|
||||
} // beginSingleTimeCommands
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void GEVulkanDriver::OnResize(const core::dimension2d<u32>& size)
|
||||
{
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "ge_vulkan_texture.hpp"
|
||||
|
||||
#include "ge_vulkan_command_loader.hpp"
|
||||
#include "ge_vulkan_driver.hpp"
|
||||
#include "ge_gl_utils.hpp"
|
||||
#include "ge_main.hpp"
|
||||
@ -106,7 +107,7 @@ bool GEVulkanTexture::createTextureImage(uint8_t* texture_data)
|
||||
goto destroy;
|
||||
}
|
||||
|
||||
command_buffer = getVKDriver()->beginSingleTimeCommands();
|
||||
command_buffer = GEVulkanCommandLoader::beginSingleTimeCommands();
|
||||
|
||||
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
@ -117,7 +118,7 @@ bool GEVulkanTexture::createTextureImage(uint8_t* texture_data)
|
||||
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||
|
||||
getVKDriver()->endSingleTimeCommands(command_buffer);
|
||||
GEVulkanCommandLoader::endSingleTimeCommands(command_buffer);
|
||||
|
||||
destroy:
|
||||
vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL);
|
||||
@ -413,7 +414,7 @@ uint8_t* GEVulkanTexture::getTextureData()
|
||||
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, buffer, buffer_memory))
|
||||
return NULL;
|
||||
|
||||
VkCommandBuffer command_buffer = getVKDriver()->beginSingleTimeCommands();
|
||||
VkCommandBuffer command_buffer = GEVulkanCommandLoader::beginSingleTimeCommands();
|
||||
|
||||
transitionImageLayout(command_buffer,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
@ -436,7 +437,7 @@ uint8_t* GEVulkanTexture::getTextureData()
|
||||
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||
|
||||
getVKDriver()->endSingleTimeCommands(command_buffer);
|
||||
GEVulkanCommandLoader::endSingleTimeCommands(command_buffer);
|
||||
|
||||
uint8_t* texture_data = new uint8_t[image_size];
|
||||
void* mapped_data;
|
||||
@ -530,14 +531,14 @@ void GEVulkanTexture::updateTexture(void* data, video::ECOLOR_FORMAT format,
|
||||
}
|
||||
}
|
||||
|
||||
VkCommandBuffer command_buffer = getVKDriver()->beginSingleTimeCommands();
|
||||
VkCommandBuffer command_buffer = GEVulkanCommandLoader::beginSingleTimeCommands();
|
||||
transitionImageLayout(command_buffer,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
copyBufferToImage(command_buffer, staging_buffer, w, h, x, y);
|
||||
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||
getVKDriver()->endSingleTimeCommands(command_buffer);
|
||||
GEVulkanCommandLoader::endSingleTimeCommands(command_buffer);
|
||||
|
||||
vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL);
|
||||
vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user