[CP] Revert "[Windows] Introduce `egl::Surface` and `egl::WindowSurface`" … (#50130)
diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index 9836b81..0ddac7a 100644
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -7241,10 +7241,6 @@
ORIGIN: ../../../flutter/shell/platform/windows/egl/manager.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/windows/egl/proc_table.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/windows/egl/proc_table.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/windows/egl/surface.cc + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/windows/egl/surface.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/windows/egl/window_surface.cc + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/shell/platform/windows/egl/window_surface.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/windows/event_watcher.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/windows/event_watcher.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/windows/external_texture.h + ../../../flutter/LICENSE
@@ -10119,10 +10115,6 @@
FILE: ../../../flutter/shell/platform/windows/egl/manager.h
FILE: ../../../flutter/shell/platform/windows/egl/proc_table.cc
FILE: ../../../flutter/shell/platform/windows/egl/proc_table.h
-FILE: ../../../flutter/shell/platform/windows/egl/surface.cc
-FILE: ../../../flutter/shell/platform/windows/egl/surface.h
-FILE: ../../../flutter/shell/platform/windows/egl/window_surface.cc
-FILE: ../../../flutter/shell/platform/windows/egl/window_surface.h
FILE: ../../../flutter/shell/platform/windows/event_watcher.cc
FILE: ../../../flutter/shell/platform/windows/event_watcher.h
FILE: ../../../flutter/shell/platform/windows/external_texture.h
diff --git a/shell/platform/windows/BUILD.gn b/shell/platform/windows/BUILD.gn
index 7a30f73..bfaa73e 100644
--- a/shell/platform/windows/BUILD.gn
+++ b/shell/platform/windows/BUILD.gn
@@ -59,10 +59,6 @@
"egl/manager.h",
"egl/proc_table.cc",
"egl/proc_table.h",
- "egl/surface.cc",
- "egl/surface.h",
- "egl/window_surface.cc",
- "egl/window_surface.h",
"event_watcher.cc",
"event_watcher.h",
"external_texture.h",
@@ -213,7 +209,6 @@
"testing/egl/mock_context.h",
"testing/egl/mock_manager.h",
"testing/egl/mock_proc_table.h",
- "testing/egl/mock_window_surface.h",
"testing/engine_modifier.h",
"testing/flutter_window_test.cc",
"testing/flutter_window_test.h",
diff --git a/shell/platform/windows/compositor_opengl.cc b/shell/platform/windows/compositor_opengl.cc
index 6d0262d..de203bf 100644
--- a/shell/platform/windows/compositor_opengl.cc
+++ b/shell/platform/windows/compositor_opengl.cc
@@ -97,11 +97,6 @@
return false;
}
- if (!engine_->egl_manager()->surface() ||
- !engine_->egl_manager()->surface()->IsValid()) {
- return false;
- }
-
// Clear the view if there are no layers to present.
if (layers_count == 0) {
// Normally the compositor is initialized when the first backing store is
@@ -133,7 +128,7 @@
return false;
}
- if (!engine_->egl_manager()->surface()->MakeCurrent()) {
+ if (!engine_->egl_manager()->MakeCurrent()) {
return false;
}
@@ -159,7 +154,7 @@
GL_NEAREST // filter
);
- if (!engine_->egl_manager()->surface()->SwapBuffers()) {
+ if (!engine_->egl_manager()->SwapBuffers()) {
return false;
}
@@ -170,7 +165,7 @@
bool CompositorOpenGL::Initialize() {
FML_DCHECK(!is_initialized_);
- if (!engine_->egl_manager()->surface()->MakeCurrent()) {
+ if (!engine_->egl_manager()->MakeCurrent()) {
return false;
}
@@ -191,14 +186,14 @@
// Resize the surface if needed.
engine_->view()->OnEmptyFrameGenerated();
- if (!engine_->egl_manager()->surface()->MakeCurrent()) {
+ if (!engine_->egl_manager()->MakeCurrent()) {
return false;
}
gl_->ClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl_->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- if (!engine_->egl_manager()->surface()->SwapBuffers()) {
+ if (!engine_->egl_manager()->SwapBuffers()) {
return false;
}
diff --git a/shell/platform/windows/compositor_opengl_unittests.cc b/shell/platform/windows/compositor_opengl_unittests.cc
index abb872b..fffdd7e 100644
--- a/shell/platform/windows/compositor_opengl_unittests.cc
+++ b/shell/platform/windows/compositor_opengl_unittests.cc
@@ -10,7 +10,6 @@
#include "flutter/shell/platform/windows/egl/manager.h"
#include "flutter/shell/platform/windows/flutter_windows_view.h"
#include "flutter/shell/platform/windows/testing/egl/mock_manager.h"
-#include "flutter/shell/platform/windows/testing/egl/mock_window_surface.h"
#include "flutter/shell/platform/windows/testing/engine_modifier.h"
#include "flutter/shell/platform/windows/testing/flutter_windows_engine_builder.h"
#include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
@@ -66,14 +65,10 @@
protected:
FlutterWindowsEngine* engine() { return engine_.get(); }
egl::MockManager* egl_manager() { return egl_manager_; }
- egl::MockWindowSurface* surface() { return surface_.get(); }
void UseHeadlessEngine() {
auto egl_manager = std::make_unique<egl::MockManager>();
egl_manager_ = egl_manager.get();
- surface_ = std::make_unique<egl::MockWindowSurface>();
-
- EXPECT_CALL(*egl_manager_, surface).WillRepeatedly(Return(surface_.get()));
FlutterWindowsEngineBuilder builder{GetContext()};
@@ -97,7 +92,6 @@
private:
std::unique_ptr<FlutterWindowsEngine> engine_;
std::unique_ptr<FlutterWindowsView> view_;
- std::unique_ptr<egl::MockWindowSurface> surface_;
egl::MockManager* egl_manager_;
FML_DISALLOW_COPY_AND_ASSIGN(CompositorOpenGLTest);
@@ -113,7 +107,7 @@
FlutterBackingStoreConfig config = {};
FlutterBackingStore backing_store = {};
- EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(true));
+ EXPECT_CALL(*egl_manager(), MakeCurrent).WillOnce(Return(true));
ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
}
@@ -126,7 +120,7 @@
FlutterBackingStoreConfig config = {};
FlutterBackingStore backing_store = {};
- EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(false));
+ EXPECT_CALL(*egl_manager(), MakeCurrent).WillOnce(Return(false));
EXPECT_FALSE(compositor.CreateBackingStore(config, &backing_store));
}
@@ -138,7 +132,7 @@
FlutterBackingStoreConfig config = {};
FlutterBackingStore backing_store = {};
- EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(true));
+ EXPECT_CALL(*egl_manager(), MakeCurrent).WillOnce(Return(true));
ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
FlutterLayer layer = {};
@@ -146,8 +140,8 @@
layer.backing_store = &backing_store;
const FlutterLayer* layer_ptr = &layer;
- EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(true));
- EXPECT_CALL(*surface(), SwapBuffers).WillOnce(Return(true));
+ EXPECT_CALL(*egl_manager(), MakeCurrent).WillOnce(Return(true));
+ EXPECT_CALL(*egl_manager(), SwapBuffers).WillOnce(Return(true));
EXPECT_TRUE(compositor.Present(&layer_ptr, 1));
ASSERT_TRUE(compositor.CollectBackingStore(&backing_store));
@@ -160,8 +154,10 @@
// The context will be bound twice: first to initialize the compositor, second
// to clear the surface.
- EXPECT_CALL(*surface(), MakeCurrent).Times(2).WillRepeatedly(Return(true));
- EXPECT_CALL(*surface(), SwapBuffers).WillOnce(Return(true));
+ EXPECT_CALL(*egl_manager(), MakeCurrent)
+ .Times(2)
+ .WillRepeatedly(Return(true));
+ EXPECT_CALL(*egl_manager(), SwapBuffers).WillOnce(Return(true));
EXPECT_TRUE(compositor.Present(nullptr, 0));
}
@@ -173,7 +169,7 @@
FlutterBackingStoreConfig config = {};
FlutterBackingStore backing_store = {};
- EXPECT_CALL(*surface(), MakeCurrent).WillOnce(Return(true));
+ EXPECT_CALL(*egl_manager(), MakeCurrent).WillOnce(Return(true));
ASSERT_TRUE(compositor.CreateBackingStore(config, &backing_store));
FlutterLayer layer = {};
diff --git a/shell/platform/windows/egl/context.h b/shell/platform/windows/egl/context.h
index acbff12..f3703c8 100644
--- a/shell/platform/windows/egl/context.h
+++ b/shell/platform/windows/egl/context.h
@@ -14,7 +14,7 @@
// An EGL context to interact with OpenGL.
//
-// This enables automatic error logging and mocking.
+// This enables automatic eror logging and mocking.
//
// Flutter Windows uses this to create render and resource contexts.
class Context {
diff --git a/shell/platform/windows/egl/manager.cc b/shell/platform/windows/egl/manager.cc
index 346ea84..406786c 100644
--- a/shell/platform/windows/egl/manager.cc
+++ b/shell/platform/windows/egl/manager.cc
@@ -263,71 +263,92 @@
return is_valid_;
}
-bool Manager::CreateWindowSurface(HWND hwnd, size_t width, size_t height) {
- FML_DCHECK(surface_ == nullptr || !surface_->IsValid());
-
+bool Manager::CreateSurface(HWND hwnd, EGLint width, EGLint height) {
if (!hwnd || !is_valid_) {
return false;
}
+ EGLSurface surface = EGL_NO_SURFACE;
+
// Disable ANGLE's automatic surface resizing and provide an explicit size.
// The surface will need to be destroyed and re-created if the HWND is
// resized.
- const EGLint surface_attributes[] = {EGL_FIXED_SIZE_ANGLE,
- EGL_TRUE,
- EGL_WIDTH,
- static_cast<EGLint>(width),
- EGL_HEIGHT,
- static_cast<EGLint>(height),
- EGL_NONE};
+ const EGLint surface_attributes[] = {
+ EGL_FIXED_SIZE_ANGLE, EGL_TRUE, EGL_WIDTH, width,
+ EGL_HEIGHT, height, EGL_NONE};
- auto const surface = ::eglCreateWindowSurface(
- display_, config_, static_cast<EGLNativeWindowType>(hwnd),
- surface_attributes);
+ surface = ::eglCreateWindowSurface(display_, config_,
+ static_cast<EGLNativeWindowType>(hwnd),
+ surface_attributes);
if (surface == EGL_NO_SURFACE) {
LogEGLError("Surface creation failed.");
return false;
}
- surface_ = std::make_unique<WindowSurface>(
- display_, render_context_->GetHandle(), surface, width, height);
+ surface_width_ = width;
+ surface_height_ = height;
+ surface_ = surface;
return true;
}
-void Manager::ResizeWindowSurface(HWND hwnd, size_t width, size_t height) {
- FML_CHECK(surface_ != nullptr);
-
- auto const existing_width = surface_->width();
- auto const existing_height = surface_->height();
- auto const existing_vsync = surface_->vsync_enabled();
-
+void Manager::ResizeSurface(HWND hwnd,
+ EGLint width,
+ EGLint height,
+ bool vsync_enabled) {
+ EGLint existing_width, existing_height;
+ GetSurfaceDimensions(&existing_width, &existing_height);
if (width != existing_width || height != existing_height) {
+ surface_width_ = width;
+ surface_height_ = height;
+
// TODO: Destroying the surface and re-creating it is expensive.
// Ideally this would use ANGLE's automatic surface sizing instead.
// See: https://github.com/flutter/flutter/issues/79427
- if (!surface_->Destroy()) {
- FML_LOG(ERROR) << "Manager::ResizeSurface failed to destroy surface";
- return;
- }
-
- if (!CreateWindowSurface(hwnd, width, height)) {
+ render_context_->ClearCurrent();
+ DestroySurface();
+ if (!CreateSurface(hwnd, width, height)) {
FML_LOG(ERROR) << "Manager::ResizeSurface failed to create surface";
- return;
- }
-
- if (!surface_->SetVSyncEnabled(existing_vsync)) {
- // Surfaces block until the v-blank by default.
- // Failing to update the vsync might result in unnecessary blocking.
- // This regresses performance but not correctness.
- FML_LOG(ERROR) << "Manager::ResizeSurface failed to set vsync";
}
}
+
+ SetVSyncEnabled(vsync_enabled);
+}
+
+void Manager::GetSurfaceDimensions(EGLint* width, EGLint* height) {
+ if (surface_ == EGL_NO_SURFACE || !is_valid_) {
+ *width = 0;
+ *height = 0;
+ return;
+ }
+
+ // This avoids eglQuerySurface as ideally surfaces would be automatically
+ // sized by ANGLE to avoid expensive surface destroy & re-create. With
+ // automatic sizing, ANGLE could resize the surface before Flutter asks it to,
+ // which would break resize redraw synchronization.
+ *width = surface_width_;
+ *height = surface_height_;
+}
+
+void Manager::DestroySurface() {
+ if (display_ != EGL_NO_DISPLAY && surface_ != EGL_NO_SURFACE) {
+ ::eglDestroySurface(display_, surface_);
+ }
+ surface_ = EGL_NO_SURFACE;
}
bool Manager::HasContextCurrent() {
return ::eglGetCurrentContext() != EGL_NO_CONTEXT;
}
+bool Manager::MakeCurrent() {
+ return (::eglMakeCurrent(display_, surface_, surface_,
+ render_context_->GetHandle()) == EGL_TRUE);
+}
+
+bool Manager::SwapBuffers() {
+ return (::eglSwapBuffers(display_, surface_));
+}
+
EGLSurface Manager::CreateSurfaceFromHandle(EGLenum handle_type,
EGLClientBuffer handle,
const EGLint* attributes) const {
@@ -335,6 +356,23 @@
config_, attributes);
}
+void Manager::SetVSyncEnabled(bool enabled) {
+ if (!MakeCurrent()) {
+ LogEGLError("Unable to make surface current to update the swap interval");
+ return;
+ }
+
+ // OpenGL swap intervals can be used to prevent screen tearing.
+ // If enabled, the raster thread blocks until the v-blank.
+ // This is unnecessary if DWM composition is enabled.
+ // See: https://www.khronos.org/opengl/wiki/Swap_Interval
+ // See: https://learn.microsoft.com/windows/win32/dwm/composition-ovw
+ if (::eglSwapInterval(display_, enabled ? 1 : 0) != EGL_TRUE) {
+ LogEGLError("Unable to update the swap interval");
+ return;
+ }
+}
+
bool Manager::GetDevice(ID3D11Device** device) {
if (!resolved_device_) {
if (!InitializeDevice()) {
@@ -354,9 +392,5 @@
return resource_context_.get();
}
-WindowSurface* Manager::surface() const {
- return surface_.get();
-}
-
} // namespace egl
} // namespace flutter
diff --git a/shell/platform/windows/egl/manager.h b/shell/platform/windows/egl/manager.h
index 601b6bd..88535af 100644
--- a/shell/platform/windows/egl/manager.h
+++ b/shell/platform/windows/egl/manager.h
@@ -20,8 +20,6 @@
#include "flutter/fml/macros.h"
#include "flutter/shell/platform/windows/egl/context.h"
-#include "flutter/shell/platform/windows/egl/surface.h"
-#include "flutter/shell/platform/windows/egl/window_surface.h"
namespace flutter {
namespace egl {
@@ -44,19 +42,37 @@
//
// After the surface is created, |SetVSyncEnabled| should be called on a
// thread that can bind the |render_context_|.
- virtual bool CreateWindowSurface(HWND hwnd, size_t width, size_t height);
+ virtual bool CreateSurface(HWND hwnd, EGLint width, EGLint height);
// Resizes backing surface from current size to newly requested size
// based on width and height for the specific case when width and height do
- // not match current surface dimensions. HWND is the window backing the
- // surface.
+ // not match current surface dimensions. Target represents the visual entity
+ // to bind to.
//
// This binds |render_context_| to the current thread.
- virtual void ResizeWindowSurface(HWND hwnd, size_t width, size_t height);
+ virtual void ResizeSurface(HWND hwnd,
+ EGLint width,
+ EGLint height,
+ bool enable_vsync);
+
+ // queries EGL for the dimensions of surface in physical
+ // pixels returning width and height as out params.
+ void GetSurfaceDimensions(EGLint* width, EGLint* height);
+
+ // Releases the pass-in EGLSurface wrapping and backing resources if not null.
+ virtual void DestroySurface();
// Check if the current thread has a context bound.
bool HasContextCurrent();
+ // Binds |render_context_| to the current rendering thread and to the draw and
+ // read surfaces returning a boolean result reflecting success.
+ virtual bool MakeCurrent();
+
+ // Swaps the front and back buffers of the DX11 swapchain backing surface if
+ // not null.
+ virtual bool SwapBuffers();
+
// Creates a |EGLSurface| from the provided handle.
EGLSurface CreateSurfaceFromHandle(EGLenum handle_type,
EGLClientBuffer handle,
@@ -65,6 +81,16 @@
// Gets the |EGLDisplay|.
EGLDisplay egl_display() const { return display_; };
+ // If enabled, makes the current surface's buffer swaps block until the
+ // v-blank.
+ //
+ // If disabled, allows one thread to swap multiple buffers per v-blank
+ // but can result in screen tearing if the system compositor is disabled.
+ //
+ // This binds |render_context_| to the current thread and makes the render
+ // surface current.
+ virtual void SetVSyncEnabled(bool enabled);
+
// Gets the |ID3D11Device| chosen by ANGLE.
bool GetDevice(ID3D11Device** device);
@@ -74,9 +100,6 @@
// Get the EGL context used for async texture uploads.
virtual Context* resource_context() const;
- // Get the EGL surface that backs the Flutter view.
- virtual WindowSurface* surface() const;
-
protected:
// Creates a new surface manager retaining reference to the passed-in target
// for the lifetime of the manager.
@@ -115,8 +138,12 @@
// The EGL context used for async texture uploads.
std::unique_ptr<Context> resource_context_;
- // Th EGL surface used to render into the Flutter view.
- std::unique_ptr<WindowSurface> surface_;
+ // Current render_surface that engine will draw into.
+ EGLSurface surface_ = EGL_NO_SURFACE;
+
+ // Requested dimensions for current surface
+ EGLint surface_width_ = 0;
+ EGLint surface_height_ = 0;
// The current D3D device.
Microsoft::WRL::ComPtr<ID3D11Device> resolved_device_ = nullptr;
diff --git a/shell/platform/windows/egl/surface.cc b/shell/platform/windows/egl/surface.cc
deleted file mode 100644
index da3872c..0000000
--- a/shell/platform/windows/egl/surface.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "flutter/shell/platform/windows/egl/surface.h"
-
-#include "flutter/shell/platform/windows/egl/egl.h"
-
-namespace flutter {
-namespace egl {
-
-Surface::Surface(EGLDisplay display, EGLContext context, EGLSurface surface)
- : display_(display), context_(context), surface_(surface) {}
-
-Surface::~Surface() {
- Destroy();
-}
-
-bool Surface::IsValid() const {
- return is_valid_;
-}
-
-bool Surface::Destroy() {
- if (surface_ != EGL_NO_SURFACE) {
- // Ensure the surface is not current before destroying it.
- if (::eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE,
- EGL_NO_CONTEXT) != EGL_TRUE) {
- WINDOWS_LOG_EGL_ERROR;
- return false;
- }
-
- if (::eglDestroySurface(display_, surface_) != EGL_TRUE) {
- WINDOWS_LOG_EGL_ERROR;
- return false;
- }
- }
-
- is_valid_ = false;
- surface_ = EGL_NO_SURFACE;
- return true;
-}
-
-bool Surface::MakeCurrent() const {
- if (::eglMakeCurrent(display_, surface_, surface_, context_) != EGL_TRUE) {
- WINDOWS_LOG_EGL_ERROR;
- return false;
- }
-
- return true;
-}
-
-bool Surface::SwapBuffers() const {
- if (::eglSwapBuffers(display_, surface_) != EGL_TRUE) {
- WINDOWS_LOG_EGL_ERROR;
- return false;
- }
-
- return true;
-}
-
-const EGLSurface& Surface::GetHandle() const {
- return surface_;
-}
-
-} // namespace egl
-} // namespace flutter
diff --git a/shell/platform/windows/egl/surface.h b/shell/platform/windows/egl/surface.h
deleted file mode 100644
index eeea034..0000000
--- a/shell/platform/windows/egl/surface.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_SURFACE_H_
-#define FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_SURFACE_H_
-
-#include <EGL/egl.h>
-
-#include "flutter/fml/macros.h"
-
-namespace flutter {
-namespace egl {
-
-// An EGL surface. This can be window surface or an off-screen buffer.
-//
-// This enables automatic error logging and mocking.
-class Surface {
- public:
- Surface(EGLDisplay display, EGLContext context, EGLSurface surface);
-
- ~Surface();
-
- // Destroy the EGL surface and invalidate this object.
- //
- // This also unbinds the current context from the thread.
- virtual bool Destroy();
-
- // Check whether the EGL surface is valid.
- virtual bool IsValid() const;
-
- // Bind the EGL surface's context and read and draw surfaces to the
- // current thread. Returns true on success.
- virtual bool MakeCurrent() const;
-
- // Swap the surface's front the and back buffers. Used to present content.
- // Returns true on success.
- virtual bool SwapBuffers() const;
-
- // Get the raw EGL surface.
- virtual const EGLSurface& GetHandle() const;
-
- protected:
- bool is_valid_ = true;
-
- EGLDisplay display_ = EGL_NO_DISPLAY;
- EGLContext context_ = EGL_NO_CONTEXT;
- EGLSurface surface_ = EGL_NO_SURFACE;
-
- FML_DISALLOW_COPY_AND_ASSIGN(Surface);
-};
-
-} // namespace egl
-} // namespace flutter
-
-#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_SURFACE_H_
diff --git a/shell/platform/windows/egl/window_surface.cc b/shell/platform/windows/egl/window_surface.cc
deleted file mode 100644
index 47801e9..0000000
--- a/shell/platform/windows/egl/window_surface.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "flutter/shell/platform/windows/egl/window_surface.h"
-
-#include "flutter/shell/platform/windows/egl/egl.h"
-
-namespace flutter {
-namespace egl {
-
-WindowSurface::WindowSurface(EGLDisplay display,
- EGLContext context,
- EGLSurface surface,
- size_t width,
- size_t height)
- : Surface(display, context, surface), width_(width), height_(height) {}
-
-bool WindowSurface::SetVSyncEnabled(bool enabled) {
- if (!MakeCurrent()) {
- return false;
- }
-
- if (::eglSwapInterval(display_, enabled ? 1 : 0) != EGL_TRUE) {
- WINDOWS_LOG_EGL_ERROR;
- return false;
- }
-
- vsync_enabled_ = enabled;
- return true;
-}
-
-size_t WindowSurface::width() const {
- return width_;
-}
-
-size_t WindowSurface::height() const {
- return height_;
-}
-
-bool WindowSurface::vsync_enabled() const {
- return vsync_enabled_;
-}
-
-} // namespace egl
-} // namespace flutter
diff --git a/shell/platform/windows/egl/window_surface.h b/shell/platform/windows/egl/window_surface.h
deleted file mode 100644
index 376b3fe..0000000
--- a/shell/platform/windows/egl/window_surface.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_WINDOW_SURFACE_H_
-#define FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_WINDOW_SURFACE_H_
-
-#include <EGL/egl.h>
-
-#include "flutter/fml/macros.h"
-#include "flutter/shell/platform/windows/egl/surface.h"
-
-namespace flutter {
-namespace egl {
-
-// An EGL surface used to render a Flutter view to a win32 HWND.
-//
-// This enables automatic error logging and mocking.
-class WindowSurface : public Surface {
- public:
- WindowSurface(EGLDisplay display,
- EGLContext context,
- EGLSurface surface,
- size_t width,
- size_t height);
-
- // If enabled, makes the surface's buffer swaps block until the v-blank.
- //
- // If disabled, allows one thread to swap multiple buffers per v-blank
- // but can result in screen tearing if the system compositor is disabled.
- //
- // This binds the EGL context and surface to the current thread.
- virtual bool SetVSyncEnabled(bool enabled);
-
- // Get the surface's width in physical pixels.
- virtual size_t width() const;
-
- // Get the surface's height in physical pixels.
- virtual size_t height() const;
-
- // Get whether the surface's buffer swap blocks until the v-blank.
- virtual bool vsync_enabled() const;
-
- private:
- size_t width_ = 0;
- size_t height_ = 0;
- bool vsync_enabled_ = true;
-
- FML_DISALLOW_COPY_AND_ASSIGN(WindowSurface);
-};
-
-} // namespace egl
-} // namespace flutter
-
-#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_WINDOW_SURFACE_H_
diff --git a/shell/platform/windows/flutter_windows_engine.cc b/shell/platform/windows/flutter_windows_engine.cc
index a5766c1..ad7450b 100644
--- a/shell/platform/windows/flutter_windows_engine.cc
+++ b/shell/platform/windows/flutter_windows_engine.cc
@@ -58,7 +58,7 @@
if (!host->egl_manager()) {
return false;
}
- return host->egl_manager()->render_context()->MakeCurrent();
+ return host->egl_manager()->MakeCurrent();
};
config.open_gl.clear_current = [](void* user_data) -> bool {
auto host = static_cast<FlutterWindowsEngine*>(user_data);
diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc
index bdea979..5d7f45e 100644
--- a/shell/platform/windows/flutter_windows_view.cc
+++ b/shell/platform/windows/flutter_windows_view.cc
@@ -53,10 +53,10 @@
// thread.
if (engine.running()) {
engine.PostRasterThreadTask([egl_manager, needs_vsync]() {
- egl_manager->surface()->SetVSyncEnabled(needs_vsync);
+ egl_manager->SetVSyncEnabled(needs_vsync);
});
} else {
- egl_manager->surface()->SetVSyncEnabled(needs_vsync);
+ egl_manager->SetVSyncEnabled(needs_vsync);
// Release the EGL context so that the raster thread can use it.
if (!egl_manager->render_context()->ClearCurrent()) {
@@ -116,8 +116,8 @@
// Platform thread is blocked for the entire duration until the
// resize_status_ is set to kDone.
- engine_->egl_manager()->ResizeWindowSurface(
- GetWindowHandle(), resize_target_width_, resize_target_height_);
+ engine_->egl_manager()->ResizeSurface(GetWindowHandle(), resize_target_width_,
+ resize_target_height_, NeedsVsync());
resize_status_ = ResizeState::kFrameGenerated;
}
@@ -132,8 +132,8 @@
if (resize_target_width_ == width && resize_target_height_ == height) {
// Platform thread is blocked for the entire duration until the
// resize_status_ is set to kDone.
- engine_->egl_manager()->ResizeWindowSurface(GetWindowHandle(), width,
- height);
+ engine_->egl_manager()->ResizeSurface(GetWindowHandle(), width, height,
+ NeedsVsync());
resize_status_ = ResizeState::kFrameGenerated;
return true;
}
@@ -167,8 +167,8 @@
// We're using OpenGL rendering. Resizing the surface must happen on the
// raster thread.
- size_t surface_width = engine_->egl_manager()->surface()->width();
- size_t surface_height = engine_->egl_manager()->surface()->height();
+ EGLint surface_width, surface_height;
+ engine_->egl_manager()->GetSurfaceDimensions(&surface_width, &surface_height);
bool surface_will_update =
SurfaceWillUpdate(surface_width, surface_height, width, height);
@@ -637,8 +637,8 @@
void FlutterWindowsView::CreateRenderSurface() {
if (engine_ && engine_->egl_manager()) {
PhysicalWindowBounds bounds = binding_handler_->GetPhysicalWindowBounds();
- engine_->egl_manager()->CreateWindowSurface(GetWindowHandle(), bounds.width,
- bounds.height);
+ engine_->egl_manager()->CreateSurface(GetWindowHandle(), bounds.width,
+ bounds.height);
UpdateVsync(*engine_, NeedsVsync());
@@ -648,21 +648,9 @@
}
void FlutterWindowsView::DestroyRenderSurface() {
- if (!engine_) {
- return;
+ if (engine_ && engine_->egl_manager()) {
+ engine_->egl_manager()->DestroySurface();
}
-
- auto const manager = engine_->egl_manager();
- if (!manager) {
- return;
- }
-
- auto const surface = manager->surface();
- if (!surface) {
- return;
- }
-
- surface->Destroy();
}
void FlutterWindowsView::OnHighContrastChanged() {
diff --git a/shell/platform/windows/flutter_windows_view_unittests.cc b/shell/platform/windows/flutter_windows_view_unittests.cc
index 43c4718..2dfc0ac 100644
--- a/shell/platform/windows/flutter_windows_view_unittests.cc
+++ b/shell/platform/windows/flutter_windows_view_unittests.cc
@@ -20,7 +20,6 @@
#include "flutter/shell/platform/windows/flutter_windows_texture_registrar.h"
#include "flutter/shell/platform/windows/testing/egl/mock_context.h"
#include "flutter/shell/platform/windows/testing/egl/mock_manager.h"
-#include "flutter/shell/platform/windows/testing/egl/mock_window_surface.h"
#include "flutter/shell/platform/windows/testing/engine_modifier.h"
#include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
#include "flutter/shell/platform/windows/testing/mock_windows_proc_table.h"
@@ -231,13 +230,12 @@
// The view's surface must be destroyed after the engine is shutdown.
// See: https://github.com/flutter/flutter/issues/124463
TEST(FlutterWindowsViewTest, Shutdown) {
- auto engine = std::make_unique<MockFlutterWindowsEngine>();
+ std::unique_ptr<MockFlutterWindowsEngine> engine =
+ std::make_unique<MockFlutterWindowsEngine>();
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
- auto egl_manager = std::make_unique<egl::MockManager>();
- auto surface = std::make_unique<egl::MockWindowSurface>();
-
- EXPECT_CALL(*egl_manager.get(), surface).WillOnce(Return(surface.get()));
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
EngineModifier modifier(engine.get());
FlutterWindowsView view(std::move(window_binding_handler));
@@ -245,7 +243,7 @@
// The engine must be stopped before the surface can be destroyed.
InSequence s;
EXPECT_CALL(*engine.get(), Stop).Times(1);
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
modifier.SetEGLManager(std::move(egl_manager));
view.SetEngine(engine.get());
@@ -819,16 +817,16 @@
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
- auto egl_manager = std::make_unique<egl::MockManager>();
- auto surface = std::make_unique<egl::MockWindowSurface>();
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
- EXPECT_CALL(*windows_proc_table.get(), DwmFlush).WillOnce(Return(S_OK));
- EXPECT_CALL(*egl_manager.get(), surface)
- .WillRepeatedly(Return(surface.get()));
- EXPECT_CALL(*egl_manager.get(),
- ResizeWindowSurface(_, /*width=*/500, /*height=*/500))
+ EXPECT_CALL(*windows_proc_table.get(), DwmIsCompositionEnabled)
+ .WillOnce(Return(true));
+ EXPECT_CALL(
+ *egl_manager.get(),
+ ResizeSurface(_, /*width=*/500, /*height=*/500, /*enable_vsync=*/false))
.Times(1);
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
FlutterWindowsView view(std::move(window_binding_handler),
std::move(windows_proc_table));
@@ -869,16 +867,16 @@
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
- auto egl_manager = std::make_unique<egl::MockManager>();
- auto surface = std::make_unique<egl::MockWindowSurface>();
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
- EXPECT_CALL(*windows_proc_table.get(), DwmFlush).WillOnce(Return(S_OK));
- EXPECT_CALL(*egl_manager.get(), surface)
- .WillRepeatedly(Return(surface.get()));
- EXPECT_CALL(*egl_manager.get(),
- ResizeWindowSurface(_, /*width=*/500, /*height=*/500))
+ EXPECT_CALL(*windows_proc_table.get(), DwmIsCompositionEnabled)
+ .WillOnce(Return(true));
+ EXPECT_CALL(
+ *egl_manager.get(),
+ ResizeSurface(_, /*width=*/500, /*height=*/500, /*enable_vsync=*/false))
.Times(1);
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
FlutterWindowsView view(std::move(window_binding_handler),
std::move(windows_proc_table));
@@ -921,12 +919,10 @@
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
- auto egl_manager = std::make_unique<egl::MockManager>();
- auto surface = std::make_unique<egl::MockWindowSurface>();
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
- EXPECT_CALL(*egl_manager.get(), surface)
- .WillRepeatedly(Return(surface.get()));
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
FlutterWindowsView view(std::move(window_binding_handler),
std::move(windows_proc_table));
@@ -1303,13 +1299,14 @@
// Don't block until the v-blank if it is disabled by the window.
// The surface is updated on the platform thread at startup.
TEST(FlutterWindowsViewTest, DisablesVSyncAtStartup) {
- auto engine = std::make_unique<MockFlutterWindowsEngine>();
+ std::unique_ptr<MockFlutterWindowsEngine> engine =
+ std::make_unique<MockFlutterWindowsEngine>();
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
- auto egl_manager = std::make_unique<egl::MockManager>();
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
egl::MockContext render_context;
- auto surface = std::make_unique<egl::MockWindowSurface>();
EXPECT_CALL(*engine.get(), running).WillRepeatedly(Return(false));
EXPECT_CALL(*engine.get(), PostRasterThreadTask).Times(0);
@@ -1317,24 +1314,21 @@
EXPECT_CALL(*windows_proc_table.get(), DwmIsCompositionEnabled)
.WillOnce(Return(true));
- EXPECT_CALL(*egl_manager.get(), render_context)
- .WillOnce(Return(&render_context));
- EXPECT_CALL(*egl_manager.get(), surface)
- .WillRepeatedly(Return(surface.get()));
-
EngineModifier modifier(engine.get());
FlutterWindowsView view(std::move(window_binding_handler),
std::move(windows_proc_table));
InSequence s;
- EXPECT_CALL(*egl_manager.get(), CreateWindowSurface(_, _, _))
+ EXPECT_CALL(*egl_manager.get(), CreateSurface(_, _, _))
.Times(1)
.WillOnce(Return(true));
- EXPECT_CALL(*surface.get(), SetVSyncEnabled(false)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), SetVSyncEnabled(false)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), render_context)
+ .WillOnce(Return(&render_context));
EXPECT_CALL(render_context, ClearCurrent).WillOnce(Return(true));
EXPECT_CALL(*engine.get(), Stop).Times(1);
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
modifier.SetEGLManager(std::move(egl_manager));
view.SetEngine(engine.get());
@@ -1345,37 +1339,35 @@
// Blocks until the v-blank if it is enabled by the window.
// The surface is updated on the platform thread at startup.
TEST(FlutterWindowsViewTest, EnablesVSyncAtStartup) {
- auto engine = std::make_unique<MockFlutterWindowsEngine>();
+ std::unique_ptr<MockFlutterWindowsEngine> engine =
+ std::make_unique<MockFlutterWindowsEngine>();
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
- auto egl_manager = std::make_unique<egl::MockManager>();
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
egl::MockContext render_context;
- auto surface = std::make_unique<egl::MockWindowSurface>();
EXPECT_CALL(*engine.get(), running).WillRepeatedly(Return(false));
EXPECT_CALL(*engine.get(), PostRasterThreadTask).Times(0);
EXPECT_CALL(*windows_proc_table.get(), DwmIsCompositionEnabled)
.WillOnce(Return(false));
- EXPECT_CALL(*egl_manager.get(), render_context)
- .WillOnce(Return(&render_context));
- EXPECT_CALL(*egl_manager.get(), surface)
- .WillRepeatedly(Return(surface.get()));
-
EngineModifier modifier(engine.get());
FlutterWindowsView view(std::move(window_binding_handler),
std::move(windows_proc_table));
InSequence s;
- EXPECT_CALL(*egl_manager.get(), CreateWindowSurface(_, _, _))
+ EXPECT_CALL(*egl_manager.get(), CreateSurface(_, _, _))
.Times(1)
.WillOnce(Return(true));
- EXPECT_CALL(*surface.get(), SetVSyncEnabled(true)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), SetVSyncEnabled(true)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), render_context)
+ .WillOnce(Return(&render_context));
EXPECT_CALL(render_context, ClearCurrent).WillOnce(Return(true));
EXPECT_CALL(*engine.get(), Stop).Times(1);
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
modifier.SetEGLManager(std::move(egl_manager));
view.SetEngine(engine.get());
@@ -1386,27 +1378,24 @@
// Don't block until the v-blank if it is disabled by the window.
// The surface is updated on the raster thread if the engine is running.
TEST(FlutterWindowsViewTest, DisablesVSyncAfterStartup) {
- auto engine = std::make_unique<MockFlutterWindowsEngine>();
+ std::unique_ptr<MockFlutterWindowsEngine> engine =
+ std::make_unique<MockFlutterWindowsEngine>();
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
- auto egl_manager = std::make_unique<egl::MockManager>();
- auto surface = std::make_unique<egl::MockWindowSurface>();
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
EXPECT_CALL(*engine.get(), running).WillRepeatedly(Return(true));
EXPECT_CALL(*windows_proc_table.get(), DwmIsCompositionEnabled)
.WillOnce(Return(true));
- EXPECT_CALL(*egl_manager.get(), render_context).Times(0);
- EXPECT_CALL(*egl_manager.get(), surface)
- .WillRepeatedly(Return(surface.get()));
-
EngineModifier modifier(engine.get());
FlutterWindowsView view(std::move(window_binding_handler),
std::move(windows_proc_table));
InSequence s;
- EXPECT_CALL(*egl_manager.get(), CreateWindowSurface(_, _, _))
+ EXPECT_CALL(*egl_manager.get(), CreateSurface(_, _, _))
.Times(1)
.WillOnce(Return(true));
EXPECT_CALL(*engine.get(), PostRasterThreadTask)
@@ -1414,9 +1403,11 @@
callback();
return true;
});
- EXPECT_CALL(*surface.get(), SetVSyncEnabled(false)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), SetVSyncEnabled(false)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), render_context).Times(0);
+
EXPECT_CALL(*engine.get(), Stop).Times(1);
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
modifier.SetEGLManager(std::move(egl_manager));
view.SetEngine(engine.get());
@@ -1427,28 +1418,25 @@
// Blocks until the v-blank if it is enabled by the window.
// The surface is updated on the raster thread if the engine is running.
TEST(FlutterWindowsViewTest, EnablesVSyncAfterStartup) {
- auto engine = std::make_unique<MockFlutterWindowsEngine>();
+ std::unique_ptr<MockFlutterWindowsEngine> engine =
+ std::make_unique<MockFlutterWindowsEngine>();
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
- auto egl_manager = std::make_unique<egl::MockManager>();
- auto surface = std::make_unique<egl::MockWindowSurface>();
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
EXPECT_CALL(*engine.get(), running).WillRepeatedly(Return(true));
EXPECT_CALL(*windows_proc_table.get(), DwmIsCompositionEnabled)
.WillOnce(Return(false));
- EXPECT_CALL(*egl_manager.get(), render_context).Times(0);
- EXPECT_CALL(*egl_manager.get(), surface)
- .WillRepeatedly(Return(surface.get()));
-
EngineModifier modifier(engine.get());
FlutterWindowsView view(std::move(window_binding_handler),
std::move(windows_proc_table));
InSequence s;
- EXPECT_CALL(*egl_manager.get(), CreateWindowSurface(_, _, _))
+ EXPECT_CALL(*egl_manager.get(), CreateSurface(_, _, _))
.Times(1)
.WillOnce(Return(true));
EXPECT_CALL(*engine.get(), PostRasterThreadTask)
@@ -1456,10 +1444,11 @@
callback();
return true;
});
+ EXPECT_CALL(*egl_manager.get(), SetVSyncEnabled(true)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), render_context).Times(0);
- EXPECT_CALL(*surface.get(), SetVSyncEnabled(true)).Times(1);
EXPECT_CALL(*engine.get(), Stop).Times(1);
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
modifier.SetEGLManager(std::move(egl_manager));
view.SetEngine(engine.get());
@@ -1471,12 +1460,13 @@
// If this happens, the app must synchronize with the vsync to prevent
// screen tearing.
TEST(FlutterWindowsViewTest, UpdatesVSyncOnDwmUpdates) {
- auto engine = std::make_unique<MockFlutterWindowsEngine>();
+ std::unique_ptr<MockFlutterWindowsEngine> engine =
+ std::make_unique<MockFlutterWindowsEngine>();
auto window_binding_handler =
std::make_unique<NiceMock<MockWindowBindingHandler>>();
auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
- auto egl_manager = std::make_unique<egl::MockManager>();
- auto surface = std::make_unique<egl::MockWindowSurface>();
+ std::unique_ptr<egl::MockManager> egl_manager =
+ std::make_unique<egl::MockManager>();
EXPECT_CALL(*engine.get(), running).WillRepeatedly(Return(true));
@@ -1491,19 +1481,17 @@
.WillOnce(Return(true));
EXPECT_CALL(*egl_manager.get(), render_context).Times(0);
- EXPECT_CALL(*egl_manager.get(), surface)
- .WillRepeatedly(Return(surface.get()));
EngineModifier modifier(engine.get());
FlutterWindowsView view(std::move(window_binding_handler),
std::move(windows_proc_table));
InSequence s;
- EXPECT_CALL(*surface.get(), SetVSyncEnabled(true)).Times(1);
- EXPECT_CALL(*surface.get(), SetVSyncEnabled(false)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), SetVSyncEnabled(true)).Times(1);
+ EXPECT_CALL(*egl_manager.get(), SetVSyncEnabled(false)).Times(1);
EXPECT_CALL(*engine.get(), Stop).Times(1);
- EXPECT_CALL(*surface.get(), Destroy).Times(1);
+ EXPECT_CALL(*egl_manager.get(), DestroySurface).Times(1);
modifier.SetEGLManager(std::move(egl_manager));
view.SetEngine(engine.get());
diff --git a/shell/platform/windows/testing/egl/mock_manager.h b/shell/platform/windows/testing/egl/mock_manager.h
index 640ad50..e48df3e 100644
--- a/shell/platform/windows/testing/egl/mock_manager.h
+++ b/shell/platform/windows/testing/egl/mock_manager.h
@@ -18,12 +18,17 @@
public:
MockManager() : Manager(false) {}
- MOCK_METHOD(bool, CreateWindowSurface, (HWND, size_t, size_t), (override));
- MOCK_METHOD(void, ResizeWindowSurface, (HWND, size_t, size_t), (override));
+ MOCK_METHOD(bool, CreateSurface, (HWND, EGLint, EGLint), (override));
+ MOCK_METHOD(void, ResizeSurface, (HWND, EGLint, EGLint, bool), (override));
+ MOCK_METHOD(void, DestroySurface, (), (override));
+
+ MOCK_METHOD(bool, MakeCurrent, (), (override));
+ MOCK_METHOD(void, SetVSyncEnabled, (bool), (override));
+
+ MOCK_METHOD(bool, SwapBuffers, (), (override));
MOCK_METHOD(flutter::egl::Context*, render_context, (), (const, override));
MOCK_METHOD(flutter::egl::Context*, resource_context, (), (const, override));
- MOCK_METHOD(flutter::egl::WindowSurface*, surface, (), (const, override));
private:
FML_DISALLOW_COPY_AND_ASSIGN(MockManager);
diff --git a/shell/platform/windows/testing/egl/mock_window_surface.h b/shell/platform/windows/testing/egl/mock_window_surface.h
deleted file mode 100644
index 79c231e..0000000
--- a/shell/platform/windows/testing/egl/mock_window_surface.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_TESTING_EGL_MOCK_WINDOW_SURFACE_H_
-#define FLUTTER_SHELL_PLATFORM_WINDOWS_TESTING_EGL_MOCK_WINDOW_SURFACE_H_
-
-#include "flutter/fml/macros.h"
-#include "flutter/shell/platform/windows/egl/window_surface.h"
-#include "gmock/gmock.h"
-
-namespace flutter {
-namespace testing {
-namespace egl {
-
-/// Mock for the |WindowSurface| base class.
-class MockWindowSurface : public flutter::egl::WindowSurface {
- public:
- MockWindowSurface()
- : WindowSurface(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, 0, 0) {}
-
- MOCK_METHOD(bool, Destroy, (), (override));
- MOCK_METHOD(bool, MakeCurrent, (), (const, override));
- MOCK_METHOD(bool, SwapBuffers, (), (const, override));
- MOCK_METHOD(bool, SetVSyncEnabled, (bool), (override));
-
- private:
- FML_DISALLOW_COPY_AND_ASSIGN(MockWindowSurface);
-};
-
-} // namespace egl
-} // namespace testing
-} // namespace flutter
-
-#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_TESTING_EGL_MOCK_WINDOW_SURFACE_H_