Add buildCommandBuffers in GEVulkanDriver

This commit is contained in:
Benau 2022-07-03 11:48:07 +08:00
parent dfd6a1820d
commit 0875db0db6
4 changed files with 58 additions and 52 deletions

View File

@ -475,6 +475,7 @@ namespace GE
void destroySwapChainRelated(bool handle_surface);
void createSwapChainRelated(bool handle_surface);
GEVulkanMeshCache* getVulkanMeshCache() const;
void buildCommandBuffers();
};
}

View File

@ -333,44 +333,23 @@ void GEVulkan2dRenderer::createDescriptorSets()
throw std::runtime_error("vkAllocateDescriptorSets failed");
} // createDescriptorSets
// ----------------------------------------------------------------------------
void GEVulkan2dRenderer::uploadTrisBuffers()
{
if (g_tex_map.empty())
return;
g_tris_buffer->setCurrentData(g_tris_queue.data(),
g_tris_queue.size() * sizeof(Tri));
g_tris_index_buffer->setCurrentData(g_tris_index_queue.data(),
g_tris_index_queue.size() * sizeof(uint16_t));
} // uploadTrisBuffers
// ----------------------------------------------------------------------------
void GEVulkan2dRenderer::render()
{
std::array<VkClearValue, 2> clear_values = {};
video::SColorf cf(g_vk->getClearColor());
clear_values[0].color =
{
cf.getRed(), cf.getGreen(), cf.getBlue(), cf.getAlpha()
};
clear_values[1].depthStencil = {1.0f, 0};
VkRenderPassBeginInfo render_pass_info = {};
render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
render_pass_info.renderPass = g_vk->getRenderPass();
render_pass_info.framebuffer =
g_vk->getSwapChainFramebuffers()[g_vk->getCurrentImageIndex()];
render_pass_info.renderArea.offset = {0, 0};
render_pass_info.renderArea.extent = g_vk->getSwapChainExtent();
render_pass_info.clearValueCount = (uint32_t)(clear_values.size());
render_pass_info.pClearValues = &clear_values[0];
VkCommandBufferBeginInfo begin_info = {};
begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
if (g_tex_map.empty())
{
VkResult result = vkBeginCommandBuffer(g_vk->getCurrentCommandBuffer(),
&begin_info);
if (result != VK_SUCCESS)
return;
vkCmdBeginRenderPass(g_vk->getCurrentCommandBuffer(), &render_pass_info,
VK_SUBPASS_CONTENTS_INLINE);
vkCmdEndRenderPass(g_vk->getCurrentCommandBuffer());
vkEndCommandBuffer(g_vk->getCurrentCommandBuffer());
return;
}
std::vector<std::pair<const irr::video::ITexture*, unsigned> > tex_map;
for (auto& tex : g_tex_map)
@ -440,24 +419,11 @@ void GEVulkan2dRenderer::render()
int sampler_idx = 0;
core::recti clip;
VkResult result = vkBeginCommandBuffer(g_vk->getCurrentCommandBuffer(),
&begin_info);
if (result != VK_SUCCESS)
goto end;
g_tris_buffer->setCurrentData(g_tris_queue.data(),
g_tris_queue.size() * sizeof(Tri));
g_tris_index_buffer->setCurrentData(g_tris_index_queue.data(),
g_tris_index_queue.size() * sizeof(uint16_t));
vkCmdBeginRenderPass(g_vk->getCurrentCommandBuffer(), &render_pass_info,
VK_SUBPASS_CONTENTS_INLINE);
vertex_buffer = g_tris_buffer->getCurrentBuffer();
indices_buffer = g_tris_index_buffer->getCurrentBuffer();
if (vertex_buffer == VK_NULL_HANDLE || indices_buffer == VK_NULL_HANDLE)
goto end_cmd;
goto end;
vkCmdBindPipeline(g_vk->getCurrentCommandBuffer(),
VK_PIPELINE_BIND_POINT_GRAPHICS, g_graphics_pipeline);
@ -542,10 +508,6 @@ void GEVulkan2dRenderer::render()
vkCmdDrawIndexed(g_vk->getCurrentCommandBuffer(), idx_count, 1,
idx - idx_count, 0, 0);
end_cmd:
vkCmdEndRenderPass(g_vk->getCurrentCommandBuffer());
vkEndCommandBuffer(g_vk->getCurrentCommandBuffer());
end:
clear();
} // render

View File

@ -28,6 +28,8 @@ void createGraphicsPipeline();
// ----------------------------------------------------------------------------
void createTrisBuffers();
// ----------------------------------------------------------------------------
void uploadTrisBuffers();
// ----------------------------------------------------------------------------
void render();
// ----------------------------------------------------------------------------
void clear();

View File

@ -1467,7 +1467,7 @@ bool GEVulkanDriver::endScene()
return false;
}
GEVulkan2dRenderer::render();
buildCommandBuffers();
VkSemaphore wait_semaphores[] = {m_vk->image_available_semaphores[m_current_frame]};
VkPipelineStageFlags wait_stages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT};
@ -2045,6 +2045,47 @@ GEVulkanMeshCache* GEVulkanDriver::getVulkanMeshCache() const
(m_irrlicht_device->getSceneManager()->getMeshCache());
} // getVulkanMeshCache
// ----------------------------------------------------------------------------
void GEVulkanDriver::buildCommandBuffers()
{
std::array<VkClearValue, 2> clear_values = {};
video::SColorf cf(getClearColor());
clear_values[0].color =
{
cf.getRed(), cf.getGreen(), cf.getBlue(), cf.getAlpha()
};
clear_values[1].depthStencil = {1.0f, 0};
VkRenderPassBeginInfo render_pass_info = {};
render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
render_pass_info.renderPass = getRenderPass();
render_pass_info.framebuffer =
getSwapChainFramebuffers()[getCurrentImageIndex()];
render_pass_info.renderArea.offset = {0, 0};
render_pass_info.renderArea.extent = getSwapChainExtent();
render_pass_info.clearValueCount = (uint32_t)(clear_values.size());
render_pass_info.pClearValues = &clear_values[0];
VkCommandBufferBeginInfo begin_info = {};
begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
VkResult result = vkBeginCommandBuffer(getCurrentCommandBuffer(),
&begin_info);
if (result != VK_SUCCESS)
return;
GEVulkan2dRenderer::uploadTrisBuffers();
vkCmdBeginRenderPass(getCurrentCommandBuffer(), &render_pass_info,
VK_SUBPASS_CONTENTS_INLINE);
GEVulkan2dRenderer::render();
vkCmdEndRenderPass(getCurrentCommandBuffer());
vkEndCommandBuffer(getCurrentCommandBuffer());
} // buildCommandBuffers
}
namespace irr