summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/message_queue.cpp10
-rw-r--r--core/message_queue.h4
-rw-r--r--drivers/gles2/rasterizer_canvas_gles2.cpp3
-rw-r--r--editor/progress_dialog.cpp5
4 files changed, 21 insertions, 1 deletions
diff --git a/core/message_queue.cpp b/core/message_queue.cpp
index 7c3bdfec53..c57bd4081c 100644
--- a/core/message_queue.cpp
+++ b/core/message_queue.cpp
@@ -271,6 +271,9 @@ void MessageQueue::flush() {
//using reverse locking strategy
_THREAD_SAFE_LOCK_
+ ERR_FAIL_COND(flushing); //already flushing, you did something odd
+ flushing = true;
+
while (read_pos < buffer_end) {
//lock on each iteration, so a call can re-add itself to the message queue
@@ -327,13 +330,20 @@ void MessageQueue::flush() {
}
buffer_end = 0; // reset buffer
+ flushing = false;
_THREAD_SAFE_UNLOCK_
}
+bool MessageQueue::is_flushing() const {
+
+ return flushing;
+}
+
MessageQueue::MessageQueue() {
ERR_FAIL_COND(singleton != NULL);
singleton = this;
+ flushing = false;
buffer_end = 0;
buffer_max_used = 0;
diff --git a/core/message_queue.h b/core/message_queue.h
index 696b8e2997..2515eb4a98 100644
--- a/core/message_queue.h
+++ b/core/message_queue.h
@@ -72,6 +72,8 @@ class MessageQueue {
static MessageQueue *singleton;
+ bool flushing;
+
public:
static MessageQueue *get_singleton();
@@ -87,6 +89,8 @@ public:
void statistics();
void flush();
+ bool is_flushing() const;
+
int get_max_buffer_usage() const;
MessageQueue();
diff --git a/drivers/gles2/rasterizer_canvas_gles2.cpp b/drivers/gles2/rasterizer_canvas_gles2.cpp
index d54d6e9eee..daa547252f 100644
--- a/drivers/gles2/rasterizer_canvas_gles2.cpp
+++ b/drivers/gles2/rasterizer_canvas_gles2.cpp
@@ -456,7 +456,8 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
glDisableVertexAttribArray(VS::ARRAY_COLOR);
glVertexAttrib4fv(VS::ARRAY_COLOR, r->modulate.components);
-#if 1
+//use a more compatible workaround, as this does not fail on nvidia
+#ifdef GLES_OVER_GL
//more compatible
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp
index d2378f33ed..5fdc725f50 100644
--- a/editor/progress_dialog.cpp
+++ b/editor/progress_dialog.cpp
@@ -166,6 +166,11 @@ void ProgressDialog::_popup() {
void ProgressDialog::add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {
+ if (MessageQueue::get_singleton()->is_flushing()) {
+ ERR_PRINT("Do not use progress dialog (task) while flushing the message queue or using call_deferred()!");
+ return;
+ }
+
ERR_FAIL_COND(tasks.has(p_task));
ProgressDialog::Task t;
t.vb = memnew(VBoxContainer);