50 if (!is_initialized_ && !Initialize()) {
54 auto store = std::make_unique<FramebufferBackingStore>();
56 gl_->GenFramebuffers(1, &store->framebuffer_id);
57 gl_->BindFramebuffer(GL_FRAMEBUFFER, store->framebuffer_id);
59 if (enable_impeller_) {
60 if (supports_implicit_msaa_) {
61 gl_->GenTextures(1, &store->texture_id);
62 gl_->BindTexture(GL_TEXTURE_2D, store->texture_id);
63 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
64 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
65 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
66 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
67 gl_->TexImage2D(GL_TEXTURE_2D, 0, format_.sized_format, config.size.width,
68 config.size.height, 0, format_.general_format,
69 GL_UNSIGNED_BYTE,
nullptr);
70 gl_->BindTexture(GL_TEXTURE_2D, 0);
73 gl_->FramebufferTexture2DMultisampleEXT(
74 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
75 store->texture_id, 0, 4);
78 gl_->GenRenderbuffers(1, &store->depth_stencil_id);
79 gl_->BindRenderbuffer(GL_RENDERBUFFER, store->depth_stencil_id);
80 gl_->RenderbufferStorageMultisampleEXT(
81 GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, config.size.width,
83 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
84 GL_RENDERBUFFER, store->depth_stencil_id);
85 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
86 GL_RENDERBUFFER, store->depth_stencil_id);
87 }
else if (supports_offscreen_msaa_) {
89 gl_->GenRenderbuffers(1, &store->color_renderbuffer_id);
90 gl_->BindRenderbuffer(GL_RENDERBUFFER, store->color_renderbuffer_id);
91 gl_->RenderbufferStorageMultisample(
92 GL_RENDERBUFFER, 4, format_.sized_format, config.size.width,
94 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
96 store->color_renderbuffer_id);
99 gl_->GenRenderbuffers(1, &store->depth_stencil_id);
100 gl_->BindRenderbuffer(GL_RENDERBUFFER, store->depth_stencil_id);
101 gl_->RenderbufferStorageMultisample(
102 GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, config.size.width,
104 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
105 GL_RENDERBUFFER, store->depth_stencil_id);
106 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
107 GL_RENDERBUFFER, store->depth_stencil_id);
109 gl_->GenTextures(1, &store->texture_id);
110 gl_->BindTexture(GL_TEXTURE_2D, store->texture_id);
111 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
112 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
113 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
114 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
115 gl_->TexImage2D(GL_TEXTURE_2D, 0, format_.sized_format, config.size.width,
116 config.size.height, 0, format_.general_format,
117 GL_UNSIGNED_BYTE,
nullptr);
118 gl_->BindTexture(GL_TEXTURE_2D, 0);
120 gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
121 GL_TEXTURE_2D, store->texture_id, 0);
123 gl_->GenRenderbuffers(1, &store->depth_stencil_id);
124 gl_->BindRenderbuffer(GL_RENDERBUFFER, store->depth_stencil_id);
125 gl_->RenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
126 config.size.width, config.size.height);
127 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
128 GL_RENDERBUFFER, store->depth_stencil_id);
129 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
130 GL_RENDERBUFFER, store->depth_stencil_id);
133 gl_->GenTextures(1, &store->texture_id);
134 gl_->BindTexture(GL_TEXTURE_2D, store->texture_id);
135 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
136 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
137 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
138 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
139 gl_->TexImage2D(GL_TEXTURE_2D, 0, format_.sized_format, config.size.width,
140 config.size.height, 0, format_.general_format,
141 GL_UNSIGNED_BYTE,
nullptr);
142 gl_->BindTexture(GL_TEXTURE_2D, 0);
144 gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
145 GL_TEXTURE_2D, store->texture_id, 0);
148 result->type = kFlutterBackingStoreTypeOpenGL;
149 result->open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
150 result->open_gl.framebuffer.name = store->framebuffer_id;
151 result->open_gl.framebuffer.target = format_.sized_format;
152 result->open_gl.framebuffer.user_data = store.release();
153 result->open_gl.framebuffer.destruction_callback = [](
void*
user_data) {