Skip to content

Commit bf8ecd3

Browse files
committed
Give the barrier pool its own mutex to avoid a deadlock with transfer workers.
1 parent 0f5f3bc commit bf8ecd3

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

servers/rendering/rendering_device.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5272,14 +5272,13 @@ void RenderingDevice::_wait_for_transfer_worker(TransferWorker *p_transfer_worke
52725272
p_transfer_worker->operations_processed = p_transfer_worker->operations_submitted;
52735273
}
52745274

5275-
if (!p_transfer_worker->texture_barriers.is_empty()) {
5276-
MutexLock transfer_worker_lock(transfer_worker_pool_mutex);
5277-
_flush_barriers_for_transfer_worker(p_transfer_worker);
5278-
}
5275+
_flush_barriers_for_transfer_worker(p_transfer_worker);
52795276
}
52805277

52815278
void RenderingDevice::_flush_barriers_for_transfer_worker(TransferWorker *p_transfer_worker) {
5279+
// Caller must have already acquired the mutex for the worker.
52825280
if (!p_transfer_worker->texture_barriers.is_empty()) {
5281+
MutexLock transfer_worker_lock(transfer_worker_pool_texture_barriers_mutex);
52835282
for (uint32_t i = 0; i < p_transfer_worker->texture_barriers.size(); i++) {
52845283
transfer_worker_pool_texture_barriers.push_back(p_transfer_worker->texture_barriers[i]);
52855284
}
@@ -5352,8 +5351,11 @@ void RenderingDevice::_submit_transfer_workers(RDD::CommandBufferID p_draw_comma
53525351
}
53535352
}
53545353
}
5354+
}
53555355

5356-
if (p_draw_command_buffer && !transfer_worker_pool_texture_barriers.is_empty()) {
5356+
void RenderingDevice::_submit_transfer_barriers(RDD::CommandBufferID p_draw_command_buffer) {
5357+
MutexLock transfer_worker_lock(transfer_worker_pool_texture_barriers_mutex);
5358+
if (!transfer_worker_pool_texture_barriers.is_empty()) {
53575359
driver->command_pipeline_barrier(p_draw_command_buffer, RDD::PIPELINE_STAGE_COPY_BIT, RDD::PIPELINE_STAGE_ALL_COMMANDS_BIT, {}, {}, transfer_worker_pool_texture_barriers);
53585360
transfer_worker_pool_texture_barriers.clear();
53595361
}
@@ -5953,6 +5955,7 @@ void RenderingDevice::_end_frame() {
59535955
// The command buffer must be copied into a stack variable as the driver workarounds can change the command buffer in use.
59545956
RDD::CommandBufferID command_buffer = frames[frame].command_buffer;
59555957
_submit_transfer_workers(command_buffer);
5958+
_submit_transfer_barriers(command_buffer);
59565959

59575960
draw_graph.end(RENDER_GRAPH_REORDER, RENDER_GRAPH_FULL_BARRIERS, command_buffer, frames[frame].command_buffer_pool);
59585961
driver->command_buffer_end(command_buffer);

servers/rendering/rendering_device.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,6 +1285,7 @@ class RenderingDevice : public RenderingDeviceCommons {
12851285
LocalVector<uint32_t> transfer_worker_pool_available_list;
12861286
LocalVector<RDD::TextureBarrier> transfer_worker_pool_texture_barriers;
12871287
BinaryMutex transfer_worker_pool_mutex;
1288+
BinaryMutex transfer_worker_pool_texture_barriers_mutex;
12881289
ConditionVariable transfer_worker_pool_condition;
12891290

12901291
TransferWorker *_acquire_transfer_worker(uint32_t p_transfer_size, uint32_t p_required_align, uint32_t &r_staging_offset);
@@ -1299,6 +1300,7 @@ class RenderingDevice : public RenderingDeviceCommons {
12991300
void _check_transfer_worker_vertex_array(VertexArray *p_vertex_array);
13001301
void _check_transfer_worker_index_array(IndexArray *p_index_array);
13011302
void _submit_transfer_workers(RDD::CommandBufferID p_draw_command_buffer = RDD::CommandBufferID());
1303+
void _submit_transfer_barriers(RDD::CommandBufferID p_draw_command_buffer);
13021304
void _wait_for_transfer_workers();
13031305
void _free_transfer_workers();
13041306

0 commit comments

Comments
 (0)