Skip to content

Commit 90f2026

Browse files
committed
Fix D3D12 renderer crash on Wine.
1 parent ef34c3d commit 90f2026

File tree

1 file changed

+45
-5
lines changed

1 file changed

+45
-5
lines changed

servers/rendering/rendering_device.cpp

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6918,18 +6918,31 @@ Error RenderingDevice::initialize(RenderingContextDriver *p_context, DisplayServ
69186918
frames.resize(frame_count);
69196919

69206920
// Create data for all the frames.
6921+
bool frame_failed = false;
69216922
for (uint32_t i = 0; i < frames.size(); i++) {
69226923
frames[i].index = 0;
69236924

69246925
// Create command pool, command buffers, semaphores and fences.
69256926
frames[i].command_pool = driver->command_pool_create(main_queue_family, RDD::COMMAND_BUFFER_TYPE_PRIMARY);
6926-
ERR_FAIL_COND_V(!frames[i].command_pool, FAILED);
6927+
if (!frames[i].command_pool) {
6928+
frame_failed = true;
6929+
break;
6930+
}
69276931
frames[i].command_buffer = driver->command_buffer_create(frames[i].command_pool);
6928-
ERR_FAIL_COND_V(!frames[i].command_buffer, FAILED);
6932+
if (!frames[i].command_buffer) {
6933+
frame_failed = true;
6934+
break;
6935+
}
69296936
frames[i].semaphore = driver->semaphore_create();
6930-
ERR_FAIL_COND_V(!frames[i].semaphore, FAILED);
6937+
if (!frames[i].semaphore) {
6938+
frame_failed = true;
6939+
break;
6940+
}
69316941
frames[i].fence = driver->fence_create();
6932-
ERR_FAIL_COND_V(!frames[i].fence, FAILED);
6942+
if (!frames[i].fence) {
6943+
frame_failed = true;
6944+
break;
6945+
}
69336946
frames[i].fence_signaled = false;
69346947

69356948
// Create query pool.
@@ -6949,8 +6962,35 @@ Error RenderingDevice::initialize(RenderingContextDriver *p_context, DisplayServ
69496962
frames[i].transfer_worker_semaphores.resize(transfer_worker_pool_max_size);
69506963
for (uint32_t j = 0; j < transfer_worker_pool_max_size; j++) {
69516964
frames[i].transfer_worker_semaphores[j] = driver->semaphore_create();
6952-
ERR_FAIL_COND_V(!frames[i].transfer_worker_semaphores[j], FAILED);
6965+
if (!frames[i].transfer_worker_semaphores[j]) {
6966+
frame_failed = true;
6967+
break;
6968+
}
6969+
}
6970+
}
6971+
if (frame_failed) {
6972+
// Clean up created data.
6973+
for (uint32_t i = 0; i < frames.size(); i++) {
6974+
if (frames[i].command_pool) {
6975+
driver->command_pool_free(frames[i].command_pool);
6976+
}
6977+
if (frames[i].semaphore) {
6978+
driver->semaphore_free(frames[i].semaphore);
6979+
}
6980+
if (frames[i].fence) {
6981+
driver->fence_free(frames[i].fence);
6982+
}
6983+
if (frames[i].timestamp_pool) {
6984+
driver->timestamp_query_pool_free(frames[i].timestamp_pool);
6985+
}
6986+
for (uint32_t j = 0; j < frames[i].transfer_worker_semaphores.size(); j++) {
6987+
if (frames[i].transfer_worker_semaphores[j]) {
6988+
driver->semaphore_free(frames[i].transfer_worker_semaphores[j]);
6989+
}
6990+
}
69536991
}
6992+
frames.clear();
6993+
ERR_FAIL_V_MSG(FAILED, "Failed to create frame data.");
69546994
}
69556995

69566996
// Start from frame count, so everything else is immediately old.

0 commit comments

Comments
 (0)