Revert "Run Flutter on iOS and Android with color correct Skia (#3743)" (#3775)

This reverts commit ffe8181ffe7432b61a67323c80fd8025704e4695.
diff --git a/flow/compositor_context.h b/flow/compositor_context.h
index da03123..c441f11 100644
--- a/flow/compositor_context.h
+++ b/flow/compositor_context.h
@@ -21,7 +21,7 @@
  public:
   class ScopedFrame {
    public:
-    SkCanvas* canvas() { return canvas_; }
+    SkCanvas& canvas() { return *canvas_; }
 
     CompositorContext& context() const { return context_; }
 
diff --git a/flow/layers/layer.h b/flow/layers/layer.h
index 699440f..8bf7877 100644
--- a/flow/layers/layer.h
+++ b/flow/layers/layer.h
@@ -35,7 +35,6 @@
   struct PrerollContext {
     RasterCache* raster_cache;
     GrContext* gr_context;
-    sk_sp<SkColorSpace> dst_color_space;
     SkRect child_paint_bounds;
   };
 
diff --git a/flow/layers/layer_tree.cc b/flow/layers/layer_tree.cc
index 8f3c936..0bbbd58 100644
--- a/flow/layers/layer_tree.cc
+++ b/flow/layers/layer_tree.cc
@@ -27,14 +27,11 @@
 void LayerTree::Preroll(CompositorContext::ScopedFrame& frame,
                         bool ignore_raster_cache) {
   TRACE_EVENT0("flutter", "LayerTree::Preroll");
-  SkColorSpace* color_space =
-      frame.canvas() ? frame.canvas()->imageInfo().colorSpace() : nullptr;
   frame.context().raster_cache().SetCheckboardCacheImages(
       checkerboard_raster_cache_images_);
   Layer::PrerollContext context = {
       ignore_raster_cache ? nullptr : &frame.context().raster_cache(),
-      frame.gr_context(), sk_ref_sp(color_space),
-      SkRect::MakeEmpty(),
+      frame.gr_context(), SkRect::MakeEmpty(),
   };
   root_layer_->Preroll(&context, SkMatrix::I());
 }
@@ -54,7 +51,7 @@
 #endif
 
 void LayerTree::Paint(CompositorContext::ScopedFrame& frame) {
-  Layer::PaintContext context = {*frame.canvas(), frame.context().frame_time(),
+  Layer::PaintContext context = {frame.canvas(), frame.context().frame_time(),
                                  frame.context().engine_time(),
                                  frame.context().memory_usage(),
                                  checkerboard_offscreen_layers_};
diff --git a/flow/layers/picture_layer.cc b/flow/layers/picture_layer.cc
index 66bb07f..cc6a4a8 100644
--- a/flow/layers/picture_layer.cc
+++ b/flow/layers/picture_layer.cc
@@ -23,8 +23,7 @@
 void PictureLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) {
   if (auto cache = context->raster_cache) {
     raster_cache_result_ = cache->GetPrerolledImage(
-        context->gr_context, picture_.get(), matrix, context->dst_color_space,
-        is_complex_, will_change_);
+        context->gr_context, picture_.get(), matrix, is_complex_, will_change_);
   }
 
   SkRect bounds = picture_->cullRect().makeOffset(offset_.x(), offset_.y());
diff --git a/flow/raster_cache.cc b/flow/raster_cache.cc
index d04c7c6..eb11e1c 100644
--- a/flow/raster_cache.cc
+++ b/flow/raster_cache.cc
@@ -71,7 +71,6 @@
 RasterCacheResult RasterizePicture(SkPicture* picture,
                                    GrContext* context,
                                    const MatrixDecomposition& matrix,
-                                   sk_sp<SkColorSpace> dst_color_space,
                                    bool checkerboard) {
   TRACE_EVENT0("flutter", "RasterCachePopulate");
 
@@ -82,7 +81,7 @@
       std::ceil(logical_rect.width() * std::abs(scale.x())),  // physical width
       std::ceil(logical_rect.height() *
                 std::abs(scale.y())),  // physical height
-      std::move(dst_color_space)       // colorspace
+      nullptr                          // colorspace
       );
 
   sk_sp<SkSurface> surface =
@@ -131,7 +130,6 @@
     GrContext* context,
     SkPicture* picture,
     const SkMatrix& transformation_matrix,
-    sk_sp<SkColorSpace> dst_color_space,
     bool is_complex,
     bool will_change) {
   if (!IsPictureWorthRasterizing(picture, will_change, is_complex)) {
@@ -161,8 +159,7 @@
 
   if (!entry.image.is_valid()) {
     entry.image =
-        RasterizePicture(picture, context, matrix, std::move(dst_color_space),
-                         checkerboard_images_);
+        RasterizePicture(picture, context, matrix, checkerboard_images_);
   }
 
   // We are not considering unrasterizable images. So if we don't have an image
diff --git a/flow/raster_cache.h b/flow/raster_cache.h
index 1f6ef79..9601082 100644
--- a/flow/raster_cache.h
+++ b/flow/raster_cache.h
@@ -53,10 +53,8 @@
   RasterCacheResult GetPrerolledImage(GrContext* context,
                                       SkPicture* picture,
                                       const SkMatrix& transformation_matrix,
-                                      sk_sp<SkColorSpace> dst_color_space,
                                       bool is_complex,
                                       bool will_change);
-
   void SweepAfterFrame();
 
   void Clear();
diff --git a/flow/raster_cache_unittests.cc b/flow/raster_cache_unittests.cc
index 7e5c733..361a06c 100644
--- a/flow/raster_cache_unittests.cc
+++ b/flow/raster_cache_unittests.cc
@@ -32,15 +32,14 @@
 
   sk_sp<SkImage> image;
 
-  sk_sp<SkColorSpace> srgb = SkColorSpace::MakeSRGB();
   ASSERT_FALSE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 1
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 1
   cache.SweepAfterFrame();
   ASSERT_FALSE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 2
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 2
   cache.SweepAfterFrame();
   ASSERT_TRUE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 3
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 3
   cache.SweepAfterFrame();
 }
 
@@ -54,15 +53,14 @@
 
   sk_sp<SkImage> image;
 
-  sk_sp<SkColorSpace> srgb = SkColorSpace::MakeSRGB();
   ASSERT_FALSE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 1
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 1
   cache.SweepAfterFrame();
   ASSERT_FALSE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 2
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 2
   cache.SweepAfterFrame();
   ASSERT_FALSE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 3
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 3
   cache.SweepAfterFrame();
 }
 
@@ -76,20 +74,19 @@
 
   sk_sp<SkImage> image;
 
-  sk_sp<SkColorSpace> srgb = SkColorSpace::MakeSRGB();
   ASSERT_FALSE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 1
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 1
   cache.SweepAfterFrame();
   ASSERT_FALSE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 2
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 2
   cache.SweepAfterFrame();
   ASSERT_TRUE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 3
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 3
   cache.SweepAfterFrame();
   ASSERT_TRUE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 4
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 4
   cache.SweepAfterFrame();
   cache.SweepAfterFrame();  // Extra frame without a preroll image access.
   ASSERT_FALSE(
-      cache.GetPrerolledImage(NULL, picture.get(), matrix, srgb, true, false));  // 5
+      cache.GetPrerolledImage(NULL, picture.get(), matrix, true, false));  // 5
 }
diff --git a/lib/ui/painting/image_decoding.cc b/lib/ui/painting/image_decoding.cc
index 9c9a351..50a4bc8 100644
--- a/lib/ui/painting/image_decoding.cc
+++ b/lib/ui/painting/image_decoding.cc
@@ -32,10 +32,9 @@
 
   GrContext* context = ResourceContext::Get();
   if (context) {
-    // This acts as a flag to indicate that we want a color space aware decode.
-    sk_sp<SkColorSpace> dstColorSpace = SkColorSpace::MakeSRGB();
+    // TODO: Supply actual destination color space once available
     return SkImage::MakeCrossContextFromEncoded(context, std::move(buffer),
-                                                false, dstColorSpace.get());
+                                                false, nullptr);
   } else {
     return SkImage::MakeFromEncoded(std::move(buffer));
   }
diff --git a/shell/gpu/gpu_surface_gl.cc b/shell/gpu/gpu_surface_gl.cc
index 1fe833d..8380b6b 100644
--- a/shell/gpu/gpu_surface_gl.cc
+++ b/shell/gpu/gpu_surface_gl.cc
@@ -8,7 +8,6 @@
 #include "lib/ftl/arraysize.h"
 #include "lib/ftl/logging.h"
 #include "third_party/skia/include/core/SkSurface.h"
-#include "third_party/skia/include/gpu/GrContextOptions.h"
 #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
 
 namespace shell {
@@ -45,12 +44,9 @@
   auto backend_context =
       reinterpret_cast<GrBackendContext>(GrGLCreateNativeInterface());
 
-  GrContextOptions options;
-  options.fRequireDecodeDisableForSRGB = false;
-
   context_ =
-      sk_sp<GrContext>(GrContext::Create(kOpenGL_GrBackend, backend_context,
-                                         options));
+      sk_sp<GrContext>(GrContext::Create(kOpenGL_GrBackend, backend_context));
+
   if (context_ == nullptr) {
     FTL_LOG(INFO) << "Failed to setup Skia Gr context.";
     return false;
@@ -108,16 +104,15 @@
 }
 
 bool GPUSurfaceGL::SelectPixelConfig(GrPixelConfig* config) {
-  if (delegate_->ColorSpace() && delegate_->ColorSpace()->gammaCloseToSRGB()) {
-    FTL_DCHECK(context_->caps()->isConfigRenderable(kSRGBA_8888_GrPixelConfig,
-                                                    false));
-    *config = kSRGBA_8888_GrPixelConfig;
-    return true;
-  }
+  static const GrPixelConfig kConfigOptions[] = {
+      kSkia8888_GrPixelConfig, kRGBA_4444_GrPixelConfig,
+  };
 
-  if (context_->caps()->isConfigRenderable(kRGBA_8888_GrPixelConfig, false)) {
-    *config = kRGBA_8888_GrPixelConfig;
-    return true;
+  for (size_t i = 0; i < arraysize(kConfigOptions); i++) {
+    if (context_->caps()->isConfigRenderable(kConfigOptions[i], false)) {
+      *config = kConfigOptions[i];
+      return true;
+    }
   }
 
   return false;
@@ -129,6 +124,7 @@
   }
 
   GrBackendRenderTargetDesc desc;
+
   if (!SelectPixelConfig(&desc.fConfig)) {
     return nullptr;
   }
@@ -139,8 +135,7 @@
   desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
   desc.fRenderTargetHandle = delegate_->GLContextFBO();
 
-  return SkSurface::MakeFromBackendRenderTarget(context_.get(), desc,
-                                                delegate_->ColorSpace(), nullptr);
+  return SkSurface::MakeFromBackendRenderTarget(context_.get(), desc, nullptr);
 }
 
 sk_sp<SkSurface> GPUSurfaceGL::AcquireSurface(const SkISize& size) {
diff --git a/shell/gpu/gpu_surface_gl.h b/shell/gpu/gpu_surface_gl.h
index 219d8fd..95a6527 100644
--- a/shell/gpu/gpu_surface_gl.h
+++ b/shell/gpu/gpu_surface_gl.h
@@ -22,9 +22,6 @@
   virtual bool GLContextPresent() = 0;
 
   virtual intptr_t GLContextFBO() const = 0;
-
-  // TODO: Update Mac desktop and make this pure virtual.
-  virtual sk_sp<SkColorSpace> ColorSpace() const { return nullptr; }
 };
 
 class GPUSurfaceGL : public Surface {
diff --git a/shell/platform/android/android_context_gl.cc b/shell/platform/android/android_context_gl.cc
index a8e14c8..9ae9dfb 100644
--- a/shell/platform/android/android_context_gl.cc
+++ b/shell/platform/android/android_context_gl.cc
@@ -3,17 +3,9 @@
 // found in the LICENSE file.
 
 #include "flutter/shell/platform/android/android_context_gl.h"
-#include <EGL/eglext.h>
+
 #include <utility>
 
-#ifndef EGL_GL_COLORSPACE_KHR
-#define EGL_GL_COLORSPACE_KHR 0x309D
-#endif
-
-#ifndef EGL_GL_COLORSPACE_SRGB_KHR
-#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089
-#endif
-
 namespace shell {
 
 template <class T>
@@ -120,66 +112,43 @@
 }
 
 // For onscreen rendering.
-bool AndroidContextGL::CreateWindowSurface(
-    ftl::RefPtr<AndroidNativeWindow> window) {
+static EGLResult<EGLSurface> CreateWindowSurface(
+    EGLDisplay display,
+    EGLConfig config,
+    AndroidNativeWindow::Handle window_handle) {
   // The configurations are only required when dealing with extensions or VG.
   // We do neither.
-
-  window_ = std::move(window);
-  EGLDisplay display = environment_->Display();
-
-  const EGLint srgb_attribs[] = {
-      EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR,
-      EGL_NONE
-  };
-  const EGLint default_attribs[] = {
-      EGL_NONE
-  };
-
-  const EGLint* attribs = default_attribs;
-  if (srgb_support_) {
-    attribs = srgb_attribs;
-  }
-
-  surface_ = eglCreateWindowSurface(
-      display, config_,
-      reinterpret_cast<EGLNativeWindowType>(window_->handle()), attribs);
-  return surface_ != EGL_NO_SURFACE;
+  EGLSurface surface = eglCreateWindowSurface(
+      display, config, reinterpret_cast<EGLNativeWindowType>(window_handle),
+      nullptr);
+  return {surface != EGL_NO_SURFACE, surface};
 }
 
 // For offscreen rendering.
-bool AndroidContextGL::CreatePBufferSurface() {
+static EGLResult<EGLSurface> CreatePBufferSurface(EGLDisplay display,
+                                                  EGLConfig config) {
   // We only ever create pbuffer surfaces for background resource loading
   // contexts. We never bind the pbuffer to anything.
+  const EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE};
+  EGLSurface surface = eglCreatePbufferSurface(display, config, attribs);
+  return {surface != EGL_NO_SURFACE, surface};
+}
 
-  EGLDisplay display = environment_->Display();
-
-  const EGLint srgb_attribs[] = {
-      EGL_WIDTH, 1,
-      EGL_HEIGHT, 1,
-      EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR,
-      EGL_NONE
-  };
-  const EGLint default_attribs[] = {
-      EGL_WIDTH, 1,
-      EGL_HEIGHT, 1,
-      EGL_NONE
-  };
-
-  const EGLint* attribs = default_attribs;
-  if (srgb_support_) {
-    attribs = srgb_attribs;
-  }
-
-  surface_ = eglCreatePbufferSurface(display, config_, attribs);
-  return surface_ != EGL_NO_SURFACE;
+static EGLResult<EGLSurface> CreateSurface(
+    EGLDisplay display,
+    EGLConfig config,
+    ftl::RefPtr<AndroidNativeWindow> window) {
+  return window && window->IsValid()
+             ? CreateWindowSurface(display, config, window->handle())
+             : CreatePBufferSurface(display, config);
 }
 
 AndroidContextGL::AndroidContextGL(ftl::RefPtr<AndroidEnvironmentGL> env,
+                                   ftl::RefPtr<AndroidNativeWindow> window,
                                    PlatformView::SurfaceConfig config,
                                    const AndroidContextGL* share_context)
     : environment_(env),
-      window_(nullptr),
+      window_(window),
       config_(nullptr),
       surface_(EGL_NO_SURFACE),
       context_(EGL_NO_CONTEXT),
@@ -201,6 +170,17 @@
     return;
   }
 
+  // Create a surface for the configuration.
+
+  std::tie(success, surface_) =
+      CreateSurface(environment_->Display(), config_, window_);
+
+  if (!success) {
+    FTL_LOG(ERROR) << "Could not create the EGL surface.";
+    LogLastEGLError();
+    return;
+  }
+
   // Create a context for the configuration.
 
   std::tie(success, context_) = CreateContext(
@@ -213,22 +193,15 @@
     return;
   }
 
-  // On its own, this is not enough to guarantee that we will render in
-  // sRGB mode. We also need to query GL using the GrContext.
-
-  const char* exts = eglQueryString(environment_->Display(), EGL_EXTENSIONS);
-  srgb_support_ = strstr(exts, "EGL_KHR_gl_colorspace");
-
-  if (!this->CreatePBufferSurface()) {
-    FTL_LOG(ERROR) << "Could not create the EGL surface.";
-    LogLastEGLError();
-    return;
-  }
-
   // All done!
   valid_ = true;
 }
 
+AndroidContextGL::AndroidContextGL(ftl::RefPtr<AndroidEnvironmentGL> env,
+                                   PlatformView::SurfaceConfig config,
+                                   const AndroidContextGL* share_context)
+    : AndroidContextGL(env, nullptr, config, share_context) {}
+
 AndroidContextGL::~AndroidContextGL() {
   if (!TeardownContext(environment_->Display(), context_)) {
     FTL_LOG(ERROR) << "Could not tear down the EGL context. Possible resource leak.";
@@ -297,18 +270,18 @@
 
   TeardownSurface(environment_->Display(), surface_);
 
-  if (!this->CreateWindowSurface(window_)) {
+  bool success = false;
+  std::tie(success, surface_) =
+      CreateSurface(environment_->Display(), config_, window_);
+
+  MakeCurrent();
+
+  if (!success) {
     FTL_LOG(ERROR) << "Unable to create EGL window surface on resize.";
     return false;
   }
 
-  MakeCurrent();
-
   return true;
 }
 
-bool AndroidContextGL::SupportsSRGB() const {
-  return srgb_support_;
-}
-
 }  // namespace shell
diff --git a/shell/platform/android/android_context_gl.h b/shell/platform/android/android_context_gl.h
index 0cad635..aa2a081 100644
--- a/shell/platform/android/android_context_gl.h
+++ b/shell/platform/android/android_context_gl.h
@@ -17,11 +17,6 @@
 
 class AndroidContextGL : public ftl::RefCountedThreadSafe<AndroidContextGL> {
  public:
-
-  bool CreateWindowSurface(ftl::RefPtr<AndroidNativeWindow> window);
-
-  bool CreatePBufferSurface();
-
   ftl::RefPtr<AndroidEnvironmentGL> Environment() const;
 
   bool IsValid() const;
@@ -36,17 +31,22 @@
 
   bool Resize(const SkISize& size);
 
-  bool SupportsSRGB() const;
-
  private:
   ftl::RefPtr<AndroidEnvironmentGL> environment_;
   ftl::RefPtr<AndroidNativeWindow> window_;
   EGLConfig config_;
   EGLSurface surface_;
   EGLContext context_;
-  bool srgb_support_;
   bool valid_;
 
+  /// Creates a window surface context tied to the window handle for on-screen
+  /// rendering.
+  AndroidContextGL(ftl::RefPtr<AndroidEnvironmentGL> env,
+                   ftl::RefPtr<AndroidNativeWindow> window,
+                   PlatformView::SurfaceConfig config,
+                   const AndroidContextGL* share_context = nullptr);
+
+  /// Creates a pbuffer surface context for offscreen rendering.
   AndroidContextGL(ftl::RefPtr<AndroidEnvironmentGL> env,
                    PlatformView::SurfaceConfig config,
                    const AndroidContextGL* share_context = nullptr);
diff --git a/shell/platform/android/android_surface_gl.cc b/shell/platform/android/android_surface_gl.cc
index fbfd03c..9e86824 100644
--- a/shell/platform/android/android_surface_gl.cc
+++ b/shell/platform/android/android_surface_gl.cc
@@ -117,7 +117,7 @@
 
   // Create the onscreen context.
   onscreen_context_ = ftl::MakeRefCounted<AndroidContextGL>(
-      offscreen_context_->Environment(), config,
+      offscreen_context_->Environment(), std::move(window), config,
       offscreen_context_.get() /* sharegroup */);
 
   if (!onscreen_context_->IsValid()) {
@@ -125,11 +125,6 @@
     return false;
   }
 
-  if (!onscreen_context_->CreateWindowSurface(std::move(window))) {
-    onscreen_context_ = nullptr;
-    return false;
-  }
-
   return true;
 }
 
diff --git a/shell/platform/android/android_surface_gl.h b/shell/platform/android/android_surface_gl.h
index 29ef4e8..21a5768 100644
--- a/shell/platform/android/android_surface_gl.h
+++ b/shell/platform/android/android_surface_gl.h
@@ -47,21 +47,12 @@
 
   intptr_t GLContextFBO() const override;
 
-  sk_sp<SkColorSpace> ColorSpace() const override {
-    // TODO:
-    // We can render more consistently across devices when Android makes it
-    // possible to query for the color space of the display.
-    return onscreen_context_->SupportsSRGB() ? SkColorSpace::MakeSRGB()
-                                             : nullptr;
-  }
-
   void SetFlutterView(
       const fml::jni::JavaObjectWeakGlobalRef& flutter_view) override;
 
  private:
   ftl::RefPtr<AndroidContextGL> onscreen_context_;
   ftl::RefPtr<AndroidContextGL> offscreen_context_;
-  sk_sp<GrContext> gr_context_;
 
   FTL_DISALLOW_COPY_AND_ASSIGN(AndroidSurfaceGL);
 };
diff --git a/shell/platform/darwin/ios/ios_gl_context.h b/shell/platform/darwin/ios/ios_gl_context.h
index 5250675..51ad00f 100644
--- a/shell/platform/darwin/ios/ios_gl_context.h
+++ b/shell/platform/darwin/ios/ios_gl_context.h
@@ -34,10 +34,6 @@
 
   bool ResourceMakeCurrent();
 
-  sk_sp<SkColorSpace> ColorSpace() const {
-    return color_space_;
-  }
-
  private:
   fml::scoped_nsobject<CAEAGLLayer> layer_;
   fml::scoped_nsobject<EAGLContext> context_;
@@ -49,7 +45,6 @@
   GLuint depth_stencil_packed_buffer_;
   GLint storage_size_width_;
   GLint storage_size_height_;
-  sk_sp<SkColorSpace> color_space_;
   bool valid_;
 
   FTL_DISALLOW_COPY_AND_ASSIGN(IOSGLContext);
diff --git a/shell/platform/darwin/ios/ios_gl_context.mm b/shell/platform/darwin/ios/ios_gl_context.mm
index 082e3a1..4bb90ae 100644
--- a/shell/platform/darwin/ios/ios_gl_context.mm
+++ b/shell/platform/darwin/ios/ios_gl_context.mm
@@ -3,10 +3,6 @@
 // found in the LICENSE file.
 
 #include "flutter/shell/platform/darwin/ios/ios_gl_context.h"
-#include "third_party/skia/include/gpu/GrContextOptions.h"
-#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
-
-#include <UIKit/UIKit.h>
 
 namespace shell {
 
@@ -100,32 +96,14 @@
     }
   }
 
-  // TODO:
-  // iOS displays are more variable than just P3 or sRGB.  Reading the display
-  // gamut just tells us what color space it makes sense to render into.  We
-  // should use iOS APIs to perform the final correction step based on the
-  // device properties.  Ex: We can indicate that we have rendered in P3, and
-  // the framework will do the final adjustment for us.
-  NSOperatingSystemVersion version = [[NSProcessInfo processInfo]
-      operatingSystemVersion];
-  color_space_ = SkColorSpace::MakeSRGB();
-  if (version.majorVersion >= 10) {
-    UIDisplayGamut displayGamut =
-        [UIScreen mainScreen].traitCollection.displayGamut;
-    switch (displayGamut) {
-      case UIDisplayGamutP3:
-        // Should we consider using more than 8-bits of precision given that
-        // P3 specifies a wider range of colors?
-        color_space_ = SkColorSpace::MakeRGB(
-            SkColorSpace::kSRGB_RenderTargetGamma,
-            SkColorSpace::kDCIP3_D65_Gamut);
-        break;
-      default:
-        break;
-    }
+  // The default is RGBA
+  NSString* drawableColorFormat = kEAGLColorFormatRGBA8;
+
+  if (config.red_bits <= 5 && config.green_bits <= 6 && config.blue_bits <= 5 &&
+      config.alpha_bits == 0) {
+    drawableColorFormat = kEAGLColorFormatRGB565;
   }
 
-  NSString* drawableColorFormat = kEAGLColorFormatSRGBA8;
   layer_.get().drawableProperties = @{
     kEAGLDrawablePropertyColorFormat : drawableColorFormat,
     kEAGLDrawablePropertyRetainedBacking : @(NO),
diff --git a/shell/platform/darwin/ios/ios_surface_gl.h b/shell/platform/darwin/ios/ios_surface_gl.h
index c790048..5f2abb9 100644
--- a/shell/platform/darwin/ios/ios_surface_gl.h
+++ b/shell/platform/darwin/ios/ios_surface_gl.h
@@ -36,10 +36,6 @@
 
   intptr_t GLContextFBO() const override;
 
-  sk_sp<SkColorSpace> ColorSpace() const override {
-    return context_.ColorSpace();
-  }
-
  private:
   IOSGLContext context_;
 
diff --git a/shell/platform/darwin/ios/ios_surface_software.mm b/shell/platform/darwin/ios/ios_surface_software.mm
index 7595716..7ce5f97 100644
--- a/shell/platform/darwin/ios/ios_surface_software.mm
+++ b/shell/platform/darwin/ios/ios_surface_software.mm
@@ -63,9 +63,8 @@
     return sk_surface_;
   }
 
-  SkImageInfo info = SkImageInfo::MakeS32(size.fWidth, size.fHeight,
-                                          kPremul_SkAlphaType);
-  sk_surface_ = SkSurface::MakeRaster(info, nullptr);
+  sk_surface_ = SkSurface::MakeRasterN32Premul(size.fWidth, size.fHeight,
+                                               nullptr /* SkSurfaceProps as out */);
   return sk_surface_;
 }