Use GEVulkanCommandLoader for all
This commit is contained in:
parent
da665fc4fd
commit
22f658239f
@ -291,8 +291,6 @@ namespace GE
|
|||||||
{ return m_features; }
|
{ return m_features; }
|
||||||
const VkPhysicalDeviceProperties& getPhysicalDeviceProperties() const
|
const VkPhysicalDeviceProperties& getPhysicalDeviceProperties() const
|
||||||
{ return m_properties; }
|
{ return m_properties; }
|
||||||
VkCommandBuffer beginSingleTimeCommands();
|
|
||||||
void endSingleTimeCommands(VkCommandBuffer command_buffer);
|
|
||||||
io::IFileSystem* getFileSystem() const { return FileSystem; }
|
io::IFileSystem* getFileSystem() const { return FileSystem; }
|
||||||
VkExtent2D getSwapChainExtent() const { return m_swap_chain_extent; }
|
VkExtent2D getSwapChainExtent() const { return m_swap_chain_extent; }
|
||||||
size_t getSwapChainImagesCount() const
|
size_t getSwapChainImagesCount() const
|
||||||
@ -378,7 +376,6 @@ namespace GE
|
|||||||
std::vector<VkSemaphore> image_available_semaphores;
|
std::vector<VkSemaphore> image_available_semaphores;
|
||||||
std::vector<VkSemaphore> render_finished_semaphores;
|
std::vector<VkSemaphore> render_finished_semaphores;
|
||||||
std::vector<VkFence> in_flight_fences;
|
std::vector<VkFence> in_flight_fences;
|
||||||
VkCommandPool command_pool;
|
|
||||||
std::vector<VkCommandBuffer> command_buffers;
|
std::vector<VkCommandBuffer> command_buffers;
|
||||||
std::array<VkSampler, GVS_COUNT> samplers;
|
std::array<VkSampler, GVS_COUNT> samplers;
|
||||||
VkRenderPass render_pass;
|
VkRenderPass render_pass;
|
||||||
@ -389,7 +386,6 @@ namespace GE
|
|||||||
surface = VK_NULL_HANDLE;
|
surface = VK_NULL_HANDLE;
|
||||||
device = VK_NULL_HANDLE;
|
device = VK_NULL_HANDLE;
|
||||||
swap_chain = VK_NULL_HANDLE;
|
swap_chain = VK_NULL_HANDLE;
|
||||||
command_pool = VK_NULL_HANDLE;
|
|
||||||
samplers = {{}};
|
samplers = {{}};
|
||||||
render_pass = VK_NULL_HANDLE;
|
render_pass = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
@ -401,14 +397,6 @@ namespace GE
|
|||||||
vkDestroyRenderPass(device, render_pass, NULL);
|
vkDestroyRenderPass(device, render_pass, NULL);
|
||||||
for (unsigned i = 0; i < GVS_COUNT; i++)
|
for (unsigned i = 0; i < GVS_COUNT; i++)
|
||||||
vkDestroySampler(device, samplers[i], NULL);
|
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)
|
for (VkSemaphore& semaphore : image_available_semaphores)
|
||||||
vkDestroySemaphore(device, semaphore, NULL);
|
vkDestroySemaphore(device, semaphore, NULL);
|
||||||
for (VkSemaphore& semaphore : render_finished_semaphores)
|
for (VkSemaphore& semaphore : render_finished_semaphores)
|
||||||
@ -468,7 +456,6 @@ namespace GE
|
|||||||
void createDevice();
|
void createDevice();
|
||||||
void createSwapChain();
|
void createSwapChain();
|
||||||
void createSyncObjects();
|
void createSyncObjects();
|
||||||
void createCommandPool();
|
|
||||||
void createCommandBuffers();
|
void createCommandBuffers();
|
||||||
void createSamplers();
|
void createSamplers();
|
||||||
void createRenderPass();
|
void createRenderPass();
|
||||||
|
@ -529,7 +529,6 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
|
|||||||
|
|
||||||
createSwapChain();
|
createSwapChain();
|
||||||
createSyncObjects();
|
createSyncObjects();
|
||||||
createCommandPool();
|
|
||||||
createSamplers();
|
createSamplers();
|
||||||
createRenderPass();
|
createRenderPass();
|
||||||
createFramebuffers();
|
createFramebuffers();
|
||||||
@ -574,6 +573,13 @@ void GEVulkanDriver::destroyVulkan()
|
|||||||
GEVulkan2dRenderer::destroy();
|
GEVulkan2dRenderer::destroy();
|
||||||
GEVulkanShaderManager::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();
|
GEVulkanCommandLoader::destroy();
|
||||||
for (std::mutex* m : m_graphics_queue_mutexes)
|
for (std::mutex* m : m_graphics_queue_mutexes)
|
||||||
delete m;
|
delete m;
|
||||||
@ -1172,21 +1178,6 @@ void GEVulkanDriver::createSyncObjects()
|
|||||||
}
|
}
|
||||||
} // 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()
|
void GEVulkanDriver::createCommandBuffers()
|
||||||
{
|
{
|
||||||
@ -1194,7 +1185,7 @@ void GEVulkanDriver::createCommandBuffers()
|
|||||||
|
|
||||||
VkCommandBufferAllocateInfo alloc_info = {};
|
VkCommandBufferAllocateInfo alloc_info = {};
|
||||||
alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_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.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||||
alloc_info.commandBufferCount = (uint32_t)buffers.size();
|
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,
|
void GEVulkanDriver::copyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer,
|
||||||
VkDeviceSize size)
|
VkDeviceSize size)
|
||||||
{
|
{
|
||||||
VkCommandBuffer command_buffer = beginSingleTimeCommands();
|
VkCommandBuffer command_buffer = GEVulkanCommandLoader::beginSingleTimeCommands();
|
||||||
|
|
||||||
VkBufferCopy copy_region = {};
|
VkBufferCopy copy_region = {};
|
||||||
copy_region.size = size;
|
copy_region.size = size;
|
||||||
vkCmdCopyBuffer(command_buffer, src_buffer, dst_buffer, 1, ©_region);
|
vkCmdCopyBuffer(command_buffer, src_buffer, dst_buffer, 1, ©_region);
|
||||||
|
|
||||||
endSingleTimeCommands(command_buffer);
|
GEVulkanCommandLoader::endSingleTimeCommands(command_buffer);
|
||||||
} // copyBuffer
|
} // 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)
|
void GEVulkanDriver::OnResize(const core::dimension2d<u32>& size)
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "ge_vulkan_texture.hpp"
|
#include "ge_vulkan_texture.hpp"
|
||||||
|
|
||||||
|
#include "ge_vulkan_command_loader.hpp"
|
||||||
#include "ge_vulkan_driver.hpp"
|
#include "ge_vulkan_driver.hpp"
|
||||||
#include "ge_gl_utils.hpp"
|
#include "ge_gl_utils.hpp"
|
||||||
#include "ge_main.hpp"
|
#include "ge_main.hpp"
|
||||||
@ -106,7 +107,7 @@ bool GEVulkanTexture::createTextureImage(uint8_t* texture_data)
|
|||||||
goto destroy;
|
goto destroy;
|
||||||
}
|
}
|
||||||
|
|
||||||
command_buffer = getVKDriver()->beginSingleTimeCommands();
|
command_buffer = GEVulkanCommandLoader::beginSingleTimeCommands();
|
||||||
|
|
||||||
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_UNDEFINED,
|
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_UNDEFINED,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
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,
|
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||||
|
|
||||||
getVKDriver()->endSingleTimeCommands(command_buffer);
|
GEVulkanCommandLoader::endSingleTimeCommands(command_buffer);
|
||||||
|
|
||||||
destroy:
|
destroy:
|
||||||
vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL);
|
vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL);
|
||||||
@ -413,7 +414,7 @@ uint8_t* GEVulkanTexture::getTextureData()
|
|||||||
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, buffer, buffer_memory))
|
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, buffer, buffer_memory))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
VkCommandBuffer command_buffer = getVKDriver()->beginSingleTimeCommands();
|
VkCommandBuffer command_buffer = GEVulkanCommandLoader::beginSingleTimeCommands();
|
||||||
|
|
||||||
transitionImageLayout(command_buffer,
|
transitionImageLayout(command_buffer,
|
||||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||||
@ -436,7 +437,7 @@ uint8_t* GEVulkanTexture::getTextureData()
|
|||||||
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_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];
|
uint8_t* texture_data = new uint8_t[image_size];
|
||||||
void* mapped_data;
|
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,
|
transitionImageLayout(command_buffer,
|
||||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||||
copyBufferToImage(command_buffer, staging_buffer, w, h, x, y);
|
copyBufferToImage(command_buffer, staging_buffer, w, h, x, y);
|
||||||
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||||
getVKDriver()->endSingleTimeCommands(command_buffer);
|
GEVulkanCommandLoader::endSingleTimeCommands(command_buffer);
|
||||||
|
|
||||||
vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL);
|
vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL);
|
||||||
vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL);
|
vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user