summaryrefslogtreecommitdiff
path: root/servers/visual/visual_server_wrap_mt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'servers/visual/visual_server_wrap_mt.cpp')
-rw-r--r--servers/visual/visual_server_wrap_mt.cpp69
1 files changed, 30 insertions, 39 deletions
diff --git a/servers/visual/visual_server_wrap_mt.cpp b/servers/visual/visual_server_wrap_mt.cpp
index d9a0077e60..03c68ab454 100644
--- a/servers/visual/visual_server_wrap_mt.cpp
+++ b/servers/visual/visual_server_wrap_mt.cpp
@@ -37,14 +37,7 @@ void VisualServerWrapMT::thread_exit() {
void VisualServerWrapMT::thread_draw() {
- draw_mutex->lock();
-
- draw_pending--;
- bool draw = (draw_pending == 0); // only draw when no more flushes are pending
-
- draw_mutex->unlock();
-
- if (draw) {
+ if (!atomic_decrement(&draw_pending)) {
visual_server->draw();
}
@@ -52,11 +45,7 @@ void VisualServerWrapMT::thread_draw() {
void VisualServerWrapMT::thread_flush() {
- draw_mutex->lock();
-
- draw_pending--;
-
- draw_mutex->unlock();
+ atomic_decrement(&draw_pending);
}
void VisualServerWrapMT::_thread_callback(void *_instance) {
@@ -92,36 +81,23 @@ void VisualServerWrapMT::sync() {
if (create_thread) {
- /* TODO: sync with the thread */
-
- /*
- ERR_FAIL_COND(!draw_mutex);
- draw_mutex->lock();
- draw_pending++; //cambiar por un saferefcount
- draw_mutex->unlock();
- */
- //command_queue.push( this, &VisualServerWrapMT::thread_flush);
+ atomic_increment(&draw_pending);
+ command_queue.push_and_sync(this, &VisualServerWrapMT::thread_flush);
} else {
command_queue.flush_all(); //flush all pending from other threads
}
}
-void VisualServerWrapMT::draw() {
+void VisualServerWrapMT::draw(bool p_swap_buffers) {
if (create_thread) {
- /* TODO: Make it draw
- ERR_FAIL_COND(!draw_mutex);
- draw_mutex->lock();
- draw_pending++; //cambiar por un saferefcount
- draw_mutex->unlock();
-
- command_queue.push( this, &VisualServerWrapMT::thread_draw);
- */
+ atomic_increment(&draw_pending);
+ command_queue.push(this, &VisualServerWrapMT::thread_draw);
} else {
- visual_server->draw();
+ visual_server->draw(p_swap_buffers);
}
}
@@ -129,7 +105,6 @@ void VisualServerWrapMT::init() {
if (create_thread) {
- draw_mutex = Mutex::create();
print_line("CREATING RENDER THREAD");
OS::get_singleton()->release_rendering_thread();
if (create_thread) {
@@ -154,16 +129,33 @@ void VisualServerWrapMT::finish() {
Thread::wait_to_finish(thread);
memdelete(thread);
- texture_free_cached_ids();
- //mesh_free_cached_ids();
-
thread = NULL;
} else {
visual_server->finish();
}
- if (draw_mutex)
- memdelete(draw_mutex);
+ texture_free_cached_ids();
+ shader_free_cached_ids();
+ material_free_cached_ids();
+ mesh_free_cached_ids();
+ multimesh_free_cached_ids();
+ immediate_free_cached_ids();
+ skeleton_free_cached_ids();
+ directional_light_free_cached_ids();
+ omni_light_free_cached_ids();
+ spot_light_free_cached_ids();
+ reflection_probe_free_cached_ids();
+ gi_probe_free_cached_ids();
+ particles_free_cached_ids();
+ camera_free_cached_ids();
+ viewport_free_cached_ids();
+ environment_free_cached_ids();
+ scenario_free_cached_ids();
+ instance_free_cached_ids();
+ canvas_free_cached_ids();
+ canvas_item_free_cached_ids();
+ canvas_light_occluder_free_cached_ids();
+ canvas_occluder_polygon_free_cached_ids();
}
VisualServerWrapMT::VisualServerWrapMT(VisualServer *p_contained, bool p_create_thread)
@@ -172,7 +164,6 @@ VisualServerWrapMT::VisualServerWrapMT(VisualServer *p_contained, bool p_create_
visual_server = p_contained;
create_thread = p_create_thread;
thread = NULL;
- draw_mutex = NULL;
draw_pending = 0;
draw_thread_up = false;
alloc_mutex = Mutex::create();