• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "flutter/shell/gpu/gpu_surface_gl_delegate.h"
6 
7 #include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h"
8 
9 namespace flutter {
10 
GLContextFBOResetAfterPresent() const11 bool GPUSurfaceGLDelegate::GLContextFBOResetAfterPresent() const {
12   return false;
13 }
14 
UseOffscreenSurface() const15 bool GPUSurfaceGLDelegate::UseOffscreenSurface() const {
16   return false;
17 }
18 
GLContextSurfaceTransformation() const19 SkMatrix GPUSurfaceGLDelegate::GLContextSurfaceTransformation() const {
20   SkMatrix matrix;
21   matrix.setIdentity();
22   return matrix;
23 }
24 
GetGLProcResolver() const25 GPUSurfaceGLDelegate::GLProcResolver GPUSurfaceGLDelegate::GetGLProcResolver()
26     const {
27   return nullptr;
28 }
29 
IsProcResolverOpenGLES(GPUSurfaceGLDelegate::GLProcResolver proc_resolver)30 static bool IsProcResolverOpenGLES(
31     GPUSurfaceGLDelegate::GLProcResolver proc_resolver) {
32   // Version string prefix that identifies an OpenGL ES implementation.
33 #define GPU_GL_VERSION 0x1F02
34   constexpr char kGLESVersionPrefix[] = "OpenGL ES";
35 
36   using GLGetStringProc = const char* (*)(uint32_t);
37 
38   GLGetStringProc gl_get_string =
39       reinterpret_cast<GLGetStringProc>(proc_resolver("glGetString"));
40 
41   FML_CHECK(gl_get_string)
42       << "The GL proc resolver could not resolve glGetString";
43 
44   const char* gl_version_string = gl_get_string(GPU_GL_VERSION);
45 
46   FML_CHECK(gl_version_string)
47       << "The GL proc resolver's glGetString(GL_VERSION) failed";
48 
49   return strncmp(gl_version_string, kGLESVersionPrefix,
50                  strlen(kGLESVersionPrefix)) == 0;
51 }
52 
CreateGLInterface(GPUSurfaceGLDelegate::GLProcResolver proc_resolver)53 static sk_sp<const GrGLInterface> CreateGLInterface(
54     GPUSurfaceGLDelegate::GLProcResolver proc_resolver) {
55   if (proc_resolver == nullptr) {
56     // If there is no custom proc resolver, ask Skia to guess the native
57     // interface. This often leads to interesting results on most platforms.
58     return GrGLMakeNativeInterface();
59   }
60 
61   struct ProcResolverContext {
62     GPUSurfaceGLDelegate::GLProcResolver resolver;
63   };
64 
65   ProcResolverContext context = {proc_resolver};
66 
67   GrGLGetProc gl_get_proc = [](void* context,
68                                const char gl_proc_name[]) -> GrGLFuncPtr {
69     auto proc_resolver_context =
70         reinterpret_cast<ProcResolverContext*>(context);
71     return reinterpret_cast<GrGLFuncPtr>(
72         proc_resolver_context->resolver(gl_proc_name));
73   };
74 
75   // glGetString indicates an OpenGL ES interface.
76   if (IsProcResolverOpenGLES(proc_resolver)) {
77     return GrGLMakeAssembledGLESInterface(&context, gl_get_proc);
78   }
79 
80   // Fallback to OpenGL.
81   if (auto interface = GrGLMakeAssembledGLInterface(&context, gl_get_proc)) {
82     return interface;
83   }
84 
85   FML_LOG(ERROR) << "Could not create a valid GL interface.";
86   return nullptr;
87 }
88 
GetGLInterface() const89 sk_sp<const GrGLInterface> GPUSurfaceGLDelegate::GetGLInterface() const {
90   return CreateGLInterface(GetGLProcResolver());
91 }
92 
93 sk_sp<const GrGLInterface>
GetDefaultPlatformGLInterface()94 GPUSurfaceGLDelegate::GetDefaultPlatformGLInterface() {
95   return CreateGLInterface(nullptr);
96 }
97 
98 }  // namespace flutter
99