15constexpr uint32_t kWindowFrameBufferId = 0;
18struct FramebufferBackingStore {
23typedef const impeller::GLProc<
decltype(glBlitFramebuffer)> BlitFramebufferProc;
25const BlitFramebufferProc& GetBlitFramebufferProc(
27 if (gl.BlitFramebuffer.IsAvailable()) {
28 return gl.BlitFramebuffer;
29 }
else if (gl.BlitFramebufferANGLE.IsAvailable()) {
30 return gl.BlitFramebufferANGLE;
42 : engine_(
engine), resolver_(resolver), enable_impeller_(enable_impeller) {}
47 if (!is_initialized_ && !Initialize()) {
51 auto store = std::make_unique<FramebufferBackingStore>();
53 gl_->GenTextures(1, &store->texture_id);
54 gl_->GenFramebuffers(1, &store->framebuffer_id);
56 gl_->BindFramebuffer(GL_FRAMEBUFFER, store->framebuffer_id);
58 gl_->BindTexture(GL_TEXTURE_2D, store->texture_id);
59 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
60 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
61 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
62 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
63 gl_->TexImage2D(GL_TEXTURE_2D, 0, format_.general_format, config.
size.
width,
65 GL_UNSIGNED_BYTE,
nullptr);
66 gl_->BindTexture(GL_TEXTURE_2D, 0);
68 if (enable_impeller_) {
71 gl_->FramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER,
72 GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
73 store->texture_id, 0, 4);
77 gl_->GenRenderbuffers(1, &depth_stencil);
78 gl_->BindRenderbuffer(GL_RENDERBUFFER, depth_stencil);
79 gl_->RenderbufferStorageMultisampleEXT(
86 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
87 GL_RENDERBUFFER, depth_stencil);
88 gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
89 GL_RENDERBUFFER, depth_stencil);
92 gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
93 GL_TEXTURE_2D, store->texture_id, 0);
113 auto user_data =
static_cast<FramebufferBackingStore*
>(
116 gl_->DeleteFramebuffers(1, &
user_data->framebuffer_id);
117 gl_->DeleteTextures(1, &
user_data->texture_id);
133 if (!is_initialized_ && !Initialize()) {
173 gl_->Disable(GL_SCISSOR_TEST);
174 gl_->BindFramebuffer(GL_READ_FRAMEBUFFER, source_id);
175 gl_->BindFramebuffer(GL_DRAW_FRAMEBUFFER, kWindowFrameBufferId);
177 auto blitFramebuffer = GetBlitFramebufferProc(*gl_);
194 view->OnFramePresented();
198bool CompositorOpenGL::Initialize() {
206 if (!
manager->render_context()->MakeCurrent()) {
210 gl_ = std::make_unique<impeller::ProcTableGLES>(resolver_);
211 if (!gl_->IsValid()) {
216 if (gl_->GetDescription()->HasExtension(
"GL_EXT_texture_format_BGRA8888")) {
217 format_.sized_format = GL_BGRA8_EXT;
218 format_.general_format = GL_BGRA_EXT;
220 format_.sized_format = GL_RGBA8;
221 format_.general_format = GL_RGBA;
224 if (!gl_->BlitFramebuffer.IsAvailable() &&
225 !gl_->BlitFramebufferANGLE.IsAvailable()) {
226 FML_LOG(ERROR) <<
"Unable to find OpenGL blit framebuffer procedure.";
230 is_initialized_ =
true;
234bool CompositorOpenGL::Clear(FlutterWindowsView*
view) {
238 if (!
view->OnEmptyFrameGenerated()) {
251 gl_->ClearColor(0.0f, 0.0f, 0.0f, 0.0f);
252 gl_->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
258 view->OnFramePresented();
bool Present(FlutterWindowsView *view, const FlutterLayer **layers, size_t layers_count) override
|Compositor|
bool CreateBackingStore(const FlutterBackingStoreConfig &config, FlutterBackingStore *result) override
|Compositor|
bool CollectBackingStore(const FlutterBackingStore *store) override
|Compositor|
CompositorOpenGL(FlutterWindowsEngine *engine, impeller::ProcTableGLES::Resolver resolver, bool enable_impeller)
egl::Manager * egl_manager() const
std::function< void *(const char *function_name)> Resolver
@ kFlutterLayerContentTypeBackingStore
@ kFlutterOpenGLTargetTypeFramebuffer
@ kFlutterBackingStoreTypeOpenGL
const FlutterLayer size_t layers_count
const FlutterLayer ** layers
#define FML_LOG(severity)
#define FML_UNREACHABLE()
#define FML_DCHECK(condition)
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font manager
FlutterSize size
The size of the render target the engine expects to render into.
FlutterBackingStoreType type
Specifies the type of backing store.
FlutterOpenGLBackingStore open_gl
The description of the OpenGL backing store.
FlutterLayerContentType type
const FlutterBackingStore * backing_store
FlutterSize size
The size of the layer (in physical pixels).
FlutterOpenGLTargetType type
FlutterOpenGLFramebuffer framebuffer
uint32_t name
The name of the framebuffer.
VoidCallback destruction_callback
void * user_data
User data to be returned on the invocation of the destruction callback.