xf86-video-intel: 4 commits - src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/sna_accel.c
Chris Wilson
ickle at kemper.freedesktop.org
Thu Mar 14 15:04:17 PDT 2013
src/sna/gen4_render.c | 4 ++--
src/sna/gen5_render.c | 4 ++--
src/sna/gen6_render.c | 4 ++--
src/sna/gen7_render.c | 26 ++++++++++++++++++++++++--
src/sna/kgem.c | 21 +++++++++++++++------
src/sna/sna_accel.c | 30 ++++++++++++++++++++----------
6 files changed, 65 insertions(+), 24 deletions(-)
New commits:
commit 94cb10c3f2b9bbb6ae3c76faebe9fc88691224a9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 14 22:02:09 2013 +0000
sna/gen5+: Add missing float casts in computation of scaled src offsets
Without the casts, the division ends up as 0 rather than the fractional
offset into the texture.
The casts were missed in the claimed fix:
commit 89038ddb96aabc4bc1f04402b2aca0ce546e8bf3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Feb 28 14:35:54 2013 +0000
sna/video: Correct scaling of source offsets
Reported-by: Roman Elshin <roman.elshin at gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=62343
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 67f7b64..e40a1b7 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1379,10 +1379,10 @@ gen4_render_video(struct sna *sna,
#endif
src_scale_x = (float)src_width / dst_width / frame->width;
- src_offset_x = frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
+ src_offset_x = (float)frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
src_scale_y = (float)src_height / dst_height / frame->height;
- src_offset_y = frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+ src_offset_y = (float)frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
box = REGION_RECTS(dstRegion);
nbox = REGION_NUM_RECTS(dstRegion);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 8c8a996..8b50d22 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1363,10 +1363,10 @@ gen5_render_video(struct sna *sna,
#endif
src_scale_x = (float)src_width / dst_width / frame->width;
- src_offset_x = frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
+ src_offset_x = (float)frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
src_scale_y = (float)src_height / dst_height / frame->height;
- src_offset_y = frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+ src_offset_y = (float)frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
box = REGION_RECTS(dstRegion);
nbox = REGION_NUM_RECTS(dstRegion);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 8d15bd8..64eccc5 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1651,10 +1651,10 @@ gen6_render_video(struct sna *sna,
#endif
src_scale_x = (float)src_width / dst_width / frame->width;
- src_offset_x = frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
+ src_offset_x = (float)frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
src_scale_y = (float)src_height / dst_height / frame->height;
- src_offset_y = frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+ src_offset_y = (float)frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
box = REGION_RECTS(dstRegion);
nbox = REGION_NUM_RECTS(dstRegion);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 4453797..80fa872 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1792,17 +1792,39 @@ gen7_render_video(struct sna *sna,
pix_yoff = 0;
#endif
+ DBG(("%s: src=(%d, %d)x(%d, %d); frame=(%dx%d), dst=(%dx%d)\n",
+ __FUNCTION__,
+ frame->src.x1, frame->src.y1,
+ src_width, src_height,
+ dst_width, dst_height,
+ frame->width, frame->height));
+
src_scale_x = (float)src_width / dst_width / frame->width;
- src_offset_x = frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
+ src_offset_x = (float)frame->src.x1 / frame->width - dstRegion->extents.x1 * src_scale_x;
src_scale_y = (float)src_height / dst_height / frame->height;
- src_offset_y = frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+ src_offset_y = (float)frame->src.y1 / frame->height - dstRegion->extents.y1 * src_scale_y;
+
+ DBG(("%s: scale=(%f, %f), offset=(%f, %f)\n",
+ __FUNCTION__,
+ src_scale_x, src_scale_y,
+ src_offset_x, src_offset_y));
box = REGION_RECTS(dstRegion);
nbox = REGION_NUM_RECTS(dstRegion);
while (nbox--) {
BoxRec r;
+ DBG(("%s: dst=(%d, %d), (%d, %d) + (%d, %d); src=(%f, %f), (%f, %f)\n",
+ __FUNCTION__,
+ box->x1, box->y1,
+ box->x2, box->y2,
+ pix_xoff, pix_yoff,
+ box->x1 * src_scale_x + src_offset_x,
+ box->y1 * src_scale_y + src_offset_y,
+ box->x2 * src_scale_x + src_offset_x,
+ box->y2 * src_scale_y + src_offset_y));
+
r.x1 = box->x1 + pix_xoff;
r.x2 = box->x2 + pix_xoff;
r.y1 = box->y1 + pix_yoff;
commit dad50881d545da665191c6681f2acd0ebc3ddbfc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 14 14:53:13 2013 +0000
sna: Consider placement hints when choosing userptr read path
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index dfb160b..19fe1e3 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -13468,7 +13468,8 @@ static int sna_create_gc(GCPtr gc)
static bool
sna_get_image_blt(DrawablePtr drawable,
RegionPtr region,
- char *dst)
+ char *dst,
+ unsigned flags)
{
PixmapPtr pixmap = get_drawable_pixmap(drawable);
struct sna_pixmap *priv = sna_pixmap(pixmap);
@@ -13477,9 +13478,6 @@ sna_get_image_blt(DrawablePtr drawable,
bool ok = false;
int pitch;
- if (!USE_USERPTR_DOWNLOADS)
- return false;
-
if (priv == NULL)
return false;
@@ -13503,7 +13501,10 @@ sna_get_image_blt(DrawablePtr drawable,
return true;
}
- if (!sna->kgem.has_userptr)
+ if (!sna->kgem.has_userptr || !USE_USERPTR_DOWNLOADS)
+ return false;
+
+ if (flags & (MOVE_WHOLE_HINT | MOVE_INPLACE_HINT))
return false;
if (priv->gpu_damage == NULL)
@@ -13575,14 +13576,15 @@ sna_get_image(DrawablePtr drawable,
drawable->bitsPerPixel >= 8 &&
PM_IS_SOLID(drawable, mask);
- if (can_blt && sna_get_image_blt(drawable, ®ion, dst))
- return;
-
flags = MOVE_READ;
if ((w | h) == 1)
flags |= MOVE_INPLACE_HINT;
if (w == drawable->width)
flags |= MOVE_WHOLE_HINT;
+
+ if (can_blt && sna_get_image_blt(drawable, ®ion, dst, flags))
+ return;
+
if (!sna_drawable_move_region_to_cpu(drawable, ®ion, flags))
return;
commit 11e2802528aed4ef9ffc8b75045c72ac641e54b1
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 14 14:42:25 2013 +0000
sna: Add handle info to sync DBG
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 538231f..34ea212 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4769,14 +4769,17 @@ struct kgem_bo *kgem_create_map(struct kgem *kgem,
void kgem_bo_sync__cpu(struct kgem *kgem, struct kgem_bo *bo)
{
+ DBG(("%s: handle=%d\n", __FUNCTION__, bo->handle));
assert(bo->proxy == NULL);
kgem_bo_submit(kgem, bo);
if (bo->domain != DOMAIN_CPU) {
struct drm_i915_gem_set_domain set_domain;
- DBG(("%s: SYNC: needs_flush? %d, domain? %d, busy? %d\n", __FUNCTION__,
- bo->needs_flush, bo->domain, __kgem_busy(kgem, bo->handle)));
+ DBG(("%s: SYNC: handle=%d, needs_flush? %d, domain? %d, busy? %d\n",
+ __FUNCTION__, bo->handle,
+ bo->needs_flush, bo->domain,
+ __kgem_busy(kgem, bo->handle)));
VG_CLEAR(set_domain);
set_domain.handle = bo->handle;
@@ -4792,6 +4795,7 @@ void kgem_bo_sync__cpu(struct kgem *kgem, struct kgem_bo *bo)
void kgem_bo_sync__cpu_full(struct kgem *kgem, struct kgem_bo *bo, bool write)
{
+ DBG(("%s: handle=%d\n", __FUNCTION__, bo->handle));
assert(bo->proxy == NULL);
if (write || bo->needs_flush)
@@ -4800,8 +4804,10 @@ void kgem_bo_sync__cpu_full(struct kgem *kgem, struct kgem_bo *bo, bool write)
if (bo->domain != DOMAIN_CPU) {
struct drm_i915_gem_set_domain set_domain;
- DBG(("%s: SYNC: needs_flush? %d, domain? %d, busy? %d\n", __FUNCTION__,
- bo->needs_flush, bo->domain, __kgem_busy(kgem, bo->handle)));
+ DBG(("%s: SYNC: handle=%d, needs_flush? %d, domain? %d, busy? %d\n",
+ __FUNCTION__, bo->handle,
+ bo->needs_flush, bo->domain,
+ __kgem_busy(kgem, bo->handle)));
VG_CLEAR(set_domain);
set_domain.handle = bo->handle;
@@ -4818,14 +4824,17 @@ void kgem_bo_sync__cpu_full(struct kgem *kgem, struct kgem_bo *bo, bool write)
void kgem_bo_sync__gtt(struct kgem *kgem, struct kgem_bo *bo)
{
+ DBG(("%s: handle=%d\n", __FUNCTION__, bo->handle));
assert(bo->proxy == NULL);
kgem_bo_submit(kgem, bo);
if (bo->domain != DOMAIN_GTT) {
struct drm_i915_gem_set_domain set_domain;
- DBG(("%s: SYNC: needs_flush? %d, domain? %d, busy? %d\n", __FUNCTION__,
- bo->needs_flush, bo->domain, __kgem_busy(kgem, bo->handle)));
+ DBG(("%s: SYNC: handle=%d, needs_flush? %d, domain? %d, busy? %d\n",
+ __FUNCTION__, bo->handle,
+ bo->needs_flush, bo->domain,
+ __kgem_busy(kgem, bo->handle)));
VG_CLEAR(set_domain);
set_domain.handle = bo->handle;
commit 20832494be06da9ebc4801647521f95e092188fc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 14 14:03:00 2013 +0000
sna: Use userptr downloads for incomplete GPU damaged pixmaps
If the pixmap is not wholly damaged, but still contains the region to be
read, then use userptr (if available).
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index ea7dc7a..dfb160b 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -13506,8 +13506,16 @@ sna_get_image_blt(DrawablePtr drawable,
if (!sna->kgem.has_userptr)
return false;
- if (!DAMAGE_IS_ALL(priv->gpu_damage) ||
- !__kgem_bo_is_busy(&sna->kgem, priv->gpu_bo))
+ if (priv->gpu_damage == NULL)
+ return false;
+
+ assert(priv->gpu_bo);
+ if (!__kgem_bo_is_busy(&sna->kgem, priv->gpu_bo))
+ return false;
+
+ if (!DAMAGE_IS_ALL(priv->gpu_damage) &&
+ !sna_damage_contains_box__no_reduce(priv->gpu_damage,
+ ®ion->extents))
return false;
DBG(("%s: download through a temporary map\n", __FUNCTION__));
More information about the xorg-commit
mailing list