summaryrefslogtreecommitdiffstats
path: root/editor/editor_resource_preview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/editor_resource_preview.cpp')
-rw-r--r--editor/editor_resource_preview.cpp33
1 files changed, 30 insertions, 3 deletions
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp
index bae7887c02..94bf15ae66 100644
--- a/editor/editor_resource_preview.cpp
+++ b/editor/editor_resource_preview.cpp
@@ -95,8 +95,35 @@ void EditorResourcePreviewGenerator::_bind_methods() {
EditorResourcePreviewGenerator::EditorResourcePreviewGenerator() {
}
+void EditorResourcePreviewGenerator::DrawRequester::request_and_wait(RID p_viewport) const {
+ if (EditorResourcePreview::get_singleton()->is_threaded()) {
+ Callable request_vp_update_once = callable_mp(RS::get_singleton(), &RS::viewport_set_update_mode).bind(p_viewport, RS::VIEWPORT_UPDATE_ONCE);
+ RS::get_singleton()->connect(SNAME("frame_pre_draw"), request_vp_update_once, Object::CONNECT_ONE_SHOT);
+ RS::get_singleton()->request_frame_drawn_callback(callable_mp(const_cast<EditorResourcePreviewGenerator::DrawRequester *>(this), &EditorResourcePreviewGenerator::DrawRequester::_post_semaphore));
+
+ semaphore.wait();
+ } else {
+ RS::get_singleton()->draw(false);
+ }
+}
+
+void EditorResourcePreviewGenerator::DrawRequester::abort() const {
+ if (EditorResourcePreview::get_singleton()->is_threaded()) {
+ semaphore.post();
+ }
+}
+
+Variant EditorResourcePreviewGenerator::DrawRequester::_post_semaphore() const {
+ semaphore.post();
+ return Variant(); // Needed because of how the callback is used.
+}
+
EditorResourcePreview *EditorResourcePreview::singleton = nullptr;
+bool EditorResourcePreview::is_threaded() const {
+ return RSG::texture_storage->can_create_resources_async();
+}
+
void EditorResourcePreview::_thread_func(void *ud) {
EditorResourcePreview *erp = (EditorResourcePreview *)ud;
erp->_thread();
@@ -324,7 +351,7 @@ void EditorResourcePreview::_iterate() {
_preview_ready(item.path, 0, texture, small_texture, item.id, item.function, item.userdata, preview_metadata);
}
-void EditorResourcePreview::_write_preview_cache(Ref<FileAccess> p_file, int p_thumbnail_size, bool p_has_small_texture, uint64_t p_modified_time, String p_hash, const Dictionary &p_metadata) {
+void EditorResourcePreview::_write_preview_cache(Ref<FileAccess> p_file, int p_thumbnail_size, bool p_has_small_texture, uint64_t p_modified_time, const String &p_hash, const Dictionary &p_metadata) {
p_file->store_line(itos(p_thumbnail_size));
p_file->store_line(itos(p_has_small_texture));
p_file->store_line(itos(p_modified_time));
@@ -470,7 +497,7 @@ void EditorResourcePreview::start() {
return;
}
- if (RSG::texture_storage->can_create_resources_async()) {
+ if (is_threaded()) {
ERR_FAIL_COND_MSG(thread.is_started(), "Thread already started.");
thread.start(_thread_func, this);
} else {
@@ -481,7 +508,7 @@ void EditorResourcePreview::start() {
}
void EditorResourcePreview::stop() {
- if (RSG::texture_storage->can_create_resources_async()) {
+ if (is_threaded()) {
if (thread.is_started()) {
exiting.set();
preview_sem.post();