From 12b9039eb8b3b8c9ac5fba1e21ba3bd22d7c4c32 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 28 Mar 2023 20:42:54 -0700 Subject: [PATCH 1/2] Use NSAutoReleasePool for Metal playgrounds Fixes https://github.com/flutter/flutter/issues/117339 Avoids creating a new parallel ObjC++ TU --- impeller/playground/playground.cc | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/impeller/playground/playground.cc b/impeller/playground/playground.cc index 1f1c5930ff864..692755d61ff6e 100644 --- a/impeller/playground/playground.cc +++ b/impeller/playground/playground.cc @@ -18,18 +18,23 @@ #include "flutter/fml/paths.h" #include "impeller/base/validation.h" +#include "impeller/core/allocator.h" +#include "impeller/core/formats.h" #include "impeller/image/compressed_image.h" #include "impeller/playground/imgui/imgui_impl_impeller.h" #include "impeller/playground/playground.h" #include "impeller/playground/playground_impl.h" -#include "impeller/renderer/allocator.h" #include "impeller/renderer/context.h" -#include "impeller/renderer/formats.h" #include "impeller/renderer/render_pass.h" #include "impeller/renderer/renderer.h" #include "third_party/imgui/backends/imgui_impl_glfw.h" #include "third_party/imgui/imgui.h" +#if FML_OS_MACOSX +#include +#include +#endif + namespace impeller { std::string PlaygroundBackendToString(PlaygroundBackend backend) { @@ -178,6 +183,23 @@ void Playground::SetCursorPosition(Point pos) { cursor_position_ = pos; } +#if FML_OS_MACOSX +class AutoReleasePool { + public: + AutoReleasePool() { + pool_ = reinterpret_cast(objc_msgSend)( + objc_getClass("NSAutoreleasePool"), sel_getUid("new")); + } + ~AutoReleasePool() { + reinterpret_cast(objc_msgSend)(pool_, sel_getUid("drain")); + } + + private: + typedef id (*msg_send)(void*, SEL); + id pool_; +}; +#endif + bool Playground::OpenPlaygroundHere( const Renderer::RenderCallback& render_callback) { if (!is_enabled()) { @@ -239,6 +261,9 @@ bool Playground::OpenPlaygroundHere( ::glfwShowWindow(window); while (true) { +#if FML_OS_MACOSX + AutoReleasePool pool; +#endif ::glfwPollEvents(); if (::glfwWindowShouldClose(window)) { From f9ec3fb2f57c0ad14bad1f298873e30fd30f09a2 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 28 Mar 2023 20:43:42 -0700 Subject: [PATCH 2/2] Update playground.cc --- impeller/playground/playground.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/impeller/playground/playground.cc b/impeller/playground/playground.cc index 692755d61ff6e..3df9001bc753d 100644 --- a/impeller/playground/playground.cc +++ b/impeller/playground/playground.cc @@ -18,13 +18,13 @@ #include "flutter/fml/paths.h" #include "impeller/base/validation.h" -#include "impeller/core/allocator.h" -#include "impeller/core/formats.h" #include "impeller/image/compressed_image.h" #include "impeller/playground/imgui/imgui_impl_impeller.h" #include "impeller/playground/playground.h" #include "impeller/playground/playground_impl.h" +#include "impeller/renderer/allocator.h" #include "impeller/renderer/context.h" +#include "impeller/renderer/formats.h" #include "impeller/renderer/render_pass.h" #include "impeller/renderer/renderer.h" #include "third_party/imgui/backends/imgui_impl_glfw.h"