Hmm not sure about the 8-bit case. Is that really mono and ok if we use red channel? And I guess it doesn't make a difference if you'd use 1.0 as color[3] instead of 0 (just seems that would be more correct)? Also, you're passing in bpp to xorg_pixel_to_float4 but don't actually use it. Otherwise, doesn't really look hacky to me - unless we could get other channel ordering or something similar...
Roland Am 16.05.2011 21:51, schrieb Marcin Slusarz: > 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev