[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_