xserver: Branch 'master' - 2 commits
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jan 11 10:12:09 UTC 2024
glamor/glamor_copy.c | 4 ++--
glamor/glamor_gradient.c | 4 ++--
glamor/glamor_pixmap.c | 18 +++++++++++++++++-
glamor/glamor_priv.h | 2 +-
glamor/glamor_render.c | 2 +-
glamor/glamor_transform.c | 4 ++--
glamor/glamor_xv.c | 2 +-
hw/xwayland/xwayland-glamor-eglstream.c | 2 +-
8 files changed, 27 insertions(+), 11 deletions(-)
New commits:
commit e5a3f3e84dbbc1484d56d9a64f14508a4bf8af19
Author: Michel Dänzer <mdaenzer at redhat.com>
Date: Thu Jan 4 16:14:17 2024 +0100
glamor: Fall back for mixed depth 24/32 in glamor_set_alu
For ALUs which may leave the alpha channel at values other than 1.0.
Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1615
v2:
* List safe ALUs instead of unsafe ones
diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c
index ed273ccbb..c573e7982 100644
--- a/glamor/glamor_pixmap.c
+++ b/glamor/glamor_pixmap.c
@@ -136,6 +136,21 @@ glamor_set_alu(DrawablePtr drawable, unsigned char alu)
glDisable(GL_COLOR_LOGIC_OP);
return TRUE;
}
+
+ switch (alu) {
+ case GXnoop:
+ case GXor:
+ case GXset:
+ /* These leave the alpha channel at 1.0 */
+ break;
+ default:
+ if (glamor_drawable_effective_depth(drawable) == 24 &&
+ glamor_get_drawable_pixmap(drawable)->drawable.depth == 32) {
+ glamor_fallback("ALU %x not supported with mixed depth\n", alu);
+ return FALSE;
+ }
+ }
+
glEnable(GL_COLOR_LOGIC_OP);
switch (alu) {
case GXclear:
commit 8f66c15694d59601d2578f52d76082afcacb879e
Author: Michel Dänzer <mdaenzer at redhat.com>
Date: Thu Jan 4 16:03:01 2024 +0100
glamor: Make glamor_set_alu take a DrawablePtr
Preparation for the following commit, no functional change intended.
diff --git a/glamor/glamor_copy.c b/glamor/glamor_copy.c
index 00a04d94f..909565368 100644
--- a/glamor/glamor_copy.c
+++ b/glamor/glamor_copy.c
@@ -378,7 +378,7 @@ glamor_copy_fbo_fbo_draw(DrawablePtr src,
if (gc && !glamor_set_planemask(gc->depth, gc->planemask))
goto bail_ctx;
- if (!glamor_set_alu(screen, gc ? gc->alu : GXcopy))
+ if (!glamor_set_alu(dst, gc ? gc->alu : GXcopy))
goto bail_ctx;
if (bitplane && !glamor_priv->can_copyplane)
@@ -529,7 +529,7 @@ glamor_copy_fbo_fbo_temp(DrawablePtr src,
if (gc && !glamor_set_planemask(gc->depth, gc->planemask))
goto bail_ctx;
- if (!glamor_set_alu(screen, gc ? gc->alu : GXcopy))
+ if (!glamor_set_alu(dst, gc ? gc->alu : GXcopy))
goto bail_ctx;
/* Find the size of the area to copy
diff --git a/glamor/glamor_gradient.c b/glamor/glamor_gradient.c
index 4c7ae4d77..1036ff5e1 100644
--- a/glamor/glamor_gradient.c
+++ b/glamor/glamor_gradient.c
@@ -971,7 +971,7 @@ glamor_generate_radial_gradient_picture(ScreenPtr screen,
0))
goto GRADIENT_FAIL;
- glamor_set_alu(screen, GXcopy);
+ glamor_set_alu(&pixmap->drawable, GXcopy);
/* Set all the stops and colors to shader. */
if (stops_count > RADIAL_SMALL_STOPS) {
@@ -1288,7 +1288,7 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen,
1))
goto GRADIENT_FAIL;
- glamor_set_alu(screen, GXcopy);
+ glamor_set_alu(&pixmap->drawable, GXcopy);
/* Normalize the PTs. */
glamor_set_normalize_pt(xscale, yscale,
diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c
index 2c8cc3ba0..ed273ccbb 100644
--- a/glamor/glamor_pixmap.c
+++ b/glamor/glamor_pixmap.c
@@ -120,8 +120,9 @@ glamor_set_planemask(int depth, unsigned long planemask)
}
Bool
-glamor_set_alu(ScreenPtr screen, unsigned char alu)
+glamor_set_alu(DrawablePtr drawable, unsigned char alu)
{
+ ScreenPtr screen = drawable->pScreen;
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
if (glamor_priv->is_gles) {
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 76570febd..996fc807a 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -668,7 +668,7 @@ void glamor_set_destination_pixmap_fbo(glamor_screen_private *glamor_priv, glamo
* */
void glamor_set_destination_pixmap_priv_nc(glamor_screen_private *glamor_priv, PixmapPtr pixmap, glamor_pixmap_private *pixmap_priv);
-Bool glamor_set_alu(ScreenPtr screen, unsigned char alu);
+Bool glamor_set_alu(DrawablePtr drawable, unsigned char alu);
Bool glamor_set_planemask(int depth, unsigned long planemask);
RegionPtr glamor_bitmap_to_region(PixmapPtr pixmap);
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 7545268f3..3fb71e103 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -1235,7 +1235,7 @@ glamor_composite_with_shader(CARD8 op,
glamor_set_destination_pixmap_priv_nc(glamor_priv, dest_pixmap, dest_pixmap_priv);
glamor_composite_set_shader_blend(glamor_priv, dest_pixmap_priv, &key, shader, &op_info);
- glamor_set_alu(screen, GXcopy);
+ glamor_set_alu(dest->pDrawable, GXcopy);
glamor_priv->has_source_coords = key.source != SHADER_SOURCE_SOLID;
glamor_priv->has_mask_coords = (key.mask != SHADER_MASK_NONE &&
diff --git a/glamor/glamor_transform.c b/glamor/glamor_transform.c
index b969bc114..891f7ee51 100644
--- a/glamor/glamor_transform.c
+++ b/glamor/glamor_transform.c
@@ -143,7 +143,7 @@ glamor_set_solid(DrawablePtr drawable,
pixel = gc->fgPixel;
- if (!glamor_set_alu(drawable->pScreen, alu)) {
+ if (!glamor_set_alu(drawable, alu)) {
switch (gc->alu) {
case GXclear:
pixel = 0;
@@ -209,7 +209,7 @@ glamor_set_tiled(DrawablePtr drawable,
GLint offset_uniform,
GLint size_inv_uniform)
{
- if (!glamor_set_alu(drawable->pScreen, gc->alu))
+ if (!glamor_set_alu(drawable, gc->alu))
return FALSE;
if (!glamor_set_planemask(gc->depth, gc->planemask))
diff --git a/glamor/glamor_xv.c b/glamor/glamor_xv.c
index d897e9901..40b9ca4ea 100644
--- a/glamor/glamor_xv.c
+++ b/glamor/glamor_xv.c
@@ -447,7 +447,7 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
off[2] = Loff * yco + Coff * (uco[2] + vco[2]) + bright;
gamma = 1.0;
- glamor_set_alu(screen, GXcopy);
+ glamor_set_alu(&pixmap->drawable, GXcopy);
for (i = 0; i < 3; i++) {
if (port_priv->src_pix[i]) {
diff --git a/hw/xwayland/xwayland-glamor-eglstream.c b/hw/xwayland/xwayland-glamor-eglstream.c
index 2b23dec25..95894f403 100644
--- a/hw/xwayland/xwayland-glamor-eglstream.c
+++ b/hw/xwayland/xwayland-glamor-eglstream.c
@@ -559,7 +559,7 @@ xwl_glamor_eglstream_post_damage(struct xwl_window *xwl_window,
* won't actually draw to it
*/
xwl_glamor_egl_make_current(xwl_screen);
- glamor_set_alu(xwl_screen->screen, GXcopy);
+ glamor_set_alu(&pixmap->drawable, GXcopy);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
More information about the xorg-commit
mailing list