sna/video: Amalgamate the computation of source vs dest offsets

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-12-18 15:14:00 +00:00
parent d96a226cc5
commit 551b400377
6 changed files with 42 additions and 58 deletions

View File

@ -3875,10 +3875,8 @@ gen3_render_video(struct sna *sna,
struct sna_pixmap *priv = sna_pixmap(pixmap);
BoxPtr pbox = REGION_RECTS(dstRegion);
int nbox = REGION_NUM_RECTS(dstRegion);
int dxo = dstRegion->extents.x1 + dx;
int dyo = dstRegion->extents.y1 + dy;
int width = dstRegion->extents.x2 - dxo;
int height = dstRegion->extents.y2 - dyo;
int width = dstRegion->extents.x2 - dstRegion->extents.x1;
int height = dstRegion->extents.y2 - dstRegion->extents.y1;
float src_scale_x, src_scale_y;
int pix_xoff, pix_yoff;
struct kgem_bo *dst_bo;
@ -3904,8 +3902,8 @@ gen3_render_video(struct sna *sna,
if (!dst_bo)
return false;
pix_xoff = -dxo;
pix_yoff = -dyo;
pix_xoff = -dstRegion->extents.x1;
pix_yoff = -dstRegion->extents.y1;
copy = 1;
} else {
width = pixmap->drawable.width;
@ -3930,7 +3928,7 @@ gen3_render_video(struct sna *sna,
DBG(("%s: src offset=(%d, %d), scale=(%f, %f), dst offset=(%d, %d)\n",
__FUNCTION__,
dxo, dyo, src_scale_x, src_scale_y, pix_xoff, pix_yoff));
dx, dy, src_scale_x, src_scale_y, pix_xoff, pix_yoff));
gen3_video_get_batch(sna, dst_bo);
gen3_emit_video_state(sna, video, frame, pixmap,
@ -3960,20 +3958,20 @@ gen3_render_video(struct sna *sna,
/* bottom right */
OUT_BATCH_F(box_x2 + pix_xoff);
OUT_BATCH_F(box_y2 + pix_yoff);
OUT_BATCH_F((box_x2 - dxo) * src_scale_x);
OUT_BATCH_F((box_y2 - dyo) * src_scale_y);
OUT_BATCH_F((box_x2 - dx) * src_scale_x);
OUT_BATCH_F((box_y2 - dy) * src_scale_y);
/* bottom left */
OUT_BATCH_F(box_x1 + pix_xoff);
OUT_BATCH_F(box_y2 + pix_yoff);
OUT_BATCH_F((box_x1 - dxo) * src_scale_x);
OUT_BATCH_F((box_y2 - dyo) * src_scale_y);
OUT_BATCH_F((box_x1 - dx) * src_scale_x);
OUT_BATCH_F((box_y2 - dy) * src_scale_y);
/* top left */
OUT_BATCH_F(box_x1 + pix_xoff);
OUT_BATCH_F(box_y1 + pix_yoff);
OUT_BATCH_F((box_x1 - dxo) * src_scale_x);
OUT_BATCH_F((box_y1 - dyo) * src_scale_y);
OUT_BATCH_F((box_x1 - dx) * src_scale_x);
OUT_BATCH_F((box_y1 - dy) * src_scale_y);
}
} while (nbox);
@ -3986,7 +3984,7 @@ gen3_render_video(struct sna *sna,
pix_yoff = 0;
#endif
sna_blt_copy_boxes(sna, GXcopy,
dst_bo, -dxo, -dyo,
dst_bo, -dstRegion->extents.x1, -dstRegion->extents.y1,
priv->gpu_bo, pix_xoff, pix_yoff,
pixmap->drawable.bitsPerPixel,
REGION_RECTS(dstRegion),

View File

@ -1671,7 +1671,7 @@ gen4_render_video(struct sna *sna,
PixmapPtr pixmap)
{
struct sna_composite_op tmp;
int nbox, dxo, dyo, pix_xoff, pix_yoff;
int nbox, pix_xoff, pix_yoff;
float src_scale_x, src_scale_y;
struct sna_pixmap *priv;
BoxPtr box;
@ -1725,9 +1725,6 @@ gen4_render_video(struct sna *sna,
pix_yoff = 0;
#endif
dxo = dstRegion->extents.x1 + dx;
dyo = dstRegion->extents.y1 + dy;
/* Use normalized texture coordinates */
src_scale_x = ((float)src_w / frame->width) / (float)drw_w;
src_scale_y = ((float)src_h / frame->height) / (float)drw_h;
@ -1745,16 +1742,16 @@ gen4_render_video(struct sna *sna,
gen4_get_rectangles(sna, &tmp, 1, gen4_video_bind_surfaces);
OUT_VERTEX(r.x2, r.y2);
OUT_VERTEX_F((box->x2 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x2 - dx) * src_scale_x);
OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
OUT_VERTEX(r.x1, r.y2);
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
OUT_VERTEX(r.x1, r.y1);
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
OUT_VERTEX_F((box->y1 - dy) * src_scale_y);
if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
sna_damage_add_box(&priv->gpu_damage, &r);

View File

@ -1668,7 +1668,7 @@ gen5_render_video(struct sna *sna,
PixmapPtr pixmap)
{
struct sna_composite_op tmp;
int nbox, dxo, dyo, pix_xoff, pix_yoff;
int nbox, pix_xoff, pix_yoff;
float src_scale_x, src_scale_y;
struct sna_pixmap *priv;
BoxPtr box;
@ -1722,9 +1722,6 @@ gen5_render_video(struct sna *sna,
pix_yoff = 0;
#endif
dxo = dstRegion->extents.x1 + dx;
dyo = dstRegion->extents.y1 + dy;
/* Use normalized texture coordinates */
src_scale_x = ((float)src_w / frame->width) / (float)drw_w;
src_scale_y = ((float)src_h / frame->height) / (float)drw_h;
@ -1742,16 +1739,16 @@ gen5_render_video(struct sna *sna,
gen5_get_rectangles(sna, &tmp, 1, gen5_video_bind_surfaces);
OUT_VERTEX(r.x2, r.y2);
OUT_VERTEX_F((box->x2 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x2 - dx) * src_scale_x);
OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
OUT_VERTEX(r.x1, r.y2);
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
OUT_VERTEX(r.x1, r.y1);
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
OUT_VERTEX_F((box->y1 - dy) * src_scale_y);
if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
sna_damage_add_box(&priv->gpu_damage, &r);

View File

@ -1980,7 +1980,7 @@ gen6_render_video(struct sna *sna,
PixmapPtr pixmap)
{
struct sna_composite_op tmp;
int nbox, dxo, dyo, pix_xoff, pix_yoff;
int nbox, pix_xoff, pix_yoff;
float src_scale_x, src_scale_y;
struct sna_pixmap *priv;
unsigned filter;
@ -2048,9 +2048,6 @@ gen6_render_video(struct sna *sna,
pix_yoff = 0;
#endif
dxo = dstRegion->extents.x1 + dx;
dyo = dstRegion->extents.y1 + dy;
/* Use normalized texture coordinates */
src_scale_x = ((float)src_w / frame->width) / (float)drw_w;
src_scale_y = ((float)src_h / frame->height) / (float)drw_h;
@ -2068,16 +2065,16 @@ gen6_render_video(struct sna *sna,
gen6_get_rectangles(sna, &tmp, 1, gen6_emit_video_state);
OUT_VERTEX(r.x2, r.y2);
OUT_VERTEX_F((box->x2 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x2 - dx) * src_scale_x);
OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
OUT_VERTEX(r.x1, r.y2);
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
OUT_VERTEX(r.x1, r.y1);
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
OUT_VERTEX_F((box->y1 - dy) * src_scale_y);
if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
sna_damage_add_box(&priv->gpu_damage, &r);

View File

@ -2092,7 +2092,7 @@ gen7_render_video(struct sna *sna,
PixmapPtr pixmap)
{
struct sna_composite_op tmp;
int nbox, dxo, dyo, pix_xoff, pix_yoff;
int nbox, pix_xoff, pix_yoff;
float src_scale_x, src_scale_y;
struct sna_pixmap *priv;
unsigned filter;
@ -2160,9 +2160,6 @@ gen7_render_video(struct sna *sna,
pix_yoff = 0;
#endif
dxo = dstRegion->extents.x1 + dx;
dyo = dstRegion->extents.y1 + dy;
/* Use normalized texture coordinates */
src_scale_x = ((float)src_w / frame->width) / (float)drw_w;
src_scale_y = ((float)src_h / frame->height) / (float)drw_h;
@ -2180,16 +2177,16 @@ gen7_render_video(struct sna *sna,
gen7_get_rectangles(sna, &tmp, 1, gen7_emit_video_state);
OUT_VERTEX(r.x2, r.y2);
OUT_VERTEX_F((box->x2 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x2 - dx) * src_scale_x);
OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
OUT_VERTEX(r.x1, r.y2);
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y2 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
OUT_VERTEX_F((box->y2 - dy) * src_scale_y);
OUT_VERTEX(r.x1, r.y1);
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
OUT_VERTEX_F((box->x1 - dx) * src_scale_x);
OUT_VERTEX_F((box->y1 - dy) * src_scale_y);
if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
sna_damage_add_box(&priv->gpu_damage, &r);

View File

@ -288,10 +288,8 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
ret = Success;
if (!sna->render.video(sna, video, &frame, clip,
src_w, src_h,
drw_w, drw_h,
drw_x - clip->extents.x1 - src_x,
drw_y - clip->extents.y1 - src_y,
src_w, src_h, drw_w, drw_h,
drw_x - src_x, drw_y - src_y,
pixmap)) {
DBG(("%s: failed to render video\n", __FUNCTION__));
ret = BadAlloc;