Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 08348c9

Browse files
[Linux] Configure depth and stencil framebuffer attachments needed for Impeller (#56516)
1 parent a57a4a7 commit 08348c9

File tree

5 files changed

+100
-0
lines changed

5 files changed

+100
-0
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44969,6 +44969,7 @@ ORIGIN: ../../../flutter/shell/platform/linux/fl_event_channel.cc + ../../../flu
4496944969
ORIGIN: ../../../flutter/shell/platform/linux/fl_event_channel_test.cc + ../../../flutter/LICENSE
4497044970
ORIGIN: ../../../flutter/shell/platform/linux/fl_framebuffer.cc + ../../../flutter/LICENSE
4497144971
ORIGIN: ../../../flutter/shell/platform/linux/fl_framebuffer.h + ../../../flutter/LICENSE
44972+
ORIGIN: ../../../flutter/shell/platform/linux/fl_framebuffer_test.cc + ../../../flutter/LICENSE
4497244973
ORIGIN: ../../../flutter/shell/platform/linux/fl_gnome_settings.cc + ../../../flutter/LICENSE
4497344974
ORIGIN: ../../../flutter/shell/platform/linux/fl_gnome_settings.h + ../../../flutter/LICENSE
4497444975
ORIGIN: ../../../flutter/shell/platform/linux/fl_gnome_settings_test.cc + ../../../flutter/LICENSE
@@ -47868,6 +47869,7 @@ FILE: ../../../flutter/shell/platform/linux/fl_event_channel.cc
4786847869
FILE: ../../../flutter/shell/platform/linux/fl_event_channel_test.cc
4786947870
FILE: ../../../flutter/shell/platform/linux/fl_framebuffer.cc
4787047871
FILE: ../../../flutter/shell/platform/linux/fl_framebuffer.h
47872+
FILE: ../../../flutter/shell/platform/linux/fl_framebuffer_test.cc
4787147873
FILE: ../../../flutter/shell/platform/linux/fl_gnome_settings.cc
4787247874
FILE: ../../../flutter/shell/platform/linux/fl_gnome_settings.h
4787347875
FILE: ../../../flutter/shell/platform/linux/fl_gnome_settings_test.cc

shell/platform/linux/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ executable("flutter_linux_unittests") {
211211
"fl_dart_project_test.cc",
212212
"fl_engine_test.cc",
213213
"fl_event_channel_test.cc",
214+
"fl_framebuffer_test.cc",
214215
"fl_gnome_settings_test.cc",
215216
"fl_json_message_codec_test.cc",
216217
"fl_json_method_codec_test.cc",

shell/platform/linux/fl_framebuffer.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,19 @@ FlFramebuffer* fl_framebuffer_new(GLint format, size_t width, size_t height) {
6363
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
6464
provider->texture_id, 0);
6565

66+
GLuint depth_stencil;
67+
glGenRenderbuffers(1, &depth_stencil);
68+
glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil);
69+
glRenderbufferStorage(GL_RENDERBUFFER, // target
70+
GL_DEPTH24_STENCIL8, // internal format
71+
width, // width
72+
height // height
73+
);
74+
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
75+
GL_RENDERBUFFER, depth_stencil);
76+
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
77+
GL_RENDERBUFFER, depth_stencil);
78+
6679
return provider;
6780
}
6881

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "gtest/gtest.h"
6+
7+
#include "flutter/common/constants.h"
8+
#include "flutter/fml/logging.h"
9+
#include "flutter/shell/platform/linux/fl_framebuffer.h"
10+
#include "flutter/shell/platform/linux/testing/mock_epoxy.h"
11+
12+
TEST(FlFramebufferTest, HasDepthStencil) {
13+
::testing::NiceMock<flutter::testing::MockEpoxy> epoxy;
14+
15+
g_autoptr(FlFramebuffer) framebuffer = fl_framebuffer_new(GL_RGB, 100, 100);
16+
17+
GLint depth_type = GL_NONE;
18+
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
19+
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,
20+
&depth_type);
21+
EXPECT_NE(depth_type, GL_NONE);
22+
23+
GLint stencil_type = GL_NONE;
24+
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
25+
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,
26+
&stencil_type);
27+
EXPECT_NE(stencil_type, GL_NONE);
28+
}

shell/platform/linux/testing/mock_epoxy.cc

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// found in the LICENSE file.
55

66
#include "flutter/shell/platform/linux/testing/mock_epoxy.h"
7+
#include "flutter/fml/logging.h"
78

89
using namespace flutter::testing;
910

@@ -352,10 +353,14 @@ EGLBoolean _eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) {
352353

353354
static GLuint bound_texture_2d;
354355

356+
static std::map<GLenum, GLuint> framebuffer_renderbuffers;
357+
355358
void _glAttachShader(GLuint program, GLuint shader) {}
356359

357360
static void _glBindFramebuffer(GLenum target, GLuint framebuffer) {}
358361

362+
static void _glBindRenderbuffer(GLenum target, GLuint framebuffer) {}
363+
359364
static void _glBindTexture(GLenum target, GLuint texture) {
360365
if (target == GL_TEXTURE_2D) {
361366
bound_texture_2d = texture;
@@ -396,6 +401,13 @@ void _glDeleteShader(GLuint shader) {}
396401

397402
void _glDeleteTextures(GLsizei n, const GLuint* textures) {}
398403

404+
static void _glFramebufferRenderbuffer(GLenum target,
405+
GLenum attachment,
406+
GLenum renderbuffertarget,
407+
GLuint renderbuffer) {
408+
framebuffer_renderbuffers[attachment] = renderbuffer;
409+
}
410+
399411
static void _glFramebufferTexture2D(GLenum target,
400412
GLenum attachment,
401413
GLenum textarget,
@@ -414,6 +426,26 @@ static void _glGenFramebuffers(GLsizei n, GLuint* framebuffers) {
414426
}
415427
}
416428

429+
static void _glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) {
430+
for (GLsizei i = 0; i < n; i++) {
431+
renderbuffers[i] = 0;
432+
}
433+
}
434+
435+
static void _glGetFramebufferAttachmentParameteriv(GLenum target,
436+
GLenum attachment,
437+
GLenum pname,
438+
GLint* params) {
439+
if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) {
440+
auto it = framebuffer_renderbuffers.find(attachment);
441+
*params =
442+
(it != framebuffer_renderbuffers.end()) ? GL_RENDERBUFFER : GL_NONE;
443+
} else if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) {
444+
auto it = framebuffer_renderbuffers.find(attachment);
445+
*params = (it != framebuffer_renderbuffers.end()) ? it->second : 0;
446+
}
447+
}
448+
417449
static void _glGetIntegerv(GLenum pname, GLint* data) {
418450
if (pname == GL_TEXTURE_BINDING_2D) {
419451
*data = bound_texture_2d;
@@ -466,6 +498,11 @@ static GLenum _glGetError() {
466498

467499
void _glLinkProgram(GLuint program) {}
468500

501+
void _glRenderbufferStorage(GLenum target,
502+
GLenum internalformat,
503+
GLsizei width,
504+
GLsizei height) {}
505+
469506
void _glShaderSource(GLuint shader,
470507
GLsizei count,
471508
const GLchar* const* string,
@@ -536,6 +573,7 @@ EGLBoolean (*epoxy_eglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
536573

537574
void (*epoxy_glAttachShader)(GLuint program, GLuint shader);
538575
void (*epoxy_glBindFramebuffer)(GLenum target, GLuint framebuffer);
576+
void (*epoxy_glBindRenderbuffer)(GLenum target, GLuint renderbuffer);
539577
void (*epoxy_glBindTexture)(GLenum target, GLuint texture);
540578
void (*epoxy_glBlitFramebuffer)(GLint srcX0,
541579
GLint srcY0,
@@ -553,14 +591,26 @@ GLuint (*epoxy_glCreateShader)(GLenum shaderType);
553591
void (*epoxy_glDeleteFramebuffers)(GLsizei n, const GLuint* framebuffers);
554592
void (*expoxy_glDeleteShader)(GLuint shader);
555593
void (*epoxy_glDeleteTextures)(GLsizei n, const GLuint* textures);
594+
void (*epoxy_glFramebufferRenderbuffer)(GLenum target,
595+
GLenum attachment,
596+
GLenum renderbuffertarget,
597+
GLuint renderbuffer);
556598
void (*epoxy_glFramebufferTexture2D)(GLenum target,
557599
GLenum attachment,
558600
GLenum textarget,
559601
GLuint texture,
560602
GLint level);
603+
void (*epoxy_glGetFramebufferAttachmentParameteriv)(GLenum target,
604+
GLenum attachment,
605+
GLenum pname,
606+
GLint* params);
561607
void (*epoxy_glGenFramebuffers)(GLsizei n, GLuint* framebuffers);
562608
void (*epoxy_glGenTextures)(GLsizei n, GLuint* textures);
563609
void (*epoxy_glLinkProgram)(GLuint program);
610+
void (*epoxy_glRenderbufferStorage)(GLenum target,
611+
GLenum internalformat,
612+
GLsizei width,
613+
GLsizei height);
564614
void (*epoxy_glShaderSource)(GLuint shader,
565615
GLsizei count,
566616
const GLchar* const* string,
@@ -595,6 +645,7 @@ static void library_init() {
595645

596646
epoxy_glAttachShader = _glAttachShader;
597647
epoxy_glBindFramebuffer = _glBindFramebuffer;
648+
epoxy_glBindRenderbuffer = _glBindRenderbuffer;
598649
epoxy_glBindTexture = _glBindTexture;
599650
epoxy_glBlitFramebuffer = _glBlitFramebuffer;
600651
epoxy_glCompileShader = _glCompileShader;
@@ -604,16 +655,21 @@ static void library_init() {
604655
epoxy_glDeleteFramebuffers = _glDeleteFramebuffers;
605656
epoxy_glDeleteShader = _glDeleteShader;
606657
epoxy_glDeleteTextures = _glDeleteTextures;
658+
epoxy_glFramebufferRenderbuffer = _glFramebufferRenderbuffer;
607659
epoxy_glFramebufferTexture2D = _glFramebufferTexture2D;
608660
epoxy_glGenFramebuffers = _glGenFramebuffers;
661+
epoxy_glGenRenderbuffers = _glGenRenderbuffers;
609662
epoxy_glGenTextures = _glGenTextures;
663+
epoxy_glGetFramebufferAttachmentParameteriv =
664+
_glGetFramebufferAttachmentParameteriv;
610665
epoxy_glGetIntegerv = _glGetIntegerv;
611666
epoxy_glGetProgramiv = _glGetProgramiv;
612667
epoxy_glGetProgramInfoLog = _glGetProgramInfoLog;
613668
epoxy_glGetShaderiv = _glGetShaderiv;
614669
epoxy_glGetShaderInfoLog = _glGetShaderInfoLog;
615670
epoxy_glGetString = _glGetString;
616671
epoxy_glLinkProgram = _glLinkProgram;
672+
epoxy_glRenderbufferStorage = _glRenderbufferStorage;
617673
epoxy_glShaderSource = _glShaderSource;
618674
epoxy_glTexParameterf = _glTexParameterf;
619675
epoxy_glTexParameteri = _glTexParameteri;

0 commit comments

Comments
 (0)