2014-02-10 01:10:30 +00:00
/**************************************************************************/
2020-12-03 21:09:47 +00:00
/* rendering_server_default.cpp */
2014-02-10 01:10:30 +00:00
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2018-01-04 23:50:27 +00:00
2020-12-03 21:09:47 +00:00
# include "rendering_server_default.h"
2017-08-27 19:07:15 +00:00
2020-11-07 22:33:38 +00:00
# include "core/config/project_settings.h"
2018-09-11 16:13:45 +00:00
# include "core/io/marshalls.h"
# include "core/os/os.h"
2020-11-07 22:33:38 +00:00
# include "core/templates/sort_array.h"
2020-12-04 18:26:24 +00:00
# include "renderer_canvas_cull.h"
# include "renderer_scene_cull.h"
2020-03-27 18:21:27 +00:00
# include "rendering_server_globals.h"
2016-10-03 19:33:42 +00:00
2021-10-07 13:46:55 +00:00
// careful, these may run in different threads than the rendering server
2014-02-10 01:10:30 +00:00
2020-12-03 21:09:47 +00:00
int RenderingServerDefault : : changes = 0 ;
2017-04-07 02:36:37 +00:00
2016-10-03 19:33:42 +00:00
/* FREE */
2021-02-09 16:19:03 +00:00
void RenderingServerDefault : : _free ( RID p_rid ) {
2021-09-29 08:59:46 +00:00
if ( unlikely ( p_rid . is_null ( ) ) ) {
return ;
}
2022-06-21 00:08:33 +00:00
if ( RSG : : utilities - > free ( p_rid ) ) {
2016-10-03 19:33:42 +00:00
return ;
2020-05-14 14:41:43 +00:00
}
if ( RSG : : canvas - > free ( p_rid ) ) {
2016-10-03 19:33:42 +00:00
return ;
2020-05-14 14:41:43 +00:00
}
if ( RSG : : viewport - > free ( p_rid ) ) {
2016-10-03 19:33:42 +00:00
return ;
2020-05-14 14:41:43 +00:00
}
if ( RSG : : scene - > free ( p_rid ) ) {
2016-10-19 14:14:41 +00:00
return ;
2020-05-14 14:41:43 +00:00
}
2016-10-03 19:33:42 +00:00
}
/* EVENT QUEUING */
2021-11-05 05:59:38 +00:00
void RenderingServerDefault : : request_frame_drawn_callback ( const Callable & p_callable ) {
frame_drawn_callbacks . push_back ( p_callable ) ;
2017-06-09 03:23:50 +00:00
}
2021-02-09 16:19:03 +00:00
void RenderingServerDefault : : _draw ( bool p_swap_buffers , double frame_step ) {
2020-03-27 18:21:27 +00:00
RSG : : rasterizer - > begin_frame ( frame_step ) ;
2016-12-20 03:21:07 +00:00
2019-10-03 23:15:38 +00:00
TIMESTAMP_BEGIN ( )
2019-09-20 20:58:06 +00:00
2020-12-24 03:13:52 +00:00
uint64_t time_usec = OS : : get_singleton ( ) - > get_ticks_usec ( ) ;
2024-03-11 22:12:57 +00:00
RENDER_TIMESTAMP ( " Prepare Render Frame " ) ;
2020-12-03 21:09:47 +00:00
RSG : : scene - > update ( ) ; //update scenes stuff before updating instances
2019-08-26 20:43:58 +00:00
2020-12-24 03:13:52 +00:00
frame_setup_time = double ( OS : : get_singleton ( ) - > get_ticks_usec ( ) - time_usec ) / 1000.0 ;
2022-04-12 11:41:50 +00:00
RSG : : particles_storage - > update_particles ( ) ; //need to be done after instances are updated (colliders and particle transforms), and colliders are rendered
2020-10-08 00:29:49 +00:00
2020-03-27 18:21:27 +00:00
RSG : : scene - > render_probes ( ) ;
2020-12-24 03:13:52 +00:00
2023-08-23 16:45:11 +00:00
RSG : : viewport - > draw_viewports ( p_swap_buffers ) ;
2020-03-27 18:21:27 +00:00
RSG : : canvas_render - > update ( ) ;
2019-06-16 02:45:24 +00:00
2023-10-31 10:56:23 +00:00
RSG : : rasterizer - > end_frame ( p_swap_buffers ) ;
2017-06-09 03:23:50 +00:00
2024-03-12 02:42:50 +00:00
# ifndef _3D_DISABLED
2022-01-26 01:25:20 +00:00
XRServer * xr_server = XRServer : : get_singleton ( ) ;
if ( xr_server ! = nullptr ) {
// let our XR server know we're done so we can get our frame timing
xr_server - > end_frame ( ) ;
}
2024-03-12 02:42:50 +00:00
# endif // _3D_DISABLED
2022-01-26 01:25:20 +00:00
2021-06-15 20:33:24 +00:00
RSG : : canvas - > update_visibility_notifiers ( ) ;
2021-06-16 18:43:02 +00:00
RSG : : scene - > update_visibility_notifiers ( ) ;
2021-06-15 20:33:24 +00:00
2024-04-23 10:01:23 +00:00
if ( create_thread ) {
callable_mp ( this , & RenderingServerDefault : : _run_post_draw_steps ) . call_deferred ( ) ;
} else {
_run_post_draw_steps ( ) ;
2017-06-09 03:23:50 +00:00
}
2019-09-20 20:58:06 +00:00
2022-06-21 00:08:33 +00:00
if ( RSG : : utilities - > get_captured_timestamps_count ( ) ) {
2019-09-20 20:58:06 +00:00
Vector < FrameProfileArea > new_profile ;
2022-06-21 00:08:33 +00:00
if ( RSG : : utilities - > capturing_timestamps ) {
new_profile . resize ( RSG : : utilities - > get_captured_timestamps_count ( ) ) ;
2020-04-10 17:18:42 +00:00
}
2019-09-20 20:58:06 +00:00
2022-06-21 00:08:33 +00:00
uint64_t base_cpu = RSG : : utilities - > get_captured_timestamp_cpu_time ( 0 ) ;
uint64_t base_gpu = RSG : : utilities - > get_captured_timestamp_gpu_time ( 0 ) ;
for ( uint32_t i = 0 ; i < RSG : : utilities - > get_captured_timestamps_count ( ) ; i + + ) {
uint64_t time_cpu = RSG : : utilities - > get_captured_timestamp_cpu_time ( i ) ;
uint64_t time_gpu = RSG : : utilities - > get_captured_timestamp_gpu_time ( i ) ;
2020-04-10 17:18:42 +00:00
2022-06-21 00:08:33 +00:00
String name = RSG : : utilities - > get_captured_timestamp_name ( i ) ;
2020-04-10 17:18:42 +00:00
if ( name . begins_with ( " vp_ " ) ) {
RSG : : viewport - > handle_timestamp ( name , time_cpu , time_gpu ) ;
}
2022-06-21 00:08:33 +00:00
if ( RSG : : utilities - > capturing_timestamps ) {
2021-02-02 02:16:37 +00:00
new_profile . write [ i ] . gpu_msec = double ( ( time_gpu - base_gpu ) / 1000 ) / 1000.0 ;
new_profile . write [ i ] . cpu_msec = double ( time_cpu - base_cpu ) / 1000.0 ;
2022-06-21 00:08:33 +00:00
new_profile . write [ i ] . name = RSG : : utilities - > get_captured_timestamp_name ( i ) ;
2020-04-10 17:18:42 +00:00
}
2019-09-20 20:58:06 +00:00
}
frame_profile = new_profile ;
}
2022-06-21 00:08:33 +00:00
frame_profile_frame = RSG : : utilities - > get_captured_timestamps_frame ( ) ;
2021-01-22 23:50:24 +00:00
if ( print_gpu_profile ) {
if ( print_frame_profile_ticks_from = = 0 ) {
print_frame_profile_ticks_from = OS : : get_singleton ( ) - > get_ticks_usec ( ) ;
}
2021-02-02 02:16:37 +00:00
double total_time = 0.0 ;
2021-01-22 23:50:24 +00:00
for ( int i = 0 ; i < frame_profile . size ( ) - 1 ; i + + ) {
String name = frame_profile [ i ] . name ;
if ( name [ 0 ] = = ' < ' | | name [ 0 ] = = ' > ' ) {
continue ;
}
2021-02-02 02:16:37 +00:00
double time = frame_profile [ i + 1 ] . gpu_msec - frame_profile [ i ] . gpu_msec ;
2021-01-22 23:50:24 +00:00
if ( name [ 0 ] ! = ' < ' & & name [ 0 ] ! = ' > ' ) {
if ( print_gpu_profile_task_time . has ( name ) ) {
print_gpu_profile_task_time [ name ] + = time ;
} else {
print_gpu_profile_task_time [ name ] = time ;
}
}
}
if ( frame_profile . size ( ) ) {
total_time = frame_profile [ frame_profile . size ( ) - 1 ] . gpu_msec ;
}
uint64_t ticks_elapsed = OS : : get_singleton ( ) - > get_ticks_usec ( ) - print_frame_profile_ticks_from ;
print_frame_profile_frame_count + + ;
if ( ticks_elapsed > 1000000 ) {
print_line ( " GPU PROFILE (total " + rtos ( total_time ) + " ms): " ) ;
float print_threshold = 0.01 ;
2022-05-08 08:09:19 +00:00
for ( const KeyValue < String , float > & E : print_gpu_profile_task_time ) {
double time = E . value / double ( print_frame_profile_frame_count ) ;
2021-01-22 23:50:24 +00:00
if ( time > print_threshold ) {
2022-05-08 08:09:19 +00:00
print_line ( " \t - " + E . key + " : " + rtos ( time ) + " ms " ) ;
2021-01-22 23:50:24 +00:00
}
}
print_gpu_profile_task_time . clear ( ) ;
print_frame_profile_ticks_from = OS : : get_singleton ( ) - > get_ticks_usec ( ) ;
print_frame_profile_frame_count = 0 ;
}
}
2021-07-02 23:14:19 +00:00
2022-06-21 00:08:33 +00:00
RSG : : utilities - > update_memory_info ( ) ;
2016-10-03 19:33:42 +00:00
}
2020-05-14 12:29:06 +00:00
2024-04-23 10:01:23 +00:00
void RenderingServerDefault : : _run_post_draw_steps ( ) {
while ( frame_drawn_callbacks . front ( ) ) {
Callable c = frame_drawn_callbacks . front ( ) - > get ( ) ;
Variant result ;
Callable : : CallError ce ;
c . callp ( nullptr , 0 , result , ce ) ;
if ( ce . error ! = Callable : : CallError : : CALL_OK ) {
String err = Variant : : get_callable_error_text ( c , nullptr , 0 , ce ) ;
ERR_PRINT ( " Error calling frame drawn function: " + err ) ;
}
frame_drawn_callbacks . pop_front ( ) ;
}
emit_signal ( SNAME ( " frame_post_draw " ) ) ;
}
2021-02-02 02:16:37 +00:00
double RenderingServerDefault : : get_frame_setup_time_cpu ( ) const {
2020-12-24 03:13:52 +00:00
return frame_setup_time ;
}
2020-12-03 21:09:47 +00:00
bool RenderingServerDefault : : has_changed ( ) const {
2016-10-04 02:46:24 +00:00
return changes > 0 ;
2016-10-03 19:33:42 +00:00
}
2020-05-14 12:29:06 +00:00
2021-02-09 16:19:03 +00:00
void RenderingServerDefault : : _init ( ) {
2024-04-23 10:01:23 +00:00
RSG : : threaded = create_thread ;
RSG : : canvas = memnew ( RendererCanvasCull ) ;
RSG : : viewport = memnew ( RendererViewport ) ;
RendererSceneCull * sr = memnew ( RendererSceneCull ) ;
RSG : : camera_attributes = memnew ( RendererCameraAttributes ) ;
RSG : : scene = sr ;
RSG : : rasterizer = RendererCompositor : : create ( ) ;
RSG : : utilities = RSG : : rasterizer - > get_utilities ( ) ;
2020-03-27 18:21:27 +00:00
RSG : : rasterizer - > initialize ( ) ;
2024-04-23 10:01:23 +00:00
RSG : : light_storage = RSG : : rasterizer - > get_light_storage ( ) ;
RSG : : material_storage = RSG : : rasterizer - > get_material_storage ( ) ;
RSG : : mesh_storage = RSG : : rasterizer - > get_mesh_storage ( ) ;
RSG : : particles_storage = RSG : : rasterizer - > get_particles_storage ( ) ;
RSG : : texture_storage = RSG : : rasterizer - > get_texture_storage ( ) ;
RSG : : gi = RSG : : rasterizer - > get_gi ( ) ;
RSG : : fog = RSG : : rasterizer - > get_fog ( ) ;
RSG : : canvas_render = RSG : : rasterizer - > get_canvas ( ) ;
sr - > set_scene_render ( RSG : : rasterizer - > get_scene ( ) ) ;
2016-10-03 19:33:42 +00:00
}
2020-05-14 12:29:06 +00:00
2021-02-09 16:19:03 +00:00
void RenderingServerDefault : : _finish ( ) {
2016-10-03 19:33:42 +00:00
if ( test_cube . is_valid ( ) ) {
free ( test_cube ) ;
}
2023-12-20 12:19:46 +00:00
RSG : : canvas - > finalize ( ) ;
2024-04-23 10:01:23 +00:00
memdelete ( RSG : : canvas ) ;
2020-03-27 18:21:27 +00:00
RSG : : rasterizer - > finalize ( ) ;
2024-04-23 10:01:23 +00:00
memdelete ( RSG : : viewport ) ;
memdelete ( RSG : : rasterizer ) ;
memdelete ( RSG : : scene ) ;
memdelete ( RSG : : camera_attributes ) ;
2016-10-03 19:33:42 +00:00
}
2021-02-09 16:19:03 +00:00
void RenderingServerDefault : : init ( ) {
if ( create_thread ) {
2024-04-04 08:18:08 +00:00
print_verbose ( " RenderingServerWrapMT: Starting render thread " ) ;
2021-02-09 16:19:03 +00:00
DisplayServer : : get_singleton ( ) - > release_rendering_thread ( ) ;
2024-04-23 10:01:23 +00:00
WorkerThreadPool : : TaskID tid = WorkerThreadPool : : get_singleton ( ) - > add_task ( callable_mp ( this , & RenderingServerDefault : : _thread_loop ) , true ) ;
command_queue . set_pump_task_id ( tid ) ;
command_queue . push ( this , & RenderingServerDefault : : _assign_mt_ids , tid ) ;
command_queue . push_and_sync ( this , & RenderingServerDefault : : _init ) ;
DEV_ASSERT ( server_task_id = = tid ) ;
2021-02-09 16:19:03 +00:00
} else {
2024-04-23 10:01:23 +00:00
server_thread = Thread : : MAIN_ID ;
2021-02-09 16:19:03 +00:00
_init ( ) ;
}
}
void RenderingServerDefault : : finish ( ) {
if ( create_thread ) {
2024-04-23 10:01:23 +00:00
command_queue . push ( this , & RenderingServerDefault : : _finish ) ;
2021-02-09 16:19:03 +00:00
command_queue . push ( this , & RenderingServerDefault : : _thread_exit ) ;
2024-04-04 08:18:08 +00:00
if ( server_task_id ! = WorkerThreadPool : : INVALID_TASK_ID ) {
WorkerThreadPool : : get_singleton ( ) - > wait_for_task_completion ( server_task_id ) ;
server_task_id = WorkerThreadPool : : INVALID_TASK_ID ;
2023-04-27 16:34:30 +00:00
}
2024-04-23 10:01:23 +00:00
server_thread = Thread : : MAIN_ID ;
2021-02-09 16:19:03 +00:00
} else {
_finish ( ) ;
}
}
2016-10-03 19:33:42 +00:00
/* STATUS INFORMATION */
2021-07-02 23:14:19 +00:00
uint64_t RenderingServerDefault : : get_rendering_info ( RenderingInfo p_info ) {
if ( p_info = = RENDERING_INFO_TOTAL_OBJECTS_IN_FRAME ) {
return RSG : : viewport - > get_total_objects_drawn ( ) ;
} else if ( p_info = = RENDERING_INFO_TOTAL_PRIMITIVES_IN_FRAME ) {
2023-05-27 01:09:39 +00:00
return RSG : : viewport - > get_total_primitives_drawn ( ) ;
2021-07-02 23:14:19 +00:00
} else if ( p_info = = RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME ) {
return RSG : : viewport - > get_total_draw_calls_used ( ) ;
}
2022-06-21 00:08:33 +00:00
return RSG : : utilities - > get_rendering_info ( p_info ) ;
2016-10-03 19:33:42 +00:00
}
2021-12-10 16:01:51 +00:00
RenderingDevice : : DeviceType RenderingServerDefault : : get_video_adapter_type ( ) const {
2022-06-21 00:08:33 +00:00
return RSG : : utilities - > get_video_adapter_type ( ) ;
2021-12-10 16:01:51 +00:00
}
2020-12-03 21:09:47 +00:00
void RenderingServerDefault : : set_frame_profiling_enabled ( bool p_enable ) {
2022-06-21 00:08:33 +00:00
RSG : : utilities - > capturing_timestamps = p_enable ;
2019-09-20 20:58:06 +00:00
}
2020-12-03 21:09:47 +00:00
uint64_t RenderingServerDefault : : get_frame_profile_frame ( ) {
2019-09-20 20:58:06 +00:00
return frame_profile_frame ;
}
2020-12-03 21:09:47 +00:00
Vector < RenderingServer : : FrameProfileArea > RenderingServerDefault : : get_frame_profile ( ) {
2019-09-20 20:58:06 +00:00
return frame_profile ;
}
2016-10-03 19:33:42 +00:00
/* TESTING */
2023-01-11 18:14:43 +00:00
Color RenderingServerDefault : : get_default_clear_color ( ) {
return RSG : : texture_storage - > get_default_clear_color ( ) ;
}
2020-12-03 21:09:47 +00:00
void RenderingServerDefault : : set_default_clear_color ( const Color & p_color ) {
2024-04-23 10:01:23 +00:00
RSG : : texture_storage - > set_default_clear_color ( p_color ) ;
2016-10-03 19:33:42 +00:00
}
2024-01-10 10:27:37 +00:00
# ifndef DISABLE_DEPRECATED
2020-12-03 21:09:47 +00:00
bool RenderingServerDefault : : has_feature ( Features p_feature ) const {
2016-10-03 19:33:42 +00:00
return false ;
}
2024-01-10 10:27:37 +00:00
# endif
2016-10-03 19:33:42 +00:00
2020-12-03 21:09:47 +00:00
void RenderingServerDefault : : sdfgi_set_debug_probe_select ( const Vector3 & p_position , const Vector3 & p_dir ) {
RSG : : scene - > sdfgi_set_debug_probe_select ( p_position , p_dir ) ;
2020-06-25 13:33:28 +00:00
}
2021-01-22 23:50:24 +00:00
void RenderingServerDefault : : set_print_gpu_profile ( bool p_enable ) {
2022-06-21 00:08:33 +00:00
RSG : : utilities - > capturing_timestamps = p_enable ;
2021-01-22 23:50:24 +00:00
print_gpu_profile = p_enable ;
}
2020-12-03 21:09:47 +00:00
RID RenderingServerDefault : : get_test_cube ( ) {
2016-10-03 19:33:42 +00:00
if ( ! test_cube . is_valid ( ) ) {
test_cube = _make_test_cube ( ) ;
}
return test_cube ;
}
2020-12-03 21:09:47 +00:00
bool RenderingServerDefault : : has_os_feature ( const String & p_feature ) const {
2022-06-21 00:08:33 +00:00
if ( RSG : : utilities ) {
return RSG : : utilities - > has_os_feature ( p_feature ) ;
2022-05-28 11:09:23 +00:00
} else {
return false ;
}
2017-02-06 03:38:39 +00:00
}
2020-12-03 21:09:47 +00:00
void RenderingServerDefault : : set_debug_generate_wireframes ( bool p_generate ) {
2022-06-21 00:08:33 +00:00
RSG : : utilities - > set_debug_generate_wireframes ( p_generate ) ;
2017-06-11 18:52:03 +00:00
}
2020-12-03 21:09:47 +00:00
bool RenderingServerDefault : : is_low_end ( ) const {
2022-04-29 22:34:01 +00:00
return RendererCompositor : : is_low_end ( ) ;
2018-09-28 23:32:40 +00:00
}
2020-05-14 12:29:06 +00:00
2022-08-21 22:16:56 +00:00
Size2i RenderingServerDefault : : get_maximum_viewport_size ( ) const {
if ( RSG : : utilities ) {
return RSG : : utilities - > get_maximum_viewport_size ( ) ;
} else {
return Size2i ( ) ;
}
}
2024-04-23 10:01:23 +00:00
void RenderingServerDefault : : _assign_mt_ids ( WorkerThreadPool : : TaskID p_pump_task_id ) {
server_thread = Thread : : get_caller_id ( ) ;
server_task_id = p_pump_task_id ;
2021-02-09 16:19:03 +00:00
}
2024-04-23 10:01:23 +00:00
void RenderingServerDefault : : _thread_exit ( ) {
exit = true ;
2021-02-09 16:19:03 +00:00
}
void RenderingServerDefault : : _thread_loop ( ) {
2024-04-09 09:47:06 +00:00
DisplayServer : : get_singleton ( ) - > gl_window_make_current ( DisplayServer : : MAIN_WINDOW_ID ) ; // Move GL to this thread.
2021-02-09 16:19:03 +00:00
2024-04-04 08:18:08 +00:00
while ( ! exit ) {
WorkerThreadPool : : get_singleton ( ) - > yield ( ) ;
command_queue . flush_all ( ) ;
2021-02-09 16:19:03 +00:00
}
2024-04-04 08:18:08 +00:00
DisplayServer : : get_singleton ( ) - > release_rendering_thread ( ) ;
2021-02-09 16:19:03 +00:00
}
2024-02-16 23:57:32 +00:00
/* INTERPOLATION */
void RenderingServerDefault : : tick ( ) {
RSG : : canvas - > tick ( ) ;
}
void RenderingServerDefault : : set_physics_interpolation_enabled ( bool p_enabled ) {
RSG : : canvas - > set_physics_interpolation_enabled ( p_enabled ) ;
}
2021-02-09 16:19:03 +00:00
/* EVENT QUEUING */
void RenderingServerDefault : : sync ( ) {
2024-04-23 10:01:23 +00:00
if ( create_thread ) {
command_queue . sync ( ) ;
} else {
2024-04-04 08:18:08 +00:00
command_queue . flush_all ( ) ; // Flush all pending from other threads.
2021-02-09 16:19:03 +00:00
}
}
void RenderingServerDefault : : draw ( bool p_swap_buffers , double frame_step ) {
2023-10-07 10:53:02 +00:00
ERR_FAIL_COND_MSG ( ! Thread : : is_main_thread ( ) , " Manually triggering the draw function from the RenderingServer can only be done on the main thread. Call this function from the main thread or use call_deferred(). " ) ;
2024-04-04 08:18:08 +00:00
// Needs to be done before changes is reset to 0, to not force the editor to redraw.
RS : : get_singleton ( ) - > emit_signal ( SNAME ( " frame_pre_draw " ) ) ;
2024-04-23 10:01:23 +00:00
changes = 0 ;
2021-02-09 16:19:03 +00:00
if ( create_thread ) {
2024-04-23 10:01:23 +00:00
command_queue . push ( this , & RenderingServerDefault : : _draw , p_swap_buffers , frame_step ) ;
2021-02-09 16:19:03 +00:00
} else {
_draw ( p_swap_buffers , frame_step ) ;
}
}
2023-07-20 09:49:59 +00:00
void RenderingServerDefault : : _call_on_render_thread ( const Callable & p_callable ) {
2023-07-11 14:18:10 +00:00
p_callable . call ( ) ;
2023-07-20 09:49:59 +00:00
}
2024-04-04 08:18:08 +00:00
RenderingServerDefault : : RenderingServerDefault ( bool p_create_thread ) {
2022-05-28 11:09:23 +00:00
RenderingServer : : init ( ) ;
2021-02-09 16:19:03 +00:00
create_thread = p_create_thread ;
2016-10-03 19:33:42 +00:00
}
2020-12-03 21:09:47 +00:00
RenderingServerDefault : : ~ RenderingServerDefault ( ) {
2016-10-03 19:33:42 +00:00
}