Flutter Engine
 
Loading...
Searching...
No Matches
gpu_surface_gl_delegate.cc
Go to the documentation of this file.
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
6
8
9#include <cstring>
10
11#if !SLIMPELLER
12#include "third_party/skia/include/gpu/ganesh/gl/GrGLAssembleInterface.h"
13#include "third_party/skia/include/gpu/ganesh/gl/GrGLInterface.h"
14
15#if defined(FML_OS_ANDROID)
16#include "third_party/skia/include/gpu/ganesh/gl/egl/GrGLMakeEGLInterface.h"
17#endif
18
19#if defined(FML_OS_LINUX) && defined(SK_GLX)
20#include "third_party/skia/include/gpu/ganesh/gl/glx/GrGLMakeGLXInterface.h"
21#endif
22
23#if defined(FML_OS_MACOSX)
24#include "third_party/skia/include/gpu/ganesh/gl/mac/GrGLMakeMacInterface.h"
25#endif
26
27#if defined(FML_OS_IOS)
28#include "third_party/skia/include/gpu/ganesh/gl/ios/GrGLMakeIOSInterface.h"
29#endif
30#endif // !SLIMPELLER
31
32namespace flutter {
33
35
37 return false;
38}
39
46
50
55
56#if !SLIMPELLER
58 const GPUSurfaceGLDelegate::GLProcResolver& proc_resolver) {
59 // Version string prefix that identifies an OpenGL ES implementation.
60#define GPU_GL_VERSION 0x1F02
61 constexpr char kGLESVersionPrefix[] = "OpenGL ES";
62
63#ifdef WIN32
64 using GLGetStringProc = const char*(__stdcall*)(uint32_t);
65#else
66 using GLGetStringProc = const char* (*)(uint32_t);
67#endif
68
69 GLGetStringProc gl_get_string =
70 reinterpret_cast<GLGetStringProc>(proc_resolver("glGetString"));
71
72 FML_CHECK(gl_get_string)
73 << "The GL proc resolver could not resolve glGetString";
74
75 const char* gl_version_string = gl_get_string(GPU_GL_VERSION);
76
77 FML_CHECK(gl_version_string)
78 << "The GL proc resolver's glGetString(GL_VERSION) failed";
79
80 return strncmp(gl_version_string, kGLESVersionPrefix,
81 strlen(kGLESVersionPrefix)) == 0;
82}
83
84static sk_sp<const GrGLInterface> CreateGLInterface(
85 const GPUSurfaceGLDelegate::GLProcResolver& proc_resolver) {
86 if (proc_resolver == nullptr) {
87#if defined(FML_OS_ANDROID)
88 return GrGLInterfaces::MakeEGL();
89#elif defined(FML_OS_LINUX)
90#if defined(SK_GLX)
91 return GrGLInterfaces::MakeGLX();
92#else
93 return nullptr;
94#endif // defined(SK_GLX)
95#elif defined(FML_OS_IOS)
96 return GrGLInterfaces::MakeIOS();
97#elif defined(FML_OS_MACOSX)
98 return GrGLInterfaces::MakeMac();
99#else
100 // TODO(kjlubick) update this when Skia has a Windows target for making GL
101 // interfaces. For now, ask Skia to guess the native
102 // interface. This often leads to interesting results on most platforms.
103 return GrGLMakeNativeInterface();
104#endif
105 }
106
107 struct ProcResolverContext {
109 };
110
111 ProcResolverContext context = {proc_resolver};
112
113 GrGLGetProc gl_get_proc = [](void* context,
114 const char gl_proc_name[]) -> GrGLFuncPtr {
115 auto proc_resolver_context =
116 reinterpret_cast<ProcResolverContext*>(context);
117 return reinterpret_cast<GrGLFuncPtr>(
118 proc_resolver_context->resolver(gl_proc_name));
119 };
120
121 // glGetString indicates an OpenGL ES interface.
122 if (IsProcResolverOpenGLES(proc_resolver)) {
123 return GrGLMakeAssembledGLESInterface(&context, gl_get_proc);
124 }
125
126 // Fallback to OpenGL.
127 if (auto interface = GrGLMakeAssembledGLInterface(&context, gl_get_proc)) {
128 return interface;
129 }
130
131 FML_LOG(ERROR) << "Could not create a valid GL interface.";
132 return nullptr;
133}
134#endif // !SLIMPELLER
135
136sk_sp<const GrGLInterface> GPUSurfaceGLDelegate::GetGLInterface() const {
137#if !SLIMPELLER
139#else
140 return nullptr;
141#endif //! SLIMPELLER
142}
143
144sk_sp<const GrGLInterface>
146#if !SLIMPELLER
147 return CreateGLInterface(nullptr);
148#else
149 return nullptr;
150#endif // !SLIMPELLER
151}
152
154 return true;
155}
156
157} // namespace flutter
virtual bool AllowsDrawingWhenGpuDisabled() const
std::function< void *(const char *)> GLProcResolver
static sk_sp< const GrGLInterface > GetDefaultPlatformGLInterface()
virtual GLProcResolver GetGLProcResolver() const
virtual sk_sp< const GrGLInterface > GetGLInterface() const
virtual bool GLContextFBOResetAfterPresent() const
virtual SurfaceFrame::FramebufferInfo GLContextFramebufferInfo() const
virtual DlMatrix GLContextSurfaceTransformation() const
#define FML_LOG(severity)
Definition logging.h:101
#define FML_CHECK(condition)
Definition logging.h:104
#define GPU_GL_VERSION
impeller::Matrix DlMatrix
static sk_sp< const GrGLInterface > CreateGLInterface(const GPUSurfaceGLDelegate::GLProcResolver &proc_resolver)
static bool IsProcResolverOpenGLES(const GPUSurfaceGLDelegate::GLProcResolver &proc_resolver)
A 4x4 matrix using column-major storage.
Definition matrix.h:37