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() const11bool GPUSurfaceGLDelegate::GLContextFBOResetAfterPresent() const { 12 return false; 13 } 14 UseOffscreenSurface() const15bool GPUSurfaceGLDelegate::UseOffscreenSurface() const { 16 return false; 17 } 18 GLContextSurfaceTransformation() const19SkMatrix GPUSurfaceGLDelegate::GLContextSurfaceTransformation() const { 20 SkMatrix matrix; 21 matrix.setIdentity(); 22 return matrix; 23 } 24 GetGLProcResolver() const25GPUSurfaceGLDelegate::GLProcResolver GPUSurfaceGLDelegate::GetGLProcResolver() 26 const { 27 return nullptr; 28 } 29 IsProcResolverOpenGLES(GPUSurfaceGLDelegate::GLProcResolver proc_resolver)30static 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)53static 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() const89sk_sp<const GrGLInterface> GPUSurfaceGLDelegate::GetGLInterface() const { 90 return CreateGLInterface(GetGLProcResolver()); 91 } 92 93 sk_sp<const GrGLInterface> GetDefaultPlatformGLInterface()94GPUSurfaceGLDelegate::GetDefaultPlatformGLInterface() { 95 return CreateGLInterface(nullptr); 96 } 97 98 } // namespace flutter 99