xf86-video-intel: 4 commits - src/sna/gen4_vertex.c src/sna/gen7_render.c src/sna/sna_composite.c src/sna/sna_trapezoids.c
Chris Wilson
ickle at kemper.freedesktop.org
Thu May 9 05:54:24 PDT 2013
src/sna/gen4_vertex.c | 6 +++
src/sna/gen7_render.c | 19 ++++++++++
src/sna/sna_composite.c | 9 ++---
src/sna/sna_trapezoids.c | 83 ++++++++++++++++++++++++++++-------------------
4 files changed, 81 insertions(+), 36 deletions(-)
New commits:
commit 2217f6356b53263b6ce8f92b5c29c0614d4ef2a5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu May 9 13:46:11 2013 +0100
sna/trapezoids: Fix the determination of the trapezoid origin
"src-x and src-y register the pattern to
the floor of the top x and y coordinate of the left edge of the
first trapezoid,"
Bugzilla: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1178020
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 7536f25..7907e8d 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2476,6 +2476,17 @@ static void rasterize_traps_thread(void *arg)
pixman_image_unref(image);
}
+inline static void trapezoid_origin(const xLineFixed *l, int16_t *x, int16_t *y)
+{
+ if (l->p1.y < l->p2.y) {
+ *x = pixman_fixed_to_int(l->p1.x);
+ *y = pixman_fixed_to_int(l->p1.y);
+ } else {
+ *x = pixman_fixed_to_int(l->p2.x);
+ *y = pixman_fixed_to_int(l->p2.y);
+ }
+}
+
static void
trapezoids_fallback(struct sna *sna,
CARD8 op, PicturePtr src, PicturePtr dst,
@@ -2494,8 +2505,7 @@ trapezoids_fallback(struct sna *sna,
pixman_format_code_t format;
int error;
- dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
- dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
+ trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
trapezoids_bounds(ntrap, traps, &bounds);
if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
@@ -3823,8 +3833,7 @@ composite_unaligned_boxes_fallback(struct sna *sna,
force_fallback))
return true;
- dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
- dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
+ trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
dx = dst->pDrawable->x;
dy = dst->pDrawable->y;
for (n = 0; n < ntrap; n++) {
@@ -3948,9 +3957,11 @@ fallback:
force_fallback);
}
- dst_x = extents.x1 = pixman_fixed_to_int(traps[0].left.p1.x);
+ trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
+
+ extents.x1 = pixman_fixed_to_int(traps[0].left.p1.x);
extents.x2 = pixman_fixed_to_int(traps[0].right.p1.x + pixman_fixed_1_minus_e);
- dst_y = extents.y1 = pixman_fixed_to_int(traps[0].top);
+ extents.y1 = pixman_fixed_to_int(traps[0].top);
extents.y2 = pixman_fixed_to_int(traps[0].bottom + pixman_fixed_1_minus_e);
DBG(("%s: src=(%d, %d), dst=(%d, %d)\n",
@@ -4212,8 +4223,7 @@ mono_trapezoids_span_converter(struct sna *sna,
if (NO_SCAN_CONVERTER)
return false;
- dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
- dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
+ trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
trapezoids_bounds(ntrap, traps, &extents);
if (extents.y1 >= extents.y2 || extents.x1 >= extents.x2)
@@ -4568,8 +4578,7 @@ trapezoid_span_converter(struct sna *sna,
return false;
}
- dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
- dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
+ trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
trapezoids_bounds(ntrap, traps, &extents);
if (extents.y1 >= extents.y2 || extents.x1 >= extents.x2)
commit 6e98df06fa9d218a6139730140a83a1940b05980
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu May 9 13:45:38 2013 +0100
sna: Add more debugging to unaligned trapezoids
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 2b46f62..df2aa1a 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -404,8 +404,8 @@ static void _assert_pixmap_contains_box(PixmapPtr pixmap, BoxPtr box, const char
static void apply_damage(struct sna_composite_op *op, RegionPtr region)
{
- DBG(("%s: damage=%p, region=%ld [(%d, %d), (%d, %d) + (%d, %d)]\n",
- __FUNCTION__, op->damage, RegionNumRects(region),
+ DBG(("%s: damage=%p, region=%d [(%d, %d), (%d, %d) + (%d, %d)]\n",
+ __FUNCTION__, op->damage, (int)RegionNumRects(region),
region->extents.x1, region->extents.y1,
region->extents.x2, region->extents.y2,
op->dst.x, op->dst.y));
@@ -995,8 +995,9 @@ sna_composite_rectangles(CARD8 op,
color->alpha,
dst->format);
priv->clear = ok;
- DBG(("%s: marking clear [%08x]? %d\n",
- __FUNCTION__, priv->clear_color, ok));
+ DBG(("%s: pixmap=%ld marking clear [%08x]? %d\n",
+ __FUNCTION__, pixmap->drawable.serialNumber,
+ priv->clear_color, ok));
}
}
goto done;
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index ce0835a..7536f25 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2671,7 +2671,7 @@ composite_aligned_boxes(struct sna *sna,
PicturePtr dst,
PictFormatPtr maskFormat,
INT16 src_x, INT16 src_y,
- int ntrap, xTrapezoid *traps,
+ int ntrap, const xTrapezoid *traps,
bool force_fallback)
{
BoxRec stack_boxes[64], *boxes;
@@ -2888,7 +2888,7 @@ composite_unaligned_box(struct sna *sna,
inline static void
composite_unaligned_trap_row(struct sna *sna,
struct sna_composite_spans_op *tmp,
- xTrapezoid *trap, int dx,
+ const xTrapezoid *trap, int dx,
int y1, int y2, int covered,
pixman_region16_t *clip)
{
@@ -2966,7 +2966,7 @@ composite_unaligned_trap_row(struct sna *sna,
flatten static void
composite_unaligned_trap(struct sna *sna,
struct sna_composite_spans_op *tmp,
- xTrapezoid *trap,
+ const xTrapezoid *trap,
int dx, int dy,
pixman_region16_t *clip)
{
@@ -2975,6 +2975,8 @@ composite_unaligned_trap(struct sna *sna,
y1 = dy + pixman_fixed_to_int(trap->top);
y2 = dy + pixman_fixed_to_int(trap->bottom);
+ DBG(("%s: y1=%d, y2=%d\n", __FUNCTION__, y1, y2));
+
if (y1 == y2) {
composite_unaligned_trap_row(sna, tmp, trap, dx,
y1, y1 + 1,
@@ -3006,9 +3008,9 @@ composite_unaligned_trap(struct sna *sna,
BoxRec box;
box.x1 = dx + pixman_fixed_to_int(trap->left.p1.x);
- box.x2 = dx + pixman_fixed_to_int(trap->right.p1.x);
- box.y1 = y1;
- box.y2 = y2 + (pixman_fixed_frac(trap->bottom) != 0);
+ box.x2 = dx + pixman_fixed_to_int(trap->right.p1.x + pixman_fixed_1_minus_e);
+ box.y1 = dy + pixman_fixed_to_int(trap->top);
+ box.y2 = dy + pixman_fixed_to_int(trap->bottom + pixman_fixed_1_minus_e);
if (clip) {
pixman_region16_t region;
@@ -3058,7 +3060,7 @@ blt_opacity(PixmapPtr scratch,
static void
blt_unaligned_box_row(PixmapPtr scratch,
BoxPtr extents,
- xTrapezoid *trap,
+ const xTrapezoid *trap,
int y1, int y2,
int covered)
{
@@ -3188,7 +3190,7 @@ lerp32_opacity(PixmapPtr scratch,
static void
lerp32_unaligned_box_row(PixmapPtr scratch, uint32_t color,
const BoxRec *extents,
- xTrapezoid *trap, int16_t dx,
+ const xTrapezoid *trap, int16_t dx,
int16_t y, int16_t h,
uint8_t covered)
{
@@ -3286,7 +3288,7 @@ pixsolid_opacity(struct pixman_inplace *pi,
static void
pixsolid_unaligned_box_row(struct pixman_inplace *pi,
const BoxRec *extents,
- xTrapezoid *trap,
+ const xTrapezoid *trap,
int16_t y, int16_t h,
uint8_t covered)
{
@@ -3320,7 +3322,8 @@ pixsolid_unaligned_box_row(struct pixman_inplace *pi,
static bool
composite_unaligned_boxes_inplace__solid(struct sna *sna,
CARD8 op, uint32_t color,
- PicturePtr dst, int n, xTrapezoid *t,
+ PicturePtr dst,
+ int n, const xTrapezoid *t,
bool force_fallback)
{
PixmapPtr pixmap;
@@ -3646,7 +3649,7 @@ static bool
composite_unaligned_boxes_inplace(struct sna *sna,
CARD8 op,
PicturePtr src, int16_t src_x, int16_t src_y,
- PicturePtr dst, int n, xTrapezoid *t,
+ PicturePtr dst, int n, const xTrapezoid *t,
bool force_fallback)
{
if (!force_fallback &&
@@ -3800,7 +3803,7 @@ composite_unaligned_boxes_fallback(struct sna *sna,
PicturePtr src,
PicturePtr dst,
INT16 src_x, INT16 src_y,
- int ntrap, xTrapezoid *traps,
+ int ntrap, const xTrapezoid *traps,
bool force_fallback)
{
ScreenPtr screen = dst->pDrawable->pScreen;
@@ -3825,7 +3828,7 @@ composite_unaligned_boxes_fallback(struct sna *sna,
dx = dst->pDrawable->x;
dy = dst->pDrawable->y;
for (n = 0; n < ntrap; n++) {
- xTrapezoid *t = &traps[n];
+ const xTrapezoid *t = &traps[n];
PixmapPtr scratch;
PicturePtr mask;
BoxRec extents;
@@ -3915,21 +3918,21 @@ composite_unaligned_boxes(struct sna *sna,
PicturePtr dst,
PictFormatPtr maskFormat,
INT16 src_x, INT16 src_y,
- int ntrap, xTrapezoid *traps,
+ int ntrap, const xTrapezoid *traps,
bool force_fallback)
{
BoxRec extents;
struct sna_composite_spans_op tmp;
struct sna_pixmap *priv;
pixman_region16_t clip, *c;
- int dst_x, dst_y;
+ int16_t dst_x, dst_y;
int dx, dy, n;
if (NO_UNALIGNED_BOXES)
return false;
- DBG(("%s: force_fallback=%d, mask=%x, n=%d\n",
- __FUNCTION__, force_fallback, maskFormat ? (int)maskFormat->format : 0, ntrap));
+ DBG(("%s: force_fallback=%d, mask=%x, n=%d, op=%d\n",
+ __FUNCTION__, force_fallback, maskFormat ? (int)maskFormat->format : 0, ntrap, op));
/* need a span converter to handle overlapping traps */
if (ntrap > 1 && maskFormat)
@@ -3996,8 +3999,10 @@ fallback:
c = NULL;
if (extents.x2 - extents.x1 > clip.extents.x2 - clip.extents.x1 ||
- extents.y2 - extents.y1 > clip.extents.y2 - clip.extents.y1)
+ extents.y2 - extents.y1 > clip.extents.y2 - clip.extents.y1) {
+ DBG(("%s: forcing clip\n", __FUNCTION__));
c = &clip;
+ }
extents = *RegionExtents(&clip);
dx = dst->pDrawable->x;
@@ -4016,18 +4021,23 @@ fallback:
case PictOpOver:
priv = sna_pixmap(get_drawable_pixmap(dst->pDrawable));
assert(priv != NULL);
- if (priv->clear && priv->clear_color == 0)
+ if (priv->clear && priv->clear_color == 0) {
+ DBG(("%s: converting %d to PictOpSrc\n",
+ __FUNCTION__, op));
op = PictOpSrc;
+ }
break;
case PictOpIn:
priv = sna_pixmap(get_drawable_pixmap(dst->pDrawable));
assert(priv != NULL);
- if (priv->clear && priv->clear_color == 0)
+ if (priv->clear && priv->clear_color == 0) {
+ DBG(("%s: clear destination using In, skipping\n",
+ __FUNCTION__));
return true;
+ }
break;
}
- memset(&tmp, 0, sizeof(tmp));
if (!sna->render.composite_spans(sna, op, src, dst,
src_x + extents.x1 - dst_x - dx,
src_y + extents.y1 - dst_y - dy,
@@ -4035,7 +4045,7 @@ fallback:
extents.x2 - extents.x1,
extents.y2 - extents.y1,
COMPOSITE_SPANS_RECTILINEAR,
- &tmp)) {
+ memset(&tmp, 0, sizeof(tmp)))) {
DBG(("%s: composite spans render op not supported\n",
__FUNCTION__));
REGION_UNINIT(NULL, &clip);
commit 5d62ec25937ad296114bf890a7a5ac11ff03508c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu May 9 13:44:24 2013 +0100
sna/gen7: Add DBG for channel setup for render source
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index fd1cbd3..5cbed9d 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1953,6 +1953,25 @@ gen7_composite_picture(struct sna *sna,
x, y, w, h, dst_x, dst_y);
}
+ DBG(("%s: pixmap, repeat=%d, filter=%d, transform?=%d [affine? %d], format=%08x\n",
+ __FUNCTION__,
+ channel->repeat, channel->filter,
+ channel->transform != NULL, channel->is_affine,
+ channel->pict_format));
+ if (channel->transform) {
+ DBG(("%s: transform=[%f %f %f, %f %f %f, %f %f %f]\n",
+ __FUNCTION__,
+ channel->transform->matrix[0][0] / 65536.,
+ channel->transform->matrix[0][1] / 65536.,
+ channel->transform->matrix[0][2] / 65536.,
+ channel->transform->matrix[1][0] / 65536.,
+ channel->transform->matrix[1][1] / 65536.,
+ channel->transform->matrix[1][2] / 65536.,
+ channel->transform->matrix[2][0] / 65536.,
+ channel->transform->matrix[2][1] / 65536.,
+ channel->transform->matrix[2][2] / 65536.));
+ }
+
return sna_render_pixmap_bo(sna, channel, pixmap,
x, y, w, h, dst_x, dst_y);
}
commit debdcd6a09464251324238ccbd935a6ade265d94
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu May 9 13:43:57 2013 +0100
sna: Add DBG statements for choice of spans vertex emitter
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_vertex.c b/src/sna/gen4_vertex.c
index cd366c9..a82f961 100644
--- a/src/sna/gen4_vertex.c
+++ b/src/sna/gen4_vertex.c
@@ -2923,11 +2923,13 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
unsigned vb;
if (tmp->base.src.is_solid) {
+ DBG(("%s: solid source\n", __FUNCTION__));
tmp->prim_emit = emit_span_solid;
tmp->emit_boxes = emit_span_boxes_solid;
tmp->base.floats_per_vertex = 3;
vb = 1 << 2 | 1;
} else if (tmp->base.src.is_linear) {
+ DBG(("%s: linear source\n", __FUNCTION__));
#if defined(avx2)
if (sna->cpu_features & AVX2) {
tmp->prim_emit = emit_span_linear__avx2;
@@ -2947,6 +2949,7 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
tmp->base.floats_per_vertex = 3;
vb = 1 << 2 | 1;
} else if (tmp->base.src.transform == NULL) {
+ DBG(("%s: identity transform\n", __FUNCTION__));
#if defined(avx2)
if (sna->cpu_features & AVX2) {
tmp->prim_emit = emit_span_identity__avx2;
@@ -2969,6 +2972,7 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
tmp->base.src.scale[0] /= tmp->base.src.transform->matrix[2][2];
tmp->base.src.scale[1] /= tmp->base.src.transform->matrix[2][2];
if (!sna_affine_transform_is_rotation(tmp->base.src.transform)) {
+ DBG(("%s: simple (unrotated affine) transform\n", __FUNCTION__));
#if defined(avx2)
if (sna->cpu_features & AVX2) {
tmp->prim_emit = emit_span_simple__avx2;
@@ -2986,6 +2990,7 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
tmp->emit_boxes = emit_span_boxes_simple;
}
} else {
+ DBG(("%s: affine transform\n", __FUNCTION__));
#if defined(avx2)
if (sna->cpu_features & AVX2) {
tmp->prim_emit = emit_span_affine__avx2;
@@ -3006,6 +3011,7 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
tmp->base.floats_per_vertex = 4;
vb = 1 << 2 | 2;
} else {
+ DBG(("%s: projective transform\n", __FUNCTION__));
tmp->prim_emit = emit_composite_spans_primitive;
tmp->base.floats_per_vertex = 5;
vb = 1 << 2 | 3;
More information about the xorg-commit
mailing list