Revert "[Impeller] iOS/macOS: Only wait for command scheduling prior to present" (#40895)
Reverts flutter/engine#40781
Fixes https://github.com/flutter/flutter/issues/124056
When unmerging threads we appear to get stuck for multiple seconds.
Haven't debugged further, but bisected to this commit.
diff --git a/impeller/renderer/backend/metal/command_buffer_mtl.mm b/impeller/renderer/backend/metal/command_buffer_mtl.mm
index 3c204a2..144ce2c 100644
--- a/impeller/renderer/backend/metal/command_buffer_mtl.mm
+++ b/impeller/renderer/backend/metal/command_buffer_mtl.mm
@@ -167,6 +167,27 @@
[buffer_ commit];
+#if (FML_OS_MACOSX || FML_OS_IOS_SIMULATOR)
+ // We're using waitUntilScheduled on macOS and iOS simulator to force a hard
+ // barrier between the execution of different command buffers. This forces all
+ // renderable texture access to be synchronous (i.e. a write from a previous
+ // command buffer will not get scheduled to happen at the same time as a read
+ // in a future command buffer).
+ //
+ // Metal hazard tracks shared memory resources by default, and we don't need
+ // to do any additional work to synchronize access to MTLTextures and
+ // MTLBuffers on iOS devices with UMA. However, shared textures are disallowed
+ // on macOS according to the documentation:
+ // https://developer.apple.com/documentation/metal/mtlstoragemode/shared
+ // And so this is a stopgap solution that has been present in Impeller since
+ // multi-pass rendering/SaveLayer support was first set up.
+ //
+ // TODO(bdero): Remove this for all targets once a solution for resource
+ // tracking that works everywhere is established:
+ // https://github.com/flutter/flutter/issues/120406
+ [buffer_ waitUntilScheduled];
+#endif
+
buffer_ = nil;
return true;
}
diff --git a/impeller/renderer/backend/metal/context_mtl.h b/impeller/renderer/backend/metal/context_mtl.h
index b266b1c..26ba5ac 100644
--- a/impeller/renderer/backend/metal/context_mtl.h
+++ b/impeller/renderer/backend/metal/context_mtl.h
@@ -64,8 +64,6 @@
// |Context|
bool UpdateOffscreenLayerPixelFormat(PixelFormat format) override;
- id<MTLCommandBuffer> CreateMTLCommandBuffer() const;
-
private:
id<MTLDevice> device_ = nullptr;
id<MTLCommandQueue> command_queue_ = nullptr;
diff --git a/impeller/renderer/backend/metal/context_mtl.mm b/impeller/renderer/backend/metal/context_mtl.mm
index fb1215f..f72d316 100644
--- a/impeller/renderer/backend/metal/context_mtl.mm
+++ b/impeller/renderer/backend/metal/context_mtl.mm
@@ -291,8 +291,4 @@
return true;
}
-id<MTLCommandBuffer> ContextMTL::CreateMTLCommandBuffer() const {
- return [command_queue_ commandBuffer];
-}
-
} // namespace impeller
diff --git a/impeller/renderer/backend/metal/surface_mtl.h b/impeller/renderer/backend/metal/surface_mtl.h
index 157e4e6..e641dd6 100644
--- a/impeller/renderer/backend/metal/surface_mtl.h
+++ b/impeller/renderer/backend/metal/surface_mtl.h
@@ -43,12 +43,9 @@
id<MTLDrawable> drawable() const { return drawable_; }
private:
- std::weak_ptr<Context> context_;
id<MTLDrawable> drawable_ = nil;
- SurfaceMTL(const std::weak_ptr<Context>& context,
- const RenderTarget& target,
- id<MTLDrawable> drawable);
+ SurfaceMTL(const RenderTarget& target, id<MTLDrawable> drawable);
// |Surface|
bool Present() const override;
diff --git a/impeller/renderer/backend/metal/surface_mtl.mm b/impeller/renderer/backend/metal/surface_mtl.mm
index d2de660..dccdac1 100644
--- a/impeller/renderer/backend/metal/surface_mtl.mm
+++ b/impeller/renderer/backend/metal/surface_mtl.mm
@@ -6,7 +6,6 @@
#include "flutter/fml/trace_event.h"
#include "impeller/base/validation.h"
-#include "impeller/renderer/backend/metal/context_mtl.h"
#include "impeller/renderer/backend/metal/formats_mtl.h"
#include "impeller/renderer/backend/metal/texture_mtl.h"
#include "impeller/renderer/render_target.h"
@@ -112,14 +111,12 @@
render_target_desc.SetStencilAttachment(stencil0);
// The constructor is private. So make_unique may not be used.
- return std::unique_ptr<SurfaceMTL>(new SurfaceMTL(
- context->weak_from_this(), render_target_desc, current_drawable));
+ return std::unique_ptr<SurfaceMTL>(
+ new SurfaceMTL(render_target_desc, current_drawable));
}
-SurfaceMTL::SurfaceMTL(const std::weak_ptr<Context>& context,
- const RenderTarget& target,
- id<MTLDrawable> drawable)
- : Surface(target), context_(context), drawable_(drawable) {}
+SurfaceMTL::SurfaceMTL(const RenderTarget& target, id<MTLDrawable> drawable)
+ : Surface(target), drawable_(drawable) {}
// |Surface|
SurfaceMTL::~SurfaceMTL() = default;
@@ -130,16 +127,7 @@
return false;
}
- auto context = context_.lock();
- if (!context) {
- return false;
- }
-
- id<MTLCommandBuffer> command_buffer =
- ContextMTL::Cast(context.get())->CreateMTLCommandBuffer();
- [command_buffer presentDrawable:drawable_];
- [command_buffer commit];
-
+ [drawable_ present];
return true;
}
#pragma GCC diagnostic pop