Use paint and pick context to get framebuffer

Mutter and Clutter was changed to pass around the current target
framebuffer via the paint context instead of via the deprecated Cogl
framebuffer stack.

The framebuffer stack has also been removed from Cogl so change to use
the one in the paint context instead.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/827
This commit is contained in:
Jonas Ådahl 2019-11-22 18:36:17 +01:00 committed by Georges Basile Stavracas Neto
parent 988a0e7314
commit 632a643994
10 changed files with 82 additions and 47 deletions

View File

@ -472,24 +472,39 @@ class ObjInspector extends St.ScrollView {
var RedBorderEffect = GObject.registerClass(
class RedBorderEffect extends Clutter.Effect {
_init() {
super._init();
this._pipeline = null;
}
vfunc_paint(paintContext) {
let framebuffer = paintContext.get_framebuffer();
let coglContext = framebuffer.get_context();
let actor = this.get_actor();
actor.continue_paint(paintContext);
if (!this._pipeline) {
let color = new Cogl.Color();
color.init_from_4ub(0xff, 0, 0, 0xc4);
Cogl.set_source_color(color);
this._pipeline = new Cogl.Pipeline(coglContext);
this._pipeline.set_color(color);
}
let alloc = actor.get_allocation_box();
let width = 2;
// clockwise order
Cogl.rectangle(0, 0, alloc.get_width(), width);
Cogl.rectangle(alloc.get_width() - width, width,
framebuffer.draw_rectangle(this._pipeline,
0, 0, alloc.get_width(), width);
framebuffer.draw_rectangle(this._pipeline,
alloc.get_width() - width, width,
alloc.get_width(), alloc.get_height());
Cogl.rectangle(0, alloc.get_height(),
framebuffer.draw_rectangle(this._pipeline,
0, alloc.get_height(),
alloc.get_width() - width, alloc.get_height() - width);
Cogl.rectangle(0, alloc.get_height() - width,
framebuffer.draw_rectangle(this._pipeline,
0, alloc.get_height() - width,
width, width);
}
});

View File

@ -74,6 +74,7 @@ shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect,
ShellGLSLEffectPrivate *priv;
ClutterActor *actor;
guint8 paint_opacity;
CoglFramebuffer *framebuffer;
priv = shell_glsl_effect_get_instance_private (self);
@ -85,7 +86,9 @@ shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect,
paint_opacity,
paint_opacity,
paint_opacity);
cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (),
framebuffer = clutter_paint_context_get_framebuffer (paint_context);
cogl_framebuffer_draw_rectangle (framebuffer,
priv->pipeline,
0, 0,
priv->tex_width, priv->tex_height);

View File

@ -124,7 +124,7 @@ shell_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect,
ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect);
ClutterActor *actor;
guint8 paint_opacity;
CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context);
actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect));
paint_opacity = clutter_actor_get_paint_opacity (actor);

View File

@ -397,7 +397,7 @@ st_box_layout_paint (ClutterActor *actor,
ClutterActorBox allocation_box;
ClutterActorBox content_box;
ClutterActor *child;
CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context);
get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
@ -454,7 +454,7 @@ st_box_layout_pick (ClutterActor *actor,
ClutterActorBox allocation_box;
ClutterActorBox content_box;
ClutterActor *child;
CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
CoglFramebuffer *fb = clutter_pick_context_get_framebuffer (pick_context);
get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)

View File

@ -877,12 +877,17 @@ st_entry_paint (ClutterActor *actor,
}
if (priv->text_shadow_material != NULL)
{
CoglFramebuffer *framebuffer =
clutter_paint_context_get_framebuffer (paint_context);
_st_paint_shadow_with_opacity (shadow_spec,
cogl_get_draw_framebuffer (),
framebuffer,
priv->text_shadow_material,
&allocation,
clutter_actor_get_paint_opacity (priv->entry));
}
}
/* Since we paint the background ourselves, chain to the parent class
* of StWidget, to avoid painting it twice.

View File

@ -178,10 +178,12 @@ st_icon_paint (ClutterActor *actor,
if (priv->shadow_pipeline)
{
ClutterActorBox allocation;
CoglFramebuffer *framebuffer;
clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
framebuffer = clutter_paint_context_get_framebuffer (paint_context);
_st_paint_shadow_with_opacity (priv->shadow_spec,
cogl_get_draw_framebuffer (),
framebuffer,
priv->shadow_pipeline,
&allocation,
clutter_actor_get_paint_opacity (priv->icon_texture));

View File

@ -229,13 +229,19 @@ st_label_paint (ClutterActor *actor,
}
if (priv->text_shadow_pipeline != NULL)
{
CoglFramebuffer *framebuffer;
framebuffer =
clutter_paint_context_get_framebuffer (paint_context);
_st_paint_shadow_with_opacity (shadow_spec,
cogl_get_draw_framebuffer (),
framebuffer,
priv->text_shadow_pipeline,
&allocation,
clutter_actor_get_paint_opacity (priv->label));
}
}
}
clutter_actor_paint (priv->label, paint_context);
}

View File

@ -490,12 +490,6 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
clutter_actor_get_position (actor, &x, &y);
/* XXX: There's no way to render a ClutterActor to an offscreen
* as it uses the implicit API. */
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
cogl_push_framebuffer (fb);
G_GNUC_END_IGNORE_DEPRECATIONS;
cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
cogl_framebuffer_translate (fb, -x, -y, 0);
cogl_framebuffer_orthographic (fb, 0, 0, width, height, 0, 1.0);
@ -507,10 +501,6 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
clutter_actor_paint (actor, paint_context);
clutter_paint_context_destroy (paint_context);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
cogl_pop_framebuffer ();
G_GNUC_END_IGNORE_DEPRECATIONS;
clutter_actor_set_opacity_override (actor, -1);
cogl_object_unref (fb);

View File

@ -416,7 +416,7 @@ st_widget_paint_background (StWidget *widget,
if (!st_widget_get_resource_scale (widget, &resource_scale))
return;
framebuffer = cogl_get_draw_framebuffer ();
framebuffer = clutter_paint_context_get_framebuffer (paint_context);
theme_node = st_widget_get_theme_node (widget);
clutter_actor_get_allocation_box (CLUTTER_ACTOR (widget), &allocation);

View File

@ -2,11 +2,13 @@
const UI = imports.testcommon.ui;
const { Cogl, Clutter, St } = imports.gi;
const { Cogl, Clutter, Meta, St } = imports.gi;
function test() {
let stage = new Clutter.Stage({ user_resizable: true, width: 1024, height: 768 });
Meta.init();
let stage = Meta.get_backend().get_stage();
UI.init(stage);
let vbox = new St.BoxLayout({ style: 'background: #ffee88;' });
@ -33,20 +35,32 @@ function test() {
if (useCairo)
obin.style = 'border: 3px solid green;';
else
obin.connect_after('paint', actor => {
Cogl.set_source_color4f(0, 1, 0, 1);
obin.connect_after('paint', (actor, paintContext) => {
let framebuffer = paintContext.get_framebuffer();
let coglContext = framebuffer.get_context();
let pipeline = new Cogl.Pipeline(coglContext);
pipeline.set_color4f(0, 1, 0, 1);
let alloc = actor.get_allocation_box();
let width = 3;
// clockwise order
Cogl.rectangle(0, 0, alloc.get_width(), width);
Cogl.rectangle(alloc.get_width() - width, width,
framebuffer.draw_rectangle(pipeline,
0, 0, alloc.get_width(), width);
framebuffer.draw_rectangle(pipeline,
alloc.get_width() - width, width,
alloc.get_width(), alloc.get_height());
Cogl.rectangle(0, alloc.get_height(),
alloc.get_width() - width, alloc.get_height() - width);
Cogl.rectangle(0, alloc.get_height() - width,
width, width);
framebuffer.draw_rectangle(pipeline,
0,
alloc.get_height(),
alloc.get_width() - width,
alloc.get_height() - width);
framebuffer.draw_rectangle(pipeline,
0,
alloc.get_height() - width,
width,
width);
});
tbox.add(obin);