15 constexpr uint32_t kWindowFrameBufferId = 0;
18 struct FramebufferBackingStore {
25 int GetSupportedTextureFormat(
const impeller::DescriptionGLES* description) {
26 if (description->HasExtension(
"GL_EXT_texture_format_BGRA8888")) {
28 }
else if (description->HasExtension(
"GL_APPLE_texture_format_BGRA8888") &&
29 description->GetGlVersion().IsAtLeast(impeller::Version(3, 0))) {
39 impeller::ProcTableGLES::Resolver resolver)
40 : engine_(engine), resolver_(resolver) {}
43 const FlutterBackingStoreConfig& config,
44 FlutterBackingStore* result) {
45 if (!is_initialized_ && !Initialize()) {
49 auto store = std::make_unique<FramebufferBackingStore>();
51 gl_->GenTextures(1, &store->texture_id);
52 gl_->GenFramebuffers(1, &store->framebuffer_id);
54 gl_->BindFramebuffer(GL_FRAMEBUFFER, store->framebuffer_id);
56 gl_->BindTexture(GL_TEXTURE_2D, store->texture_id);
57 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
58 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
59 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
60 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
61 gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, config.size.width,
62 config.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
63 gl_->BindTexture(GL_TEXTURE_2D, 0);
65 gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT,
66 GL_TEXTURE_2D, store->texture_id, 0);
68 result->type = kFlutterBackingStoreTypeOpenGL;
69 result->open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
70 result->open_gl.framebuffer.name = store->framebuffer_id;
71 result->open_gl.framebuffer.target = format_;
72 result->open_gl.framebuffer.user_data = store.release();
73 result->open_gl.framebuffer.destruction_callback = [](
void*
user_data) {
81 FML_DCHECK(is_initialized_);
82 FML_DCHECK(store->type == kFlutterBackingStoreTypeOpenGL);
83 FML_DCHECK(store->open_gl.type == kFlutterOpenGLTargetTypeFramebuffer);
85 auto user_data =
static_cast<FramebufferBackingStore*
>(
86 store->open_gl.framebuffer.user_data);
88 gl_->DeleteFramebuffers(1, &
user_data->framebuffer_id);
89 gl_->DeleteTextures(1, &
user_data->texture_id);
96 const FlutterLayer** layers,
97 size_t layers_count) {
104 if (layers_count == 0) {
108 if (!is_initialized_ && !Initialize()) {
117 FML_DCHECK(is_initialized_);
118 FML_DCHECK(layers_count == 1);
119 FML_DCHECK(layers[0]->offset.x == 0 && layers[0]->offset.y == 0);
120 FML_DCHECK(layers[0]->
type == kFlutterLayerContentTypeBackingStore);
121 FML_DCHECK(layers[0]->backing_store->type == kFlutterBackingStoreTypeOpenGL);
122 FML_DCHECK(layers[0]->backing_store->open_gl.type ==
123 kFlutterOpenGLTargetTypeFramebuffer);
125 auto width = layers[0]->size.width;
126 auto height = layers[0]->size.height;
135 FML_DCHECK(view->
surface() !=
nullptr);
143 auto source_id = layers[0]->backing_store->open_gl.framebuffer.name;
148 gl_->Disable(GL_SCISSOR_TEST);
150 gl_->BindFramebuffer(GL_READ_FRAMEBUFFER, source_id);
151 gl_->BindFramebuffer(GL_DRAW_FRAMEBUFFER, kWindowFrameBufferId);
153 gl_->BlitFramebuffer(0,
173 bool CompositorOpenGL::Initialize() {
174 FML_DCHECK(!is_initialized_);
185 gl_ = std::make_unique<impeller::ProcTableGLES>(resolver_);
186 if (!gl_->IsValid()) {
191 format_ = GetSupportedTextureFormat(gl_->GetDescription());
192 is_initialized_ =
true;
196 bool CompositorOpenGL::Clear(FlutterWindowsView* view) {
197 FML_DCHECK(is_initialized_);
200 if (!view->OnEmptyFrameGenerated()) {
205 FML_DCHECK(view->surface() !=
nullptr);
206 FML_DCHECK(view->surface()->IsValid());
208 egl::WindowSurface* surface = view->surface();
209 if (!surface->MakeCurrent()) {
213 gl_->ClearColor(0.0f, 0.0f, 0.0f, 0.0f);
214 gl_->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
216 if (!surface->SwapBuffers()) {
220 view->OnFramePresented();