|  | // Copyright 2016 The Chromium 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 SHELL_GPU_GPU_SURFACE_GL_H_ | 
|  | #define SHELL_GPU_GPU_SURFACE_GL_H_ | 
|  |  | 
|  | #include <functional> | 
|  | #include <memory> | 
|  |  | 
|  | #include "flutter/flow/embedded_views.h" | 
|  | #include "flutter/fml/macros.h" | 
|  | #include "flutter/fml/memory/weak_ptr.h" | 
|  | #include "flutter/shell/common/surface.h" | 
|  | #include "third_party/skia/include/gpu/GrContext.h" | 
|  |  | 
|  | namespace shell { | 
|  |  | 
|  | class GPUSurfaceGLDelegate { | 
|  | public: | 
|  | virtual bool GLContextMakeCurrent() = 0; | 
|  |  | 
|  | virtual bool GLContextClearCurrent() = 0; | 
|  |  | 
|  | virtual bool GLContextPresent() = 0; | 
|  |  | 
|  | virtual intptr_t GLContextFBO() const = 0; | 
|  |  | 
|  | virtual bool GLContextFBOResetAfterPresent() const { return false; } | 
|  |  | 
|  | virtual bool UseOffscreenSurface() const { return false; } | 
|  |  | 
|  | virtual SkMatrix GLContextSurfaceTransformation() const { | 
|  | SkMatrix matrix; | 
|  | matrix.setIdentity(); | 
|  | return matrix; | 
|  | } | 
|  |  | 
|  | virtual flow::ExternalViewEmbedder* GetExternalViewEmbedder() { | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | using GLProcResolver = | 
|  | std::function<void* /* proc name */ (const char* /* proc address */)>; | 
|  | virtual GLProcResolver GetGLProcResolver() const { return nullptr; } | 
|  | }; | 
|  |  | 
|  | class GPUSurfaceGL : public Surface { | 
|  | public: | 
|  | GPUSurfaceGL(GPUSurfaceGLDelegate* delegate); | 
|  |  | 
|  | ~GPUSurfaceGL() override; | 
|  |  | 
|  | // |shell::Surface| | 
|  | bool IsValid() override; | 
|  |  | 
|  | // |shell::Surface| | 
|  | std::unique_ptr<SurfaceFrame> AcquireFrame(const SkISize& size) override; | 
|  |  | 
|  | // |shell::Surface| | 
|  | SkMatrix GetRootTransformation() const override; | 
|  |  | 
|  | // |shell::Surface| | 
|  | GrContext* GetContext() override; | 
|  |  | 
|  | // |shell::Surface| | 
|  | flow::ExternalViewEmbedder* GetExternalViewEmbedder() override; | 
|  |  | 
|  | private: | 
|  | GPUSurfaceGLDelegate* delegate_; | 
|  | GPUSurfaceGLDelegate::GLProcResolver proc_resolver_; | 
|  | sk_sp<GrContext> context_; | 
|  | sk_sp<SkSurface> onscreen_surface_; | 
|  | sk_sp<SkSurface> offscreen_surface_; | 
|  | bool valid_ = false; | 
|  | fml::WeakPtrFactory<GPUSurfaceGL> weak_factory_; | 
|  |  | 
|  | bool CreateOrUpdateSurfaces(const SkISize& size); | 
|  |  | 
|  | sk_sp<SkSurface> AcquireRenderSurface( | 
|  | const SkISize& untransformed_size, | 
|  | const SkMatrix& root_surface_transformation); | 
|  |  | 
|  | bool PresentSurface(SkCanvas* canvas); | 
|  |  | 
|  | bool IsProcResolverOpenGLES(); | 
|  |  | 
|  | FML_DISALLOW_COPY_AND_ASSIGN(GPUSurfaceGL); | 
|  | }; | 
|  |  | 
|  | }  // namespace shell | 
|  |  | 
|  | #endif  // SHELL_GPU_GPU_SURFACE_GL_H_ |