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