@@ -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