1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-13 13:31:48 +00:00

Merge pull request #54890 from briansemrau/threadsafe-drawpute-lists

Make draw/compute lists threadsafe
This commit is contained in:
Rémi Verschelde
2022-01-22 20:20:07 +01:00
committed by GitHub
2 changed files with 12 additions and 1 deletions

View File

@@ -7518,6 +7518,9 @@ Error RenderingDeviceVulkan::draw_list_switch_to_next_pass_split(uint32_t p_spli
} }
Error RenderingDeviceVulkan::_draw_list_allocate(const Rect2i &p_viewport, uint32_t p_splits, uint32_t p_subpass) { Error RenderingDeviceVulkan::_draw_list_allocate(const Rect2i &p_viewport, uint32_t p_splits, uint32_t p_subpass) {
// Lock while draw_list is active
_THREAD_SAFE_LOCK_
if (p_splits == 0) { if (p_splits == 0) {
draw_list = memnew(DrawList); draw_list = memnew(DrawList);
draw_list->command_buffer = frames[frame].draw_command_buffer; draw_list->command_buffer = frames[frame].draw_command_buffer;
@@ -7628,6 +7631,9 @@ void RenderingDeviceVulkan::_draw_list_free(Rect2i *r_last_viewport) {
memdelete(draw_list); memdelete(draw_list);
draw_list = nullptr; draw_list = nullptr;
} }
// draw_list is no longer active
_THREAD_SAFE_UNLOCK_
} }
void RenderingDeviceVulkan::draw_list_end(uint32_t p_post_barrier) { void RenderingDeviceVulkan::draw_list_end(uint32_t p_post_barrier) {
@@ -7741,6 +7747,9 @@ RenderingDevice::ComputeListID RenderingDeviceVulkan::compute_list_begin(bool p_
ERR_FAIL_COND_V_MSG(!p_allow_draw_overlap && draw_list != nullptr, INVALID_ID, "Only one draw list can be active at the same time."); ERR_FAIL_COND_V_MSG(!p_allow_draw_overlap && draw_list != nullptr, INVALID_ID, "Only one draw list can be active at the same time.");
ERR_FAIL_COND_V_MSG(compute_list != nullptr, INVALID_ID, "Only one draw/compute list can be active at the same time."); ERR_FAIL_COND_V_MSG(compute_list != nullptr, INVALID_ID, "Only one draw/compute list can be active at the same time.");
// Lock while compute_list is active
_THREAD_SAFE_LOCK_
compute_list = memnew(ComputeList); compute_list = memnew(ComputeList);
compute_list->command_buffer = frames[frame].draw_command_buffer; compute_list->command_buffer = frames[frame].draw_command_buffer;
compute_list->state.allow_draw_overlap = p_allow_draw_overlap; compute_list->state.allow_draw_overlap = p_allow_draw_overlap;
@@ -8214,6 +8223,9 @@ void RenderingDeviceVulkan::compute_list_end(uint32_t p_post_barrier) {
memdelete(compute_list); memdelete(compute_list);
compute_list = nullptr; compute_list = nullptr;
// compute_list is no longer active
_THREAD_SAFE_UNLOCK_
} }
void RenderingDeviceVulkan::barrier(uint32_t p_from, uint32_t p_to) { void RenderingDeviceVulkan::barrier(uint32_t p_from, uint32_t p_to) {

View File

@@ -259,7 +259,6 @@ public:
command_queue.push(RSG::storage, &RendererStorage::mesh_initialize, mesh); command_queue.push(RSG::storage, &RendererStorage::mesh_initialize, mesh);
command_queue.push(RSG::storage, &RendererStorage::mesh_set_blend_shape_count, mesh, p_blend_shape_count); command_queue.push(RSG::storage, &RendererStorage::mesh_set_blend_shape_count, mesh, p_blend_shape_count);
for (int i = 0; i < p_surfaces.size(); i++) { for (int i = 0; i < p_surfaces.size(); i++) {
RSG::storage->mesh_add_surface(mesh, p_surfaces[i]);
command_queue.push(RSG::storage, &RendererStorage::mesh_add_surface, mesh, p_surfaces[i]); command_queue.push(RSG::storage, &RendererStorage::mesh_add_surface, mesh, p_surfaces[i]);
} }
} }