mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This reverts commit f456423cfb820d07bb36e9a8979e3d75cc9d8d76. This is being reverted because it caused flutter/flutter#45098 (images don't load on iOS).
115 lines
3.4 KiB
C++
115 lines
3.4 KiB
C++
// Copyright 2013 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "flutter/shell/platform/embedder/embedder_surface_gl.h"
|
|
|
|
#include "flutter/shell/common/shell_io_manager.h"
|
|
|
|
namespace flutter {
|
|
|
|
EmbedderSurfaceGL::EmbedderSurfaceGL(
|
|
GLDispatchTable gl_dispatch_table,
|
|
bool fbo_reset_after_present,
|
|
std::unique_ptr<EmbedderExternalViewEmbedder> external_view_embedder)
|
|
: gl_dispatch_table_(gl_dispatch_table),
|
|
fbo_reset_after_present_(fbo_reset_after_present),
|
|
external_view_embedder_(std::move(external_view_embedder)) {
|
|
// Make sure all required members of the dispatch table are checked.
|
|
if (!gl_dispatch_table_.gl_make_current_callback ||
|
|
!gl_dispatch_table_.gl_clear_current_callback ||
|
|
!gl_dispatch_table_.gl_present_callback ||
|
|
!gl_dispatch_table_.gl_fbo_callback) {
|
|
return;
|
|
}
|
|
|
|
valid_ = true;
|
|
}
|
|
|
|
EmbedderSurfaceGL::~EmbedderSurfaceGL() = default;
|
|
|
|
// |EmbedderSurface|
|
|
bool EmbedderSurfaceGL::IsValid() const {
|
|
return valid_;
|
|
}
|
|
|
|
// |GPUSurfaceGLDelegate|
|
|
bool EmbedderSurfaceGL::GLContextMakeCurrent() {
|
|
return gl_dispatch_table_.gl_make_current_callback();
|
|
}
|
|
|
|
// |GPUSurfaceGLDelegate|
|
|
bool EmbedderSurfaceGL::GLContextClearCurrent() {
|
|
return gl_dispatch_table_.gl_clear_current_callback();
|
|
}
|
|
|
|
// |GPUSurfaceGLDelegate|
|
|
bool EmbedderSurfaceGL::GLContextPresent() {
|
|
return gl_dispatch_table_.gl_present_callback();
|
|
}
|
|
|
|
// |GPUSurfaceGLDelegate|
|
|
intptr_t EmbedderSurfaceGL::GLContextFBO() const {
|
|
return gl_dispatch_table_.gl_fbo_callback();
|
|
}
|
|
|
|
// |GPUSurfaceGLDelegate|
|
|
bool EmbedderSurfaceGL::GLContextFBOResetAfterPresent() const {
|
|
return fbo_reset_after_present_;
|
|
}
|
|
|
|
// |GPUSurfaceGLDelegate|
|
|
SkMatrix EmbedderSurfaceGL::GLContextSurfaceTransformation() const {
|
|
auto callback = gl_dispatch_table_.gl_surface_transformation_callback;
|
|
if (!callback) {
|
|
SkMatrix matrix;
|
|
matrix.setIdentity();
|
|
return matrix;
|
|
}
|
|
return callback();
|
|
}
|
|
|
|
// |GPUSurfaceGLDelegate|
|
|
ExternalViewEmbedder* EmbedderSurfaceGL::GetExternalViewEmbedder() {
|
|
return external_view_embedder_.get();
|
|
}
|
|
|
|
// |GPUSurfaceGLDelegate|
|
|
EmbedderSurfaceGL::GLProcResolver EmbedderSurfaceGL::GetGLProcResolver() const {
|
|
return gl_dispatch_table_.gl_proc_resolver;
|
|
}
|
|
|
|
// |EmbedderSurface|
|
|
std::unique_ptr<Surface> EmbedderSurfaceGL::CreateGPUSurface() {
|
|
const bool render_to_surface = !external_view_embedder_;
|
|
return std::make_unique<GPUSurfaceGL>(this, // GPU surface GL delegate
|
|
render_to_surface // render to surface
|
|
|
|
);
|
|
}
|
|
|
|
// |EmbedderSurface|
|
|
sk_sp<GrContext> EmbedderSurfaceGL::CreateResourceContext() const {
|
|
auto callback = gl_dispatch_table_.gl_make_resource_current_callback;
|
|
if (callback && callback()) {
|
|
if (auto context = ShellIOManager::CreateCompatibleResourceLoadingContext(
|
|
GrBackend::kOpenGL_GrBackend, GetGLInterface())) {
|
|
return context;
|
|
} else {
|
|
FML_LOG(ERROR)
|
|
<< "Internal error: Resource context available but could not create "
|
|
"a compatible Skia context.";
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
// The callback was not available or failed.
|
|
FML_LOG(ERROR)
|
|
<< "Could not create a resource context for async texture uploads. "
|
|
"Expect degraded performance. Set a valid make_resource_current "
|
|
"callback on FlutterOpenGLRendererConfig.";
|
|
return nullptr;
|
|
}
|
|
|
|
} // namespace flutter
|