summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sna/gen3_render.c53
-rw-r--r--src/sna/sna_blt.c39
-rw-r--r--src/sna/sna_render.h6
-rw-r--r--src/sna/sna_render_inline.h25
4 files changed, 69 insertions, 54 deletions
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 0478709f..ca3d1414 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2080,7 +2080,7 @@ gen3_init_solid(struct sna_composite_channel *channel, uint32_t color)
channel->u.gen3.type = SHADER_WHITE;
channel->bo = NULL;
- channel->is_opaque = (color & 0xff000000) == 0xff000000;
+ channel->is_opaque = (color >> 24) == 0xff;
channel->is_affine = 1;
channel->alpha_fixup = 0;
channel->rb_reversed = 0;
@@ -2303,6 +2303,8 @@ gen3_composite_picture(struct sna *sna,
switch (source->type) {
case SourcePictTypeSolidFill:
+ DBG(("%s: solid fill [%08x], format %x\n",
+ __FUNCTION__, source->solidFill.color, picture->format));
ret = gen3_init_solid(channel, source->solidFill.color);
break;
@@ -2334,11 +2336,15 @@ gen3_composite_picture(struct sna *sna,
x, y, w, h, dst_x, dst_y);
}
- if (sna_picture_is_solid(picture, &color))
+ if (sna_picture_is_solid(picture, &color)) {
+ DBG(("%s: solid drawable [%08x]\n", __FUNCTION__, color));
return gen3_init_solid(channel, color);
+ }
- if (sna_picture_is_clear(picture, x, y, w, h, &color))
- return gen3_init_solid(channel, color);
+ if (sna_picture_is_clear(picture, x, y, w, h, &color)) {
+ DBG(("%s: clear drawable [%08x]\n", __FUNCTION__, color));
+ return gen3_init_solid(channel, color_convert(color, picture->format, PICT_a8r8g8b8));
+ }
if (!gen3_check_repeat(picture))
return sna_render_picture_fixup(sna, picture, channel,
@@ -2517,11 +2523,16 @@ gen3_composite_set_target(struct sna *sna,
return TRUE;
}
+static inline uint8_t
+mul_8_8(uint8_t a, uint8_t b)
+{
+ uint16_t t = a * (uint16_t)b + 0x7f;
+ return ((t >> 8) + t) >> 8;
+}
+
static inline uint8_t multa(uint32_t s, uint32_t m, int shift)
{
- s = (s >> shift) & 0xff;
- m >>= 24;
- return (s * m) >> 8;
+ return mul_8_8((s >> shift) & 0xff, m >> 24) << shift;
}
static inline bool is_constant_ps(uint32_t type)
@@ -2894,33 +2905,31 @@ gen3_render_composite(struct sna *sna,
} else {
if (tmp->mask.is_opaque) {
tmp->mask.u.gen3.type = SHADER_NONE;
- tmp->has_component_alpha = FALSE;
} else if (is_constant_ps(tmp->src.u.gen3.type) &&
is_constant_ps(tmp->mask.u.gen3.type)) {
- uint32_t a,r,g,b;
+ uint32_t v;
- a = multa(tmp->src.u.gen3.mode,
+ v = multa(tmp->src.u.gen3.mode,
tmp->mask.u.gen3.mode,
24);
- r = multa(tmp->src.u.gen3.mode,
- tmp->mask.u.gen3.mode,
- 16);
- g = multa(tmp->src.u.gen3.mode,
- tmp->mask.u.gen3.mode,
- 8);
- b = multa(tmp->src.u.gen3.mode,
- tmp->mask.u.gen3.mode,
- 0);
+ v != multa(tmp->src.u.gen3.mode,
+ tmp->mask.u.gen3.mode,
+ 16);
+ v != multa(tmp->src.u.gen3.mode,
+ tmp->mask.u.gen3.mode,
+ 8);
+ v != multa(tmp->src.u.gen3.mode,
+ tmp->mask.u.gen3.mode,
+ 0);
DBG(("%s: combining constant source/mask: %x x %x -> %x\n",
__FUNCTION__,
tmp->src.u.gen3.mode,
tmp->mask.u.gen3.mode,
- a << 24 | r << 16 | g << 8 | b));
+ v));
tmp->src.u.gen3.type = SHADER_CONSTANT;
- tmp->src.u.gen3.mode =
- a << 24 | r << 16 | g << 8 | b;
+ tmp->src.u.gen3.mode = v;
tmp->mask.u.gen3.type = SHADER_NONE;
}
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index e7a6182f..a81a1454 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -476,13 +476,13 @@ static void sna_blt_copy_one(struct sna *sna,
kgem->nbatch += 8;
}
-static Bool
-get_rgba_from_pixel(uint32_t pixel,
- uint16_t *red,
- uint16_t *green,
- uint16_t *blue,
- uint16_t *alpha,
- uint32_t format)
+Bool
+sna_get_rgba_from_pixel(uint32_t pixel,
+ uint16_t *red,
+ uint16_t *green,
+ uint16_t *blue,
+ uint16_t *alpha,
+ uint32_t format)
{
int rbits, bbits, gbits, abits;
int rshift, bshift, gshift, ashift;
@@ -607,31 +607,6 @@ _sna_get_pixel_from_rgba(uint32_t * pixel,
return TRUE;
}
-static uint32_t
-color_convert(uint32_t pixel,
- uint32_t src_format,
- uint32_t dst_format)
-{
- DBG(("%s: src=%08x [%08x]\n", __FUNCTION__, pixel, src_format));
-
- if (src_format != dst_format) {
- uint16_t red, green, blue, alpha;
-
- if (!get_rgba_from_pixel(pixel,
- &red, &green, &blue, &alpha,
- src_format))
- return 0;
-
- if (!sna_get_pixel_from_rgba(&pixel,
- red, green, blue, alpha,
- dst_format))
- return 0;
- }
-
- DBG(("%s: dst=%08x [%08x]\n", __FUNCTION__, pixel, dst_format));
- return pixel;
-}
-
uint32_t
sna_rgba_for_color(uint32_t color, int depth)
{
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 73ef5680..9c49281d 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -485,6 +485,12 @@ sna_render_get_gradient(struct sna *sna,
uint32_t sna_rgba_for_color(uint32_t color, int depth);
uint32_t sna_rgba_to_color(uint32_t rgba, uint32_t format);
+Bool sna_get_rgba_from_pixel(uint32_t pixel,
+ uint16_t *red,
+ uint16_t *green,
+ uint16_t *blue,
+ uint16_t *alpha,
+ uint32_t format);
Bool sna_picture_is_solid(PicturePtr picture, uint32_t *color);
void no_render_init(struct sna *sna);
diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index 956e2aa2..03e1969d 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -190,4 +190,29 @@ sna_render_reduce_damage(struct sna_composite_op *op,
}
}
+inline static uint32_t
+color_convert(uint32_t pixel,
+ uint32_t src_format,
+ uint32_t dst_format)
+{
+ DBG(("%s: src=%08x [%08x]\n", __FUNCTION__, pixel, src_format));
+
+ if (src_format != dst_format) {
+ uint16_t red, green, blue, alpha;
+
+ if (!sna_get_rgba_from_pixel(pixel,
+ &red, &green, &blue, &alpha,
+ src_format))
+ return 0;
+
+ if (!sna_get_pixel_from_rgba(&pixel,
+ red, green, blue, alpha,
+ dst_format))
+ return 0;
+ }
+
+ DBG(("%s: dst=%08x [%08x]\n", __FUNCTION__, pixel, dst_format));
+ return pixel;
+}
+
#endif /* SNA_RENDER_INLINE_H */