[Mesa-dev] [PATCH] st/xorg: add some support for non 32-bit color solid fills

Marcin Slusarz marcin.slusarz at gmail.com
Mon May 16 12:51:41 PDT 2011


It's a hack, but it allows rendercheck to pass all fill and most blend tests.
(without it all blend tests failed)
---
 src/gallium/state_trackers/xorg/xorg_composite.c |   70 +++++++++++++++-------
 src/gallium/state_trackers/xorg/xorg_composite.h |    6 +-
 src/gallium/state_trackers/xorg/xorg_exa.c       |   16 +++++-
 3 files changed, 66 insertions(+), 26 deletions(-)

diff --git a/src/gallium/state_trackers/xorg/xorg_composite.c b/src/gallium/state_trackers/xorg/xorg_composite.c
index d4dc84a..cadec59 100644
--- a/src/gallium/state_trackers/xorg/xorg_composite.c
+++ b/src/gallium/state_trackers/xorg/xorg_composite.c
@@ -51,19 +51,53 @@ static const struct xorg_composite_blend xorg_blends[] = {
 };
 
 
-static INLINE void
-pixel_to_float4(Pixel pixel, float *color)
+boolean xorg_pixel_to_float4(Pixel pixel, unsigned char bpp,
+                             unsigned char depth, float *color)
 {
    CARD32	    r, g, b, a;
 
-   a = (pixel >> 24) & 0xff;
-   r = (pixel >> 16) & 0xff;
-   g = (pixel >>  8) & 0xff;
-   b = (pixel >>  0) & 0xff;
-   color[0] = ((float)r) / 255.;
-   color[1] = ((float)g) / 255.;
-   color[2] = ((float)b) / 255.;
-   color[3] = ((float)a) / 255.;
+   if (depth == 32) {
+      a = (pixel >> 24) & 0xff;
+      r = (pixel >> 16) & 0xff;
+      g = (pixel >>  8) & 0xff;
+      b = (pixel >>  0) & 0xff;
+      color[0] = ((float)r) / 255.;
+      color[1] = ((float)g) / 255.;
+      color[2] = ((float)b) / 255.;
+      color[3] = ((float)a) / 255.;
+   } else if (depth == 24) {
+      r = (pixel >> 16) & 0xff;
+      g = (pixel >>  8) & 0xff;
+      b = (pixel >>  0) & 0xff;
+      color[0] = ((float)r) / 255.;
+      color[1] = ((float)g) / 255.;
+      color[2] = ((float)b) / 255.;
+      color[3] = 0;
+   } else if (depth == 8) {
+      r = pixel & 0xff;
+      color[0] = ((float)r) / 255.;
+      color[1] = 0;
+      color[2] = 0;
+      color[3] = 0;
+   } else if (depth == 16) {
+      r = (pixel >> 11) & 0x1f;
+      g = (pixel >>  5) & 0x3f;
+      b = (pixel >>  0) & 0x1f;
+      color[0] = ((float)r) / 31.;
+      color[1] = ((float)g) / 63.;
+      color[2] = ((float)b) / 31.;
+      color[3] = 0;
+   } else if (depth == 15) {
+      r = (pixel >> 10) & 0x1f;
+      g = (pixel >>  5) & 0x1f;
+      b = (pixel >>  0) & 0x1f;
+      color[0] = ((float)r) / 31.;
+      color[1] = ((float)g) / 31.;
+      color[2] = ((float)b) / 31.;
+      color[3] = 0;
+   } else
+      return FALSE;
+   return TRUE;
 }
 
 static boolean
@@ -310,8 +344,8 @@ bind_shaders(struct exa_context *exa, int op,
             fs_traits |= FS_SOLID_FILL;
             vs_traits |= VS_SOLID_FILL;
             debug_assert(pSrcPicture->format == PICT_a8r8g8b8);
-            pixel_to_float4(pSrcPicture->pSourcePict->solidFill.color,
-                            exa->solid_color);
+            xorg_pixel_to_float4(pSrcPicture->pSourcePict->solidFill.color,
+                            32, 32, exa->solid_color);
             exa->has_solid_color = TRUE;
          } else {
             debug_assert("!gradients not supported");
@@ -526,24 +560,14 @@ void xorg_composite(struct exa_context *exa,
 }
 
 boolean xorg_solid_bind_state(struct exa_context *exa,
-                              struct exa_pixmap_priv *pixmap,
-                              Pixel fg)
+                              struct exa_pixmap_priv *pixmap)
 {
    struct pipe_surface *dst_surf = xorg_gpu_surface(exa->pipe, pixmap);
    unsigned vs_traits, fs_traits;
    struct xorg_shader shader;
 
-   pixel_to_float4(fg, exa->solid_color);
    exa->has_solid_color = TRUE;
 
-#if 0
-   debug_printf("Color Pixel=(%d, %d, %d, %d), RGBA=(%f, %f, %f, %f)\n",
-                (fg >> 24) & 0xff, (fg >> 16) & 0xff,
-                (fg >> 8) & 0xff,  (fg >> 0) & 0xff,
-                exa->solid_color[0], exa->solid_color[1],
-                exa->solid_color[2], exa->solid_color[3]);
-#endif
-
    vs_traits = VS_SOLID_FILL;
    fs_traits = FS_SOLID_FILL;
 
diff --git a/src/gallium/state_trackers/xorg/xorg_composite.h b/src/gallium/state_trackers/xorg/xorg_composite.h
index ec71ebf..a83fec1 100644
--- a/src/gallium/state_trackers/xorg/xorg_composite.h
+++ b/src/gallium/state_trackers/xorg/xorg_composite.h
@@ -22,9 +22,11 @@ void xorg_composite(struct exa_context *exa,
                     int srcX, int srcY, int maskX, int maskY,
                     int dstX, int dstY, int width, int height);
 
+boolean xorg_pixel_to_float4(Pixel pixel, unsigned char bpp,
+			     unsigned char depth, float *color);
+
 boolean xorg_solid_bind_state(struct exa_context *exa,
-                              struct exa_pixmap_priv *pixmap,
-                              Pixel fg);
+                              struct exa_pixmap_priv *pixmap);
 void xorg_solid(struct exa_context *exa,
                 struct exa_pixmap_priv *pixmap,
                 int x0, int y0, int x1, int y1);
diff --git a/src/gallium/state_trackers/xorg/xorg_exa.c b/src/gallium/state_trackers/xorg/xorg_exa.c
index b072f53..18a7c10 100644
--- a/src/gallium/state_trackers/xorg/xorg_exa.c
+++ b/src/gallium/state_trackers/xorg/xorg_exa.c
@@ -347,6 +347,7 @@ ExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg)
     modesettingPtr ms = modesettingPTR(pScrn);
     struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
     struct exa_context *exa = ms->exa;
+    unsigned char bpp, depth;
 
     exa_debug_printf("ExaPrepareSolid(0x%x)\n", fg);
 
@@ -371,7 +372,20 @@ ExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg)
 	XORG_FALLBACK("format %s", util_format_name(priv->tex->format));
     }
 
-    return xorg_solid_bind_state(exa, priv, fg);
+    bpp = pPixmap->drawable.bitsPerPixel;
+    depth = pPixmap->drawable.depth;
+    if (!xorg_pixel_to_float4(fg, bpp, depth, exa->solid_color))
+	XORG_FALLBACK("unsupported bpp %d / depth %d", bpp, depth);
+
+#if 0
+    debug_printf("Color Pixel=(%d, %d, %d, %d), RGBA=(%f, %f, %f, %f)\n",
+                 (fg >> 24) & 0xff, (fg >> 16) & 0xff,
+                 (fg >> 8) & 0xff,  (fg >> 0) & 0xff,
+                 exa->solid_color[0], exa->solid_color[1],
+                 exa->solid_color[2], exa->solid_color[3]);
+#endif
+
+    return xorg_solid_bind_state(exa, priv);
 }
 
 static void
-- 
1.7.4.1



More information about the mesa-dev mailing list