You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-11 13:10:58 +00:00
Make Servers truly Thread Safe
-Rendering server now uses a split RID allocate/initialize internally, this allows generating RIDs immediately but initialization to happen later on the proper thread (as rendering APIs generally requiere to call on the right thread). -RenderingServerWrapMT is no more, multithreading is done in RenderingServerDefault. -Some functions like texture or mesh creation, when renderer supports it, can register and return immediately (so no waiting for server API to flush, and saving staging and command buffer memory). -3D physics server changed to be made multithread friendly. -Added PhysicsServer3DWrapMT to use 3D physics server from multiple threads. -Disablet Bullet (too much effort to make multithread friendly, this needs to be fixed eventually).
This commit is contained in:
@@ -39,9 +39,11 @@
|
||||
|
||||
/* CAMERA API */
|
||||
|
||||
RID RendererSceneCull::camera_create() {
|
||||
Camera *camera = memnew(Camera);
|
||||
return camera_owner.make_rid(camera);
|
||||
RID RendererSceneCull::camera_allocate() {
|
||||
return camera_owner.allocate_rid();
|
||||
}
|
||||
void RendererSceneCull::camera_initialize(RID p_rid) {
|
||||
camera_owner.initialize_rid(p_rid, memnew(Camera));
|
||||
}
|
||||
|
||||
void RendererSceneCull::camera_set_perspective(RID p_camera, float p_fovy_degrees, float p_z_near, float p_z_far) {
|
||||
@@ -290,11 +292,12 @@ void RendererSceneCull::_instance_unpair(Instance *p_A, Instance *p_B) {
|
||||
}
|
||||
}
|
||||
|
||||
RID RendererSceneCull::scenario_create() {
|
||||
RID RendererSceneCull::scenario_allocate() {
|
||||
return scenario_owner.allocate_rid();
|
||||
}
|
||||
void RendererSceneCull::scenario_initialize(RID p_rid) {
|
||||
Scenario *scenario = memnew(Scenario);
|
||||
ERR_FAIL_COND_V(!scenario, RID());
|
||||
RID scenario_rid = scenario_owner.make_rid(scenario);
|
||||
scenario->self = scenario_rid;
|
||||
scenario->self = p_rid;
|
||||
|
||||
scenario->reflection_probe_shadow_atlas = scene_render->shadow_atlas_create();
|
||||
scene_render->shadow_atlas_set_size(scenario->reflection_probe_shadow_atlas, 1024); //make enough shadows for close distance, don't bother with rest
|
||||
@@ -307,7 +310,7 @@ RID RendererSceneCull::scenario_create() {
|
||||
scenario->instance_aabbs.set_page_pool(&instance_aabb_page_pool);
|
||||
scenario->instance_data.set_page_pool(&instance_data_page_pool);
|
||||
|
||||
return scenario_rid;
|
||||
scenario_owner.initialize_rid(p_rid, scenario);
|
||||
}
|
||||
|
||||
void RendererSceneCull::scenario_set_debug(RID p_scenario, RS::ScenarioDebugMode p_debug_mode) {
|
||||
@@ -367,14 +370,14 @@ void RendererSceneCull::_instance_queue_update(Instance *p_instance, bool p_upda
|
||||
_instance_update_list.add(&p_instance->update_item);
|
||||
}
|
||||
|
||||
RID RendererSceneCull::instance_create() {
|
||||
RID RendererSceneCull::instance_allocate() {
|
||||
return instance_owner.allocate_rid();
|
||||
}
|
||||
void RendererSceneCull::instance_initialize(RID p_rid) {
|
||||
Instance *instance = memnew(Instance);
|
||||
ERR_FAIL_COND_V(!instance, RID());
|
||||
instance->self = p_rid;
|
||||
|
||||
RID instance_rid = instance_owner.make_rid(instance);
|
||||
instance->self = instance_rid;
|
||||
|
||||
return instance_rid;
|
||||
instance_owner.initialize_rid(p_rid, instance);
|
||||
}
|
||||
|
||||
void RendererSceneCull::_instance_update_mesh_instance(Instance *p_instance) {
|
||||
|
||||
Reference in New Issue
Block a user