5#include "flutter/shell/platform/windows/compositor_opengl.h"
8#include "flutter/shell/platform/windows/flutter_windows_engine.h"
9#include "flutter/shell/platform/windows/flutter_windows_view.h"
15constexpr uint32_t kWindowFrameBufferId = 0;
18struct FramebufferBackingStore {
26 if (description->
HasExtension(
"GL_EXT_texture_format_BGRA8888")) {
28 }
else if (description->
HasExtension(
"GL_APPLE_texture_format_BGRA8888") &&
40 : engine_(
engine), resolver_(resolver) {}
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);
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) {
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);
97 size_t layers_count) {
101 if (layers_count == 0) {
105 if (!is_initialized_ && !Initialize()) {
145 gl_->Disable(GL_SCISSOR_TEST);
147 gl_->BindFramebuffer(GL_READ_FRAMEBUFFER, source_id);
148 gl_->BindFramebuffer(GL_DRAW_FRAMEBUFFER, kWindowFrameBufferId);
150 gl_->BlitFramebuffer(0,
170bool CompositorOpenGL::Initialize() {
178 if (!
manager->render_context()->MakeCurrent()) {
182 gl_ = std::make_unique<impeller::ProcTableGLES>(resolver_);
183 if (!gl_->IsValid()) {
188 format_ = GetSupportedTextureFormat(gl_->GetDescription());
189 is_initialized_ =
true;
193bool CompositorOpenGL::Clear(FlutterWindowsView* view) {
197 if (!view->OnEmptyFrameGenerated()) {
205 egl::WindowSurface*
surface = view->surface();
210 gl_->ClearColor(0.0f, 0.0f, 0.0f, 0.0f);
211 gl_->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
217 view->OnFramePresented();
bool Present(FlutterWindowsView *view, const FlutterLayer **layers, size_t layers_count) override
|Compositor|
bool CreateBackingStore(const FlutterBackingStoreConfig &config, FlutterBackingStore *result) override
|Compositor|
CompositorOpenGL(FlutterWindowsEngine *engine, impeller::ProcTableGLES::Resolver resolver)
bool CollectBackingStore(const FlutterBackingStore *store) override
|Compositor|
egl::Manager * egl_manager() const
virtual void OnFramePresented()
egl::WindowSurface * surface() const
bool OnFrameGenerated(size_t width, size_t height)
virtual bool IsValid() const
Version GetGlVersion() const
bool HasExtension(const std::string &ext) const
std::function< void *(const char *function_name)> Resolver
@ kFlutterLayerContentTypeBackingStore
@ kFlutterOpenGLTargetTypeFramebuffer
@ kFlutterBackingStoreTypeOpenGL
#define FML_DCHECK(condition)
it will be possible to load the file into Perfetto s trace viewer 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.
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).
FlutterOpenGLFramebuffer framebuffer
uint32_t name
The name of the framebuffer.
constexpr bool IsAtLeast(const Version &other) const