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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev