Move m_current_buffer_idx to GEVulkanDriver

This commit is contained in:
Benau 2022-11-30 10:41:39 +08:00
parent 90a22a691a
commit 392bdbf78b
5 changed files with 21 additions and 20 deletions

View File

@ -365,6 +365,7 @@ namespace GE
void addDrawCallToCache(std::unique_ptr<GEVulkanDrawCall>& dc);
std::unique_ptr<GEVulkanDrawCall> getDrawCallFromCache();
GESPM* getBillboardQuad() const { return m_billboard_quad; }
int getCurrentBufferIdx() const { return m_current_buffer_idx; }
private:
struct SwapChainSupportDetails
{
@ -509,6 +510,7 @@ namespace GE
std::vector<std::unique_ptr<GEVulkanDrawCall> > m_draw_calls_cache;
GESPM* m_billboard_quad;
int m_current_buffer_idx;
void createInstance(SDL_Window* window);
void findPhysicalDevice();

View File

@ -189,7 +189,6 @@ GEVulkanDrawCall::GEVulkanDrawCall()
m_skinning_data_padded_size = 0;
m_materials_padded_size = 0;
m_update_data_descriptor_sets = true;
m_current_buffer_idx = 0;
m_data_layout = VK_NULL_HANDLE;
m_descriptor_pool = VK_NULL_HANDLE;
m_pipeline_layout = VK_NULL_HANDLE;
@ -283,7 +282,7 @@ void GEVulkanDrawCall::addBillboardNode(irr::scene::ISceneNode* node,
} // addBillboardNode
// ----------------------------------------------------------------------------
void GEVulkanDrawCall::generate()
void GEVulkanDrawCall::generate(GEVulkanDriver* vk)
{
if (!m_visible_nodes.empty() && m_data_layout == VK_NULL_HANDLE)
createVulkanData();
@ -330,8 +329,9 @@ start:
m_update_data_descriptor_sets = m_sbo_data->resizeIfNeeded(min_size) ||
m_update_data_descriptor_sets;
int current_buffer_idx = vk->getCurrentBufferIdx();
uint8_t* mapped_addr = (uint8_t*)m_sbo_data->getMappedAddr()
[m_current_buffer_idx];
[current_buffer_idx];
std::unordered_map<irr::scene::ISceneNode*, int> skinning_offets;
int added_joint = 1;
@ -1255,14 +1255,15 @@ void GEVulkanDrawCall::uploadDynamicData(GEVulkanDriver* vk,
}
dst_stage |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
}
int current_buffer_idx = vk->getCurrentBufferIdx();
m_update_data_descriptor_sets =
m_dynamic_data->setCurrentData(data_uploading, cmd,
m_current_buffer_idx) || m_update_data_descriptor_sets;
current_buffer_idx) || m_update_data_descriptor_sets;
const size_t whole_size = m_skinning_data_padded_size +
m_object_data_padded_size + m_materials_padded_size;
vmaFlushAllocation(vk->getVmaAllocator(),
m_sbo_data->getHostMemory()[m_current_buffer_idx], 0,
m_sbo_data->getHostMemory()[current_buffer_idx], 0,
whole_size);
if (!GEVulkanDynamicBuffer::supportsHostTransfer())
@ -1288,6 +1289,7 @@ void GEVulkanDrawCall::render(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
VkCommandBuffer cmd =
custom_cmd ? custom_cmd : vk->getCurrentCommandBuffer();
int current_buffer_idx = vk->getCurrentBufferIdx();
const bool use_base_vertex = GEVulkanFeatures::supportsBaseVertexRendering();
const bool bind_mesh_textures = GEVulkanFeatures::supportsBindMeshTexturesAtOnce();
@ -1354,8 +1356,8 @@ void GEVulkanDrawCall::render(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
unsigned draw_count = 0;
VkBuffer indirect_buffer =
GEVulkanDynamicBuffer::supportsHostTransfer() ?
m_dynamic_data->getHostBuffer()[m_current_buffer_idx] :
m_dynamic_data->getLocalBuffer()[m_current_buffer_idx];
m_dynamic_data->getHostBuffer()[current_buffer_idx] :
m_dynamic_data->getLocalBuffer()[current_buffer_idx];
for (unsigned i = 0; i < m_cmds.size(); i++)
{
if (m_cmds[i].m_shader != cur_pipeline)
@ -1364,7 +1366,7 @@ void GEVulkanDrawCall::render(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
material_offsets[3] = m_materials_data[cur_pipeline].first;
vkCmdBindDescriptorSets(cmd,
VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_layout, 1, 1,
&m_data_descriptor_sets[m_current_buffer_idx],
&m_data_descriptor_sets[current_buffer_idx],
material_offsets.size(), material_offsets.data());
vkCmdDrawIndexedIndirect(cmd, indirect_buffer, indirect_offset,
draw_count, indirect_size);
@ -1389,7 +1391,7 @@ void GEVulkanDrawCall::render(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
material_offsets[3] = m_materials_data[m_cmds.back().m_shader].first;
vkCmdBindDescriptorSets(cmd,
VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_layout, 1, 1,
&m_data_descriptor_sets[m_current_buffer_idx],
&m_data_descriptor_sets[current_buffer_idx],
material_offsets.size(), material_offsets.data());
vkCmdDrawIndexedIndirect(cmd, indirect_buffer, indirect_offset,
draw_count, indirect_size);
@ -1405,7 +1407,7 @@ void GEVulkanDrawCall::render(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
{
vkCmdBindDescriptorSets(cmd,
VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_layout, 1, 1,
&m_data_descriptor_sets[m_current_buffer_idx], 0, NULL);
&m_data_descriptor_sets[current_buffer_idx], 0, NULL);
}
for (unsigned i = 0; i < m_cmds.size(); i++)
{
@ -1423,7 +1425,7 @@ void GEVulkanDrawCall::render(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
{
vkCmdBindDescriptorSets(cmd,
VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_layout, 1,
1, &m_data_descriptor_sets[m_current_buffer_idx], 0,
1, &m_data_descriptor_sets[current_buffer_idx], 0,
NULL);
}
}
@ -1452,7 +1454,7 @@ void GEVulkanDrawCall::render(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
}};
vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
m_pipeline_layout, 1, 1,
&m_data_descriptor_sets[m_current_buffer_idx],
&m_data_descriptor_sets[current_buffer_idx],
dynamic_offsets.size(), dynamic_offsets.data());
m_cmds[i].m_mb->bindVertexIndexBuffer(cmd);
}
@ -1463,9 +1465,6 @@ void GEVulkanDrawCall::render(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
}
if (!drawn_skybox)
GEVulkanSkyBoxRenderer::render(cmd, cam);
m_current_buffer_idx = (m_current_buffer_idx + 1) %
(GEVulkanDriver::getMaxFrameInFlight() + 1);
} // render
// ----------------------------------------------------------------------------

View File

@ -132,8 +132,6 @@ private:
size_t m_materials_padded_size;
int m_current_buffer_idx;
bool m_update_data_descriptor_sets;
VkDescriptorSetLayout m_data_layout;
@ -203,7 +201,7 @@ public:
// ------------------------------------------------------------------------
void prepare(GEVulkanCameraSceneNode* cam);
// ------------------------------------------------------------------------
void generate();
void generate(GEVulkanDriver* vk);
// ------------------------------------------------------------------------
void uploadDynamicData(GEVulkanDriver* vk, GEVulkanCameraSceneNode* cam,
VkCommandBuffer custom_cmd = VK_NULL_HANDLE);

View File

@ -504,7 +504,7 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
m_depth_texture(NULL), m_mesh_texture_descriptor(NULL),
m_rtt_texture(NULL), m_prev_rtt_texture(NULL),
m_separate_rtt_texture(NULL), m_rtt_polycount(0),
m_billboard_quad(NULL)
m_billboard_quad(NULL), m_current_buffer_idx(0)
{
m_vk.reset(new VK());
m_physical_device = VK_NULL_HANDLE;
@ -1785,6 +1785,8 @@ bool GEVulkanDriver::endScene()
present_info.pImageIndices = &m_image_index;
m_current_frame = (m_current_frame + 1) % getMaxFrameInFlight();
m_current_buffer_idx =
(m_current_buffer_idx + 1) % (getMaxFrameInFlight() + 1);
if (m_present_queue)
result = vkQueuePresentKHR(m_present_queue, &present_info);

View File

@ -170,7 +170,7 @@ void GEVulkanSceneManager::drawAllInternal()
it->second->prepare(cam);
OnRegisterSceneNode();
it->second->generate();
it->second->generate(static_cast<GEVulkanDriver*>(getVideoDriver()));
}
} // drawAllInternal