From 03ebeea97e7a0ed74210ce2ad2c804b624f9b34d Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 13 Dec 2021 18:59:47 -0800 Subject: [PATCH 1/2] Revert "Fix eglPresentationTimeANDROID is no effective (#30182)" This reverts commit 5502a0ad57b72252c1a23b7f6de2d61543f1ff73. --- shell/platform/android/android_environment_gl.cc | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/shell/platform/android/android_environment_gl.cc b/shell/platform/android/android_environment_gl.cc index e84ee88d56d8f..cd04e9afe1d00 100644 --- a/shell/platform/android/android_environment_gl.cc +++ b/shell/platform/android/android_environment_gl.cc @@ -20,24 +20,11 @@ AndroidEnvironmentGL::AndroidEnvironmentGL() return; } - // See if we can use the EGL_ANDROID_presentation_time extension. This - // extension may be available from API18 onward. - // If this extension is available, it will be invoked with the target vsync - // for the current frame before calling eglSwapBuffers. This helps when the - // engine over-stuffs the buffer queue. This can happen when a frame goes over - // budget into the next vsync period, and a subsequent frame is quickly - // submitted in the same vsync period. Dequeuing buffers will then be slow - // until the engine stops submitting frames and lets the GPU catch up. - // However, using this extension means the SurfaceFlinger will only use the - // newest buffer for the current vsync, and the GPU and CPU will stay more - // in sync. - // See https://developer.android.com/games/sdk/frame-pacing for more - // details and diagrams. auto* extensions = eglQueryString(display_, EGL_EXTENSIONS); if (strstr(extensions, "EGL_ANDROID_presentation_time")) { presentation_time_proc_ = reinterpret_cast( - eglGetProcAddress("eglPresentationTimeANDROID")); + eglGetProcAddress("sEGL_ANDROID_presentation_time")); } valid_ = true; From 8c5a7c2eafecd3d1600eb448ca5350545a0d8415 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 13 Dec 2021 19:16:06 -0800 Subject: [PATCH 2/2] Revert "Use eglPresentationTimeANDROID to avoid bogging down the GPU (#29727)" This reverts commit 88948dee0733f2a49dfea52e208a9ba200c6ba6a. --- flow/surface_frame.h | 7 -- shell/common/rasterizer.cc | 90 +++++++++---------- shell/common/shell_test_platform_view_gl.cc | 3 +- shell/common/shell_test_platform_view_gl.h | 2 +- shell/gpu/gpu_surface_gl.cc | 9 +- shell/gpu/gpu_surface_gl.h | 3 +- shell/gpu/gpu_surface_gl_delegate.h | 3 +- shell/platform/android/BUILD.gn | 1 - shell/platform/android/android_context_gl.cc | 40 ++++----- shell/platform/android/android_context_gl.h | 14 +-- .../android/android_context_gl_unittests.cc | 39 -------- .../android/android_environment_gl.cc | 15 ---- .../platform/android/android_environment_gl.h | 31 ++----- shell/platform/android/android_surface_gl.cc | 10 ++- shell/platform/android/android_surface_gl.h | 2 +- .../android/surface/android_surface_mock.cc | 3 +- .../android/surface/android_surface_mock.h | 2 +- shell/platform/darwin/ios/ios_surface_gl.h | 2 +- shell/platform/darwin/ios/ios_surface_gl.mm | 2 +- .../platform/embedder/embedder_surface_gl.cc | 3 +- shell/platform/embedder/embedder_surface_gl.h | 2 +- 21 files changed, 96 insertions(+), 187 deletions(-) diff --git a/flow/surface_frame.h b/flow/surface_frame.h index 9ecac8b3d2fcc..0e15cde4908e7 100644 --- a/flow/surface_frame.h +++ b/flow/surface_frame.h @@ -10,7 +10,6 @@ #include "flutter/common/graphics/gl_context_switch.h" #include "flutter/fml/macros.h" -#include "flutter/fml/time/time_point.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkSurface.h" @@ -67,12 +66,6 @@ class SurfaceFrame { // // Corresponds to EGL_KHR_partial_update std::optional buffer_damage; - - // The vsync target time. - // - // Backends may use this information to avoid overloading the GPU with - // multiple frames per vsync. - fml::TimePoint target_time; }; bool Submit(); diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc index e52a814fb8acd..ad5644c45f986 100644 --- a/shell/common/rasterizer.cc +++ b/shell/common/rasterizer.cc @@ -548,60 +548,60 @@ RasterStatus Rasterizer::DrawToSurfaceUnsafe( .supports_readback, // surface supports pixel reads raster_thread_merger_ // thread merger ); - if (!compositor_frame) { - return RasterStatus::kFailed; - } + if (compositor_frame) { + compositor_context_->raster_cache().PrepareNewFrame(); + frame_timings_recorder.RecordRasterStart(fml::TimePoint::Now()); + + // Disable partial repaint if external_view_embedder_ SubmitFrame is + // involved - ExternalViewEmbedder unconditionally clears the entire + // surface and also partial repaint with platform view present is something + // that still need to be figured out. + bool disable_partial_repaint = + external_view_embedder_ && + (!raster_thread_merger_ || raster_thread_merger_->IsMerged()); + + FrameDamage damage; + if (!disable_partial_repaint && frame->framebuffer_info().existing_damage) { + damage.SetPreviousLayerTree(last_layer_tree_.get()); + damage.AddAdditonalDamage(*frame->framebuffer_info().existing_damage); + } - compositor_context_->raster_cache().PrepareNewFrame(); - frame_timings_recorder.RecordRasterStart(fml::TimePoint::Now()); + RasterStatus raster_status = + compositor_frame->Raster(layer_tree, false, &damage); + if (raster_status == RasterStatus::kFailed || + raster_status == RasterStatus::kSkipAndRetry) { + return raster_status; + } - // Disable partial repaint if external_view_embedder_ SubmitFrame is - // involved - ExternalViewEmbedder unconditionally clears the entire - // surface and also partial repaint with platform view present is something - // that still need to be figured out. - bool disable_partial_repaint = - external_view_embedder_ && - (!raster_thread_merger_ || raster_thread_merger_->IsMerged()); + SurfaceFrame::SubmitInfo submit_info; + submit_info.frame_damage = damage.GetFrameDamage(); + submit_info.buffer_damage = damage.GetBufferDamage(); - FrameDamage damage; - if (!disable_partial_repaint && frame->framebuffer_info().existing_damage) { - damage.SetPreviousLayerTree(last_layer_tree_.get()); - damage.AddAdditonalDamage(*frame->framebuffer_info().existing_damage); - } - - RasterStatus raster_status = - compositor_frame->Raster(layer_tree, false, &damage); - if (raster_status == RasterStatus::kFailed || - raster_status == RasterStatus::kSkipAndRetry) { - return raster_status; - } + frame->set_submit_info(submit_info); - SurfaceFrame::SubmitInfo submit_info; - submit_info.frame_damage = damage.GetFrameDamage(); - submit_info.buffer_damage = damage.GetBufferDamage(); - submit_info.target_time = frame_timings_recorder.GetVsyncTargetTime(); - - frame->set_submit_info(submit_info); + if (external_view_embedder_ && + (!raster_thread_merger_ || raster_thread_merger_->IsMerged())) { + FML_DCHECK(!frame->IsSubmitted()); + external_view_embedder_->SubmitFrame(surface_->GetContext(), + std::move(frame)); + } else { + frame->Submit(); + } - if (external_view_embedder_ && - (!raster_thread_merger_ || raster_thread_merger_->IsMerged())) { - FML_DCHECK(!frame->IsSubmitted()); - external_view_embedder_->SubmitFrame(surface_->GetContext(), - std::move(frame)); - } else { - frame->Submit(); - } + compositor_context_->raster_cache().CleanupAfterFrame(); + frame_timings_recorder.RecordRasterEnd( + &compositor_context_->raster_cache()); + FireNextFrameCallbackIfPresent(); - compositor_context_->raster_cache().CleanupAfterFrame(); - frame_timings_recorder.RecordRasterEnd(&compositor_context_->raster_cache()); - FireNextFrameCallbackIfPresent(); + if (surface_->GetContext()) { + TRACE_EVENT0("flutter", "PerformDeferredSkiaCleanup"); + surface_->GetContext()->performDeferredCleanup(kSkiaCleanupExpiration); + } - if (surface_->GetContext()) { - TRACE_EVENT0("flutter", "PerformDeferredSkiaCleanup"); - surface_->GetContext()->performDeferredCleanup(kSkiaCleanupExpiration); + return raster_status; } - return raster_status; + return RasterStatus::kFailed; } static sk_sp ScreenshotLayerTreeAsPicture( diff --git a/shell/common/shell_test_platform_view_gl.cc b/shell/common/shell_test_platform_view_gl.cc index f43042c29a8c1..8717991c10a06 100644 --- a/shell/common/shell_test_platform_view_gl.cc +++ b/shell/common/shell_test_platform_view_gl.cc @@ -63,8 +63,7 @@ bool ShellTestPlatformViewGL::GLContextClearCurrent() { } // |GPUSurfaceGLDelegate| -bool ShellTestPlatformViewGL::GLContextPresent(fml::TimePoint target_time, - uint32_t fbo_id) { +bool ShellTestPlatformViewGL::GLContextPresent(uint32_t fbo_id) { return gl_surface_.Present(); } diff --git a/shell/common/shell_test_platform_view_gl.h b/shell/common/shell_test_platform_view_gl.h index 51d52ab9a8246..d072dd9731b9c 100644 --- a/shell/common/shell_test_platform_view_gl.h +++ b/shell/common/shell_test_platform_view_gl.h @@ -58,7 +58,7 @@ class ShellTestPlatformViewGL : public ShellTestPlatformView, bool GLContextClearCurrent() override; // |GPUSurfaceGLDelegate| - bool GLContextPresent(fml::TimePoint target_time, uint32_t fbo_id) override; + bool GLContextPresent(uint32_t fbo_id) override; // |GPUSurfaceGLDelegate| intptr_t GLContextFBO(GLFrameInfo frame_info) const override; diff --git a/shell/gpu/gpu_surface_gl.cc b/shell/gpu/gpu_surface_gl.cc index e1c7d5da7ee68..6e81d0a0ae4f0 100644 --- a/shell/gpu/gpu_surface_gl.cc +++ b/shell/gpu/gpu_surface_gl.cc @@ -242,9 +242,7 @@ std::unique_ptr GPUSurfaceGL::AcquireFrame(const SkISize& size) { SurfaceFrame::SubmitCallback submit_callback = [weak = weak_factory_.GetWeakPtr()](const SurfaceFrame& surface_frame, SkCanvas* canvas) { - return weak ? weak->PresentSurface( - surface_frame.submit_info().target_time, canvas) - : false; + return weak ? weak->PresentSurface(canvas) : false; }; framebuffer_info = delegate_->GLContextFramebufferInfo(); @@ -253,8 +251,7 @@ std::unique_ptr GPUSurfaceGL::AcquireFrame(const SkISize& size) { std::move(context_switch)); } -bool GPUSurfaceGL::PresentSurface(fml::TimePoint target_time, - SkCanvas* canvas) { +bool GPUSurfaceGL::PresentSurface(SkCanvas* canvas) { if (delegate_ == nullptr || canvas == nullptr || context_ == nullptr) { return false; } @@ -264,7 +261,7 @@ bool GPUSurfaceGL::PresentSurface(fml::TimePoint target_time, onscreen_surface_->getCanvas()->flush(); } - if (!delegate_->GLContextPresent(target_time, fbo_id_)) { + if (!delegate_->GLContextPresent(fbo_id_)) { return false; } diff --git a/shell/gpu/gpu_surface_gl.h b/shell/gpu/gpu_surface_gl.h index af230a096d549..fd641149decec 100644 --- a/shell/gpu/gpu_surface_gl.h +++ b/shell/gpu/gpu_surface_gl.h @@ -60,7 +60,7 @@ class GPUSurfaceGL : public Surface { const SkISize& untransformed_size, const SkMatrix& root_surface_transformation); - bool PresentSurface(fml::TimePoint target_time, SkCanvas* canvas); + bool PresentSurface(SkCanvas* canvas); GPUSurfaceGLDelegate* delegate_; sk_sp context_; @@ -77,7 +77,6 @@ class GPUSurfaceGL : public Surface { // WeakPtrFactory must be the last member. fml::TaskRunnerAffineWeakPtrFactory weak_factory_; - FML_DISALLOW_COPY_AND_ASSIGN(GPUSurfaceGL); }; diff --git a/shell/gpu/gpu_surface_gl_delegate.h b/shell/gpu/gpu_surface_gl_delegate.h index 864126dafc192..58a600347feb6 100644 --- a/shell/gpu/gpu_surface_gl_delegate.h +++ b/shell/gpu/gpu_surface_gl_delegate.h @@ -33,8 +33,7 @@ class GPUSurfaceGLDelegate { // Called to present the main GL surface. This is only called for the main GL // context and not any of the contexts dedicated for IO. - virtual bool GLContextPresent(fml::TimePoint target_time, - uint32_t fbo_id) = 0; + virtual bool GLContextPresent(uint32_t fbo_id) = 0; // The ID of the main window bound framebuffer. Typically FBO0. virtual intptr_t GLContextFBO(GLFrameInfo frame_info) const = 0; diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index fa1b3fb948a80..ac44391e0d85a 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -46,7 +46,6 @@ executable("flutter_shell_native_unittests") { public_configs = [ "//flutter:config" ] deps = [ ":flutter_shell_native_src", - "//flutter/fml", "//third_party/googletest:gmock", "//third_party/googletest:gtest", ] diff --git a/shell/platform/android/android_context_gl.cc b/shell/platform/android/android_context_gl.cc index 3c1f204f27400..42ab9cd656dba 100644 --- a/shell/platform/android/android_context_gl.cc +++ b/shell/platform/android/android_context_gl.cc @@ -8,7 +8,6 @@ #include -#include "android_environment_gl.h" #include "flutter/fml/trace_event.h" namespace flutter { @@ -106,14 +105,13 @@ static bool TeardownContext(EGLDisplay display, EGLContext context) { return true; } -AndroidEGLSurface::AndroidEGLSurface( - EGLSurface surface, - fml::RefPtr environment, - EGLContext context) - : surface_(surface), environment_(environment), context_(context) {} +AndroidEGLSurface::AndroidEGLSurface(EGLSurface surface, + EGLDisplay display, + EGLContext context) + : surface_(surface), display_(display), context_(context) {} AndroidEGLSurface::~AndroidEGLSurface() { - auto result = eglDestroySurface(environment_->Display(), surface_); + auto result = eglDestroySurface(display_, surface_); FML_DCHECK(result == EGL_TRUE); } @@ -122,8 +120,7 @@ bool AndroidEGLSurface::IsValid() const { } bool AndroidEGLSurface::MakeCurrent() const { - if (eglMakeCurrent(environment_->Display(), surface_, surface_, context_) != - EGL_TRUE) { + if (eglMakeCurrent(display_, surface_, surface_, context_) != EGL_TRUE) { FML_LOG(ERROR) << "Could not make the context current"; LogLastEGLError(); return false; @@ -131,19 +128,17 @@ bool AndroidEGLSurface::MakeCurrent() const { return true; } -bool AndroidEGLSurface::SwapBuffers(fml::TimePoint target_time) { +bool AndroidEGLSurface::SwapBuffers() { TRACE_EVENT0("flutter", "AndroidContextGL::SwapBuffers"); - environment_->SetPresentationTime(surface_, target_time); - return eglSwapBuffers(environment_->Display(), surface_); + return eglSwapBuffers(display_, surface_); } SkISize AndroidEGLSurface::GetSize() const { EGLint width = 0; EGLint height = 0; - if (!eglQuerySurface(environment_->Display(), surface_, EGL_WIDTH, &width) || - !eglQuerySurface(environment_->Display(), surface_, EGL_HEIGHT, - &height)) { + if (!eglQuerySurface(display_, surface_, EGL_WIDTH, &width) || + !eglQuerySurface(display_, surface_, EGL_HEIGHT, &height)) { FML_LOG(ERROR) << "Unable to query EGL surface size"; LogLastEGLError(); return SkISize::Make(0, 0); @@ -234,12 +229,14 @@ std::unique_ptr AndroidContextGL::CreateOnscreenSurface( if (window->IsFakeWindow()) { return CreatePbufferSurface(); } else { + EGLDisplay display = environment_->Display(); + const EGLint attribs[] = {EGL_NONE}; EGLSurface surface = eglCreateWindowSurface( - environment_->Display(), config_, + display, config_, reinterpret_cast(window->handle()), attribs); - return std::make_unique(surface, environment_, context_); + return std::make_unique(surface, display, context_); } } @@ -247,11 +244,12 @@ std::unique_ptr AndroidContextGL::CreateOffscreenSurface() const { // We only ever create pbuffer surfaces for background resource loading // contexts. We never bind the pbuffer to anything. + EGLDisplay display = environment_->Display(); + const EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE}; - EGLSurface surface = - eglCreatePbufferSurface(environment_->Display(), config_, attribs); - return std::make_unique(surface, environment_, + EGLSurface surface = eglCreatePbufferSurface(display, config_, attribs); + return std::make_unique(surface, display, resource_context_); } @@ -262,7 +260,7 @@ std::unique_ptr AndroidContextGL::CreatePbufferSurface() const EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE}; EGLSurface surface = eglCreatePbufferSurface(display, config_, attribs); - return std::make_unique(surface, environment_, context_); + return std::make_unique(surface, display, context_); } fml::RefPtr AndroidContextGL::Environment() const { diff --git a/shell/platform/android/android_context_gl.h b/shell/platform/android/android_context_gl.h index 691548dd01f6e..08668e488ca4d 100644 --- a/shell/platform/android/android_context_gl.h +++ b/shell/platform/android/android_context_gl.h @@ -5,10 +5,6 @@ #ifndef FLUTTER_SHELL_PLATFORM_ANDROID_ANDROID_CONTEXT_GL_H_ #define FLUTTER_SHELL_PLATFORM_ANDROID_ANDROID_CONTEXT_GL_H_ -#include -#define EGL_EGLEXT_PROTOTYPES -#include - #include "flutter/fml/macros.h" #include "flutter/fml/memory/ref_counted.h" #include "flutter/fml/memory/ref_ptr.h" @@ -29,9 +25,7 @@ namespace flutter { /// class AndroidEGLSurface { public: - AndroidEGLSurface(EGLSurface surface, - fml::RefPtr environment, - EGLContext context); + AndroidEGLSurface(EGLSurface surface, EGLDisplay display, EGLContext context); ~AndroidEGLSurface(); //---------------------------------------------------------------------------- @@ -53,11 +47,9 @@ class AndroidEGLSurface { /// @brief This only applies to on-screen surfaces such as those created /// by `AndroidContextGL::CreateOnscreenSurface`. /// - /// @param target_time The vsync target time for the buffer. - /// /// @return Whether the EGL surface color buffer was swapped. /// - bool SwapBuffers(fml::TimePoint target_time); + bool SwapBuffers(); //---------------------------------------------------------------------------- /// @return The size of an `EGLSurface`. @@ -66,7 +58,7 @@ class AndroidEGLSurface { private: const EGLSurface surface_; - const fml::RefPtr environment_; + const EGLDisplay display_; const EGLContext context_; }; diff --git a/shell/platform/android/android_context_gl_unittests.cc b/shell/platform/android/android_context_gl_unittests.cc index a8b32e5f2331c..2278acd6b37eb 100644 --- a/shell/platform/android/android_context_gl_unittests.cc +++ b/shell/platform/android/android_context_gl_unittests.cc @@ -1,7 +1,5 @@ #define FML_USED_ON_EMBEDDER -#include "android_environment_gl.h" - #include #include "flutter/shell/common/thread_host.h" #include "flutter/shell/platform/android/android_context_gl.h" @@ -25,22 +23,6 @@ TaskRunners MakeTaskRunners(const std::string& thread_label, } } // namespace -class InterceptingAndroidEnvironmentGL : public AndroidEnvironmentGL { - public: - InterceptingAndroidEnvironmentGL() = default; - ~InterceptingAndroidEnvironmentGL() override = default; - - bool SetPresentationTime(EGLSurface surface, - fml::TimePoint time) const override { - presentation_time_ = time; - return AndroidEnvironmentGL::SetPresentationTime(surface, time); - } - - mutable std::optional presentation_time_; - - FML_DISALLOW_COPY_AND_ASSIGN(InterceptingAndroidEnvironmentGL); -}; - TEST(AndroidContextGl, Create) { GrMockOptions main_context_options; sk_sp main_context = @@ -80,27 +62,6 @@ TEST(AndroidContextGl, CreateSingleThread) { context.reset(); EXPECT_TRUE(main_context->abandoned()); } - -TEST(AndroidEGLSurface, SwapBuffersNotifiesAboutPresentationTime) { - auto environment = fml::MakeRefCounted(); - std::string thread_label = - ::testing::UnitTest::GetInstance()->current_test_info()->name(); - fml::MessageLoop::EnsureInitializedForCurrentThread(); - fml::RefPtr platform_runner = - fml::MessageLoop::GetCurrent().GetTaskRunner(); - TaskRunners task_runners = - TaskRunners(thread_label, platform_runner, platform_runner, - platform_runner, platform_runner); - auto context = std::make_unique( - AndroidRenderingAPI::kOpenGLES, environment, task_runners); - - auto surface = context->CreatePbufferSurface(); - EXPECT_TRUE(surface); - EXPECT_FALSE(environment->presentation_time_.has_value()); - auto now = fml::TimePoint::Now(); - surface->SwapBuffers(now); - EXPECT_EQ(environment->presentation_time_, now); -} } // namespace android } // namespace testing } // namespace flutter diff --git a/shell/platform/android/android_environment_gl.cc b/shell/platform/android/android_environment_gl.cc index cd04e9afe1d00..f384ee2d0835d 100644 --- a/shell/platform/android/android_environment_gl.cc +++ b/shell/platform/android/android_environment_gl.cc @@ -20,13 +20,6 @@ AndroidEnvironmentGL::AndroidEnvironmentGL() return; } - auto* extensions = eglQueryString(display_, EGL_EXTENSIONS); - if (strstr(extensions, "EGL_ANDROID_presentation_time")) { - presentation_time_proc_ = - reinterpret_cast( - eglGetProcAddress("sEGL_ANDROID_presentation_time")); - } - valid_ = true; } @@ -45,12 +38,4 @@ EGLDisplay AndroidEnvironmentGL::Display() const { return display_; } -bool AndroidEnvironmentGL::SetPresentationTime(EGLSurface surface, - fml::TimePoint time) const { - if (!presentation_time_proc_) { - return false; - } - return presentation_time_proc_(display_, surface, - time.ToEpochDelta().ToNanoseconds()); -} } // namespace flutter diff --git a/shell/platform/android/android_environment_gl.h b/shell/platform/android/android_environment_gl.h index a8210c93a8d78..23031a775d390 100644 --- a/shell/platform/android/android_environment_gl.h +++ b/shell/platform/android/android_environment_gl.h @@ -7,44 +7,29 @@ #include "flutter/fml/macros.h" #include "flutter/fml/memory/ref_counted.h" -#include "flutter/fml/time/time_delta.h" -#include "flutter/fml/time/time_point.h" #include -#include -#include namespace flutter { -namespace testing::android { -class InterceptingAndroidEnvironmentGL; -} + class AndroidEnvironmentGL : public fml::RefCountedThreadSafe { + private: + // MakeRefCounted + AndroidEnvironmentGL(); + + // MakeRefCounted + ~AndroidEnvironmentGL(); + public: bool IsValid() const; EGLDisplay Display() const; - // Sets the presentation time for the surface. - // - // Returns false if there was a GL error or if eglPresentationTimeANDROID is - // unavailable. - virtual bool SetPresentationTime(EGLSurface surface, - fml::TimePoint time) const; - - protected: - // MakeRefCounted - AndroidEnvironmentGL(); - // MakeRefCounted - virtual ~AndroidEnvironmentGL(); - private: - PFNEGLPRESENTATIONTIMEANDROIDPROC presentation_time_proc_; EGLDisplay display_; bool valid_; - friend class InterceptingAndroidEnvironmentGL; - FML_FRIEND_MAKE_REF_COUNTED(AndroidEnvironmentGL); FML_FRIEND_REF_COUNTED_THREAD_SAFE(AndroidEnvironmentGL); FML_DISALLOW_COPY_AND_ASSIGN(AndroidEnvironmentGL); diff --git a/shell/platform/android/android_surface_gl.cc b/shell/platform/android/android_surface_gl.cc index 1d97a0561e308..224b2280d22e2 100644 --- a/shell/platform/android/android_surface_gl.cc +++ b/shell/platform/android/android_surface_gl.cc @@ -102,6 +102,10 @@ bool AndroidSurfaceGL::SetNativeWindow( FML_DCHECK(IsValid()); FML_DCHECK(window); native_window_ = window; + // Ensure the destructor is called since it destroys the `EGLSurface` before + // creating a new onscreen surface. + onscreen_surface_ = nullptr; + // Create the onscreen surface. onscreen_surface_ = GLContextPtr()->CreateOnscreenSurface(window); if (!onscreen_surface_->IsValid()) { return false; @@ -122,11 +126,10 @@ bool AndroidSurfaceGL::GLContextClearCurrent() { return GLContextPtr()->ClearCurrent(); } -bool AndroidSurfaceGL::GLContextPresent(fml::TimePoint target_time, - uint32_t fbo_id) { +bool AndroidSurfaceGL::GLContextPresent(uint32_t fbo_id) { FML_DCHECK(IsValid()); FML_DCHECK(onscreen_surface_); - return onscreen_surface_->SwapBuffers(target_time); + return onscreen_surface_->SwapBuffers(); } intptr_t AndroidSurfaceGL::GLContextFBO(GLFrameInfo frame_info) const { @@ -164,6 +167,7 @@ sk_sp AndroidSurfaceGL::GetGLInterface() const { FML_DCHECK(result == EGL_TRUE); } } + return GPUSurfaceGLDelegate::GetGLInterface(); } diff --git a/shell/platform/android/android_surface_gl.h b/shell/platform/android/android_surface_gl.h index 3b569845bcf3b..31ea82727bf52 100644 --- a/shell/platform/android/android_surface_gl.h +++ b/shell/platform/android/android_surface_gl.h @@ -58,7 +58,7 @@ class AndroidSurfaceGL final : public GPUSurfaceGLDelegate, bool GLContextClearCurrent() override; // |GPUSurfaceGLDelegate| - bool GLContextPresent(fml::TimePoint target_time, uint32_t fbo_id) override; + bool GLContextPresent(uint32_t fbo_id) override; // |GPUSurfaceGLDelegate| intptr_t GLContextFBO(GLFrameInfo frame_info) const override; diff --git a/shell/platform/android/surface/android_surface_mock.cc b/shell/platform/android/surface/android_surface_mock.cc index f06e911e31ef6..a0b08cb4892d6 100644 --- a/shell/platform/android/surface/android_surface_mock.cc +++ b/shell/platform/android/surface/android_surface_mock.cc @@ -18,8 +18,7 @@ bool AndroidSurfaceMock::GLContextClearCurrent() { return true; } -bool AndroidSurfaceMock::GLContextPresent(fml::TimePoint target_time, - uint32_t fbo_id) { +bool AndroidSurfaceMock::GLContextPresent(uint32_t fbo_id) { return true; } diff --git a/shell/platform/android/surface/android_surface_mock.h b/shell/platform/android/surface/android_surface_mock.h index ba26067a7256b..f710133f64c5d 100644 --- a/shell/platform/android/surface/android_surface_mock.h +++ b/shell/platform/android/surface/android_surface_mock.h @@ -48,7 +48,7 @@ class AndroidSurfaceMock final : public GPUSurfaceGLDelegate, bool GLContextClearCurrent() override; // |GPUSurfaceGLDelegate| - bool GLContextPresent(fml::TimePoint target_time, uint32_t fbo_id) override; + bool GLContextPresent(uint32_t fbo_id) override; // |GPUSurfaceGLDelegate| intptr_t GLContextFBO(GLFrameInfo frame_info) const override; diff --git a/shell/platform/darwin/ios/ios_surface_gl.h b/shell/platform/darwin/ios/ios_surface_gl.h index 8878d824fe3b8..54a0584a7e0af 100644 --- a/shell/platform/darwin/ios/ios_surface_gl.h +++ b/shell/platform/darwin/ios/ios_surface_gl.h @@ -38,7 +38,7 @@ class IOSSurfaceGL final : public IOSSurface, public GPUSurfaceGLDelegate { bool GLContextClearCurrent() override; // |GPUSurfaceGLDelegate| - bool GLContextPresent(fml::TimePoint target_time, uint32_t fbo_id) override; + bool GLContextPresent(uint32_t fbo_id) override; // |GPUSurfaceGLDelegate| intptr_t GLContextFBO(GLFrameInfo frame_info) const override; diff --git a/shell/platform/darwin/ios/ios_surface_gl.mm b/shell/platform/darwin/ios/ios_surface_gl.mm index 93223e91af37e..9b6bb6a99aa1e 100644 --- a/shell/platform/darwin/ios/ios_surface_gl.mm +++ b/shell/platform/darwin/ios/ios_surface_gl.mm @@ -86,7 +86,7 @@ } // |GPUSurfaceGLDelegate| -bool IOSSurfaceGL::GLContextPresent(fml::TimePoint target_time, uint32_t fbo_id) { +bool IOSSurfaceGL::GLContextPresent(uint32_t fbo_id) { TRACE_EVENT0("flutter", "IOSSurfaceGL::GLContextPresent"); return IsValid() && render_target_->PresentRenderBuffer(); } diff --git a/shell/platform/embedder/embedder_surface_gl.cc b/shell/platform/embedder/embedder_surface_gl.cc index 0d2c8d883e101..69c75cb2e7462 100644 --- a/shell/platform/embedder/embedder_surface_gl.cc +++ b/shell/platform/embedder/embedder_surface_gl.cc @@ -45,8 +45,7 @@ bool EmbedderSurfaceGL::GLContextClearCurrent() { } // |GPUSurfaceGLDelegate| -bool EmbedderSurfaceGL::GLContextPresent(fml::TimePoint target_time, - uint32_t fbo_id) { +bool EmbedderSurfaceGL::GLContextPresent(uint32_t fbo_id) { return gl_dispatch_table_.gl_present_callback(fbo_id); } diff --git a/shell/platform/embedder/embedder_surface_gl.h b/shell/platform/embedder/embedder_surface_gl.h index aa3dbdb8d8779..6f07bcce9ef51 100644 --- a/shell/platform/embedder/embedder_surface_gl.h +++ b/shell/platform/embedder/embedder_surface_gl.h @@ -56,7 +56,7 @@ class EmbedderSurfaceGL final : public EmbedderSurface, bool GLContextClearCurrent() override; // |GPUSurfaceGLDelegate| - bool GLContextPresent(fml::TimePoint target_time, uint32_t fbo_id) override; + bool GLContextPresent(uint32_t fbo_id) override; // |GPUSurfaceGLDelegate| intptr_t GLContextFBO(GLFrameInfo frame_info) const override;