Re: [PATCH xserver 1/2] render: Store all 16bpc of precision for solid pictures

2018-02-26 Thread Keith Packard
Michel Dänzer  writes:

> xf86-video-ati's EXA code (and other drivers maybe?) needs to be adapted
> for this. Do you have patches for that?

Thanks for catching that!

-- 
-keith


signature.asc
Description: PGP signature
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Re: [PATCH xserver 1/2] render: Store all 16bpc of precision for solid pictures

2018-02-26 Thread Adam Jackson
On Mon, 2018-02-26 at 12:16 +0100, Michel Dänzer wrote:
> On 2018-02-23 10:08 PM, Adam Jackson wrote:
> > Signed-off-by: Adam Jackson 
> 
> [...]
> 
> > diff --git a/render/picturestr.h b/render/picturestr.h
> > index 33baef9bf..5d479f18e 100644
> > --- a/render/picturestr.h
> > +++ b/render/picturestr.h
> > @@ -67,7 +67,7 @@ typedef struct pixman_transform PictTransform, 
> > *PictTransformPtr;
> >  
> >  typedef struct _PictSolidFill {
> >  unsigned int type;
> > -CARD32 color;
> > +xRenderColor color;
> >  } PictSolidFill, *PictSolidFillPtr;
> >  
> >  typedef struct _PictGradientStop {
> > 
> 
> xf86-video-ati's EXA code (and other drivers maybe?) needs to be adapted
> for this. Do you have patches for that?

Hah. Right as I was about to send this out I thought "you know you
don't need to break ABI here, meh, whatever". But yes, this would break
ati intel nouveau qxl and vmware at least. Revised patch to follow.

- ajax
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Re: [PATCH xserver 1/2] render: Store all 16bpc of precision for solid pictures

2018-02-26 Thread Michel Dänzer
On 2018-02-23 10:08 PM, Adam Jackson wrote:
> Signed-off-by: Adam Jackson 

[...]

> diff --git a/render/picturestr.h b/render/picturestr.h
> index 33baef9bf..5d479f18e 100644
> --- a/render/picturestr.h
> +++ b/render/picturestr.h
> @@ -67,7 +67,7 @@ typedef struct pixman_transform PictTransform, 
> *PictTransformPtr;
>  
>  typedef struct _PictSolidFill {
>  unsigned int type;
> -CARD32 color;
> +xRenderColor color;
>  } PictSolidFill, *PictSolidFillPtr;
>  
>  typedef struct _PictGradientStop {
> 

xf86-video-ati's EXA code (and other drivers maybe?) needs to be adapted
for this. Do you have patches for that?


-- 
Earthling Michel Dänzer   |   http://www.amd.com
Libre software enthusiast | Mesa and X developer
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Re: [PATCH xserver 1/2] render: Store all 16bpc of precision for solid pictures

2018-02-23 Thread Keith Packard
Adam Jackson  writes:

> Signed-off-by: Adam Jackson 

Reviewed-by: Keith Packard 

-- 
-keith


signature.asc
Description: PGP signature
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

[PATCH xserver 1/2] render: Store all 16bpc of precision for solid pictures

2018-02-23 Thread Adam Jackson
Signed-off-by: Adam Jackson 
---
 exa/exa_render.c|  4 +++-
 fb/fbpict.c | 16 +++-
 glamor/glamor_program.c |  7 ---
 glamor/glamor_render.c  | 14 --
 glamor/glamor_utils.h   |  9 +
 render/picture.c| 10 +-
 render/picturestr.h |  2 +-
 7 files changed, 25 insertions(+), 37 deletions(-)

diff --git a/exa/exa_render.c b/exa/exa_render.c
index b24bec052..2dad795f2 100644
--- a/exa/exa_render.c
+++ b/exa/exa_render.c
@@ -291,7 +291,9 @@ exaTryDriverSolidFill(PicturePtr pSrc,
 pixel = exaGetPixmapFirstPixel(pSrcPix);
 }
 else
-pixel = pSrc->pSourcePict->solidFill.color;
+miRenderColorToPixel(pSrc->pFormat,
+ >pSourcePict->solidFill.color,
+ );
 
 if (!exaGetRGBAFromPixel(pixel, , , , ,
  pSrc->pFormat, pSrc->format) ||
diff --git a/fb/fbpict.c b/fb/fbpict.c
index 7ea0b668f..759f0d5db 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -220,20 +220,10 @@ static pixman_image_t *
 create_solid_fill_image(PicturePtr pict)
 {
 PictSolidFill *solid = >pSourcePict->solidFill;
-pixman_color_t color;
-CARD32 a, r, g, b;
+/* pixman_color_t and xRenderColor have the same layout */
+pixman_color_t *color = (pixman_color_t *)>color;
 
-a = (solid->color & 0xff00) >> 24;
-r = (solid->color & 0x00ff) >> 16;
-g = (solid->color & 0xff00) >> 8;
-b = (solid->color & 0x00ff) >> 0;
-
-color.alpha = (a << 8) | a;
-color.red = (r << 8) | r;
-color.green = (g << 8) | g;
-color.blue = (b << 8) | b;
-
-return pixman_image_create_solid_fill();
+return pixman_image_create_solid_fill(color);
 }
 
 static pixman_image_t *
diff --git a/glamor/glamor_program.c b/glamor/glamor_program.c
index 23c102bc3..29ffed05c 100644
--- a/glamor/glamor_program.c
+++ b/glamor/glamor_program.c
@@ -508,12 +508,13 @@ glamor_set_blend(CARD8 op, glamor_program_alpha alpha, 
PicturePtr dst)
 static Bool
 use_source_solid(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program 
*prog)
 {
+PictSolidFill *solid = >pSourcePict->solidFill;
+float color[4];
 
+glamor_get_rgba_from_color(>color, color);
 glamor_set_blend(op, prog->alpha, dst);
+glUniform4fv(prog->fg_uniform, 1, color);
 
-glamor_set_color_depth(dst->pDrawable->pScreen, 32,
-   src->pSourcePict->solidFill.color,
-   prog->fg_uniform);
 return TRUE;
 }
 
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 7a96c82dd..75f4258d8 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -830,11 +830,8 @@ glamor_composite_choose_shader(CARD8 op,
 else if (!source->pDrawable) {
 if (source->pSourcePict->type == SourcePictTypeSolidFill) {
 key.source = SHADER_SOURCE_SOLID;
-glamor_get_rgba_from_pixel(source->pSourcePict->solidFill.color,
-   _solid_color[0],
-   _solid_color[1],
-   _solid_color[2],
-   _solid_color[3], PICT_a8r8g8b8);
+glamor_get_rgba_from_color(>pSourcePict->solidFill.color,
+   source_solid_color);
 }
 else
 goto fail;
@@ -850,11 +847,8 @@ glamor_composite_choose_shader(CARD8 op,
 if (!mask->pDrawable) {
 if (mask->pSourcePict->type == SourcePictTypeSolidFill) {
 key.mask = SHADER_MASK_SOLID;
-glamor_get_rgba_from_pixel
-(mask->pSourcePict->solidFill.color,
- _solid_color[0],
- _solid_color[1],
- _solid_color[2], _solid_color[3], 
PICT_a8r8g8b8);
+glamor_get_rgba_from_color(>pSourcePict->solidFill.color,
+   mask_solid_color);
 }
 else
 goto fail;
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 7597b92dc..d4f995ab9 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -710,6 +710,15 @@ glamor_get_rgba_from_pixel(CARD32 pixel,
 return TRUE;
 }
 
+static inline void
+glamor_get_rgba_from_color(const xRenderColor *color, float rgba[4])
+{
+rgba[0] = color->red   / (float)UINT16_MAX;
+rgba[1] = color->green / (float)UINT16_MAX;
+rgba[2] = color->blue  / (float)UINT16_MAX;
+rgba[3] = color->alpha / (float)UINT16_MAX;
+}
+
 inline static Bool
 glamor_is_large_pixmap(PixmapPtr pixmap)
 {
diff --git a/render/picture.c b/render/picture.c
index 9e4036e7d..9907e15d6 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -817,14 +817,6 @@ CreatePicture(Picture pid,
 return pPicture;
 }
 
-static CARD32
-xRenderColorToCard32(xRenderColor c)
-{
-return
-(c.alpha >> 8 << 24) |
-