mirror of
https://github.com/godotengine/godot.git
synced 2024-11-21 11:32:13 +00:00
Merge pull request #99066 from DarioSamo/rd-transfer-worker-deadlock-fix
Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled
🔗 GHA / 🪲 Godot CPP (push) Has been cancelled
Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled
🔗 GHA / 🪲 Godot CPP (push) Has been cancelled
Give the barrier pool its own mutex to avoid a deadlock with transfer workers.
This commit is contained in:
commit
76fa7b2914
@ -5272,14 +5272,13 @@ void RenderingDevice::_wait_for_transfer_worker(TransferWorker *p_transfer_worke
|
||||
p_transfer_worker->operations_processed = p_transfer_worker->operations_submitted;
|
||||
}
|
||||
|
||||
if (!p_transfer_worker->texture_barriers.is_empty()) {
|
||||
MutexLock transfer_worker_lock(transfer_worker_pool_mutex);
|
||||
_flush_barriers_for_transfer_worker(p_transfer_worker);
|
||||
}
|
||||
}
|
||||
|
||||
void RenderingDevice::_flush_barriers_for_transfer_worker(TransferWorker *p_transfer_worker) {
|
||||
// Caller must have already acquired the mutex for the worker.
|
||||
if (!p_transfer_worker->texture_barriers.is_empty()) {
|
||||
MutexLock transfer_worker_lock(transfer_worker_pool_texture_barriers_mutex);
|
||||
for (uint32_t i = 0; i < p_transfer_worker->texture_barriers.size(); i++) {
|
||||
transfer_worker_pool_texture_barriers.push_back(p_transfer_worker->texture_barriers[i]);
|
||||
}
|
||||
@ -5352,8 +5351,11 @@ void RenderingDevice::_submit_transfer_workers(RDD::CommandBufferID p_draw_comma
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (p_draw_command_buffer && !transfer_worker_pool_texture_barriers.is_empty()) {
|
||||
void RenderingDevice::_submit_transfer_barriers(RDD::CommandBufferID p_draw_command_buffer) {
|
||||
MutexLock transfer_worker_lock(transfer_worker_pool_texture_barriers_mutex);
|
||||
if (!transfer_worker_pool_texture_barriers.is_empty()) {
|
||||
driver->command_pipeline_barrier(p_draw_command_buffer, RDD::PIPELINE_STAGE_COPY_BIT, RDD::PIPELINE_STAGE_ALL_COMMANDS_BIT, {}, {}, transfer_worker_pool_texture_barriers);
|
||||
transfer_worker_pool_texture_barriers.clear();
|
||||
}
|
||||
@ -5953,6 +5955,7 @@ void RenderingDevice::_end_frame() {
|
||||
// The command buffer must be copied into a stack variable as the driver workarounds can change the command buffer in use.
|
||||
RDD::CommandBufferID command_buffer = frames[frame].command_buffer;
|
||||
_submit_transfer_workers(command_buffer);
|
||||
_submit_transfer_barriers(command_buffer);
|
||||
|
||||
draw_graph.end(RENDER_GRAPH_REORDER, RENDER_GRAPH_FULL_BARRIERS, command_buffer, frames[frame].command_buffer_pool);
|
||||
driver->command_buffer_end(command_buffer);
|
||||
|
@ -1285,6 +1285,7 @@ private:
|
||||
LocalVector<uint32_t> transfer_worker_pool_available_list;
|
||||
LocalVector<RDD::TextureBarrier> transfer_worker_pool_texture_barriers;
|
||||
BinaryMutex transfer_worker_pool_mutex;
|
||||
BinaryMutex transfer_worker_pool_texture_barriers_mutex;
|
||||
ConditionVariable transfer_worker_pool_condition;
|
||||
|
||||
TransferWorker *_acquire_transfer_worker(uint32_t p_transfer_size, uint32_t p_required_align, uint32_t &r_staging_offset);
|
||||
@ -1299,6 +1300,7 @@ private:
|
||||
void _check_transfer_worker_vertex_array(VertexArray *p_vertex_array);
|
||||
void _check_transfer_worker_index_array(IndexArray *p_index_array);
|
||||
void _submit_transfer_workers(RDD::CommandBufferID p_draw_command_buffer = RDD::CommandBufferID());
|
||||
void _submit_transfer_barriers(RDD::CommandBufferID p_draw_command_buffer);
|
||||
void _wait_for_transfer_workers();
|
||||
void _free_transfer_workers();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user