Skip to content

Commit

Permalink
drm/rect: Keep the scaled clip bounded
Browse files Browse the repository at this point in the history
Limit the scaled clip to only clip at most dst_w/h pixels.
This avoids the problem with clip_scaled() not being able
to return negative values. Since new_src_w/h is now properly
bounded we can remove the clamp()s.

Cc: Benjamin Gaignard <[email protected]>
Cc: Maarten Lankhorst <[email protected]>
Cc: Daniel Vetter <[email protected]>
Testcase: igt/kms_selftest/drm_rect_clip_scaled_signed_vs_unsigned
Signed-off-by: Ville Syrjälä <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
Reviewed-by: Daniel Vetter <[email protected]>
Reviewed-by: Benjamin Gaignard <[email protected]>
  • Loading branch information
vsyrjala committed Nov 28, 2019
1 parent 433480c commit 2e35170
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions drivers/gpu/drm/drm_rect.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ static u32 clip_scaled(u32 src, u32 dst, u32 clip)
if (dst == 0)
return 0;

/* Only clip what we have. Keeps the result bounded. */
clip = min(clip, dst);

tmp = mul_u32_u32(src, dst - clip);

/*
Expand Down Expand Up @@ -94,31 +97,31 @@ bool drm_rect_clip_scaled(struct drm_rect *src, struct drm_rect *dst,
u32 new_src_w = clip_scaled(drm_rect_width(src),
drm_rect_width(dst), diff);

src->x1 = clamp_t(int64_t, src->x2 - new_src_w, INT_MIN, INT_MAX);
src->x1 = src->x2 - new_src_w;
dst->x1 = clip->x1;
}
diff = clip->y1 - dst->y1;
if (diff > 0) {
u32 new_src_h = clip_scaled(drm_rect_height(src),
drm_rect_height(dst), diff);

src->y1 = clamp_t(int64_t, src->y2 - new_src_h, INT_MIN, INT_MAX);
src->y1 = src->y2 - new_src_h;
dst->y1 = clip->y1;
}
diff = dst->x2 - clip->x2;
if (diff > 0) {
u32 new_src_w = clip_scaled(drm_rect_width(src),
drm_rect_width(dst), diff);

src->x2 = clamp_t(int64_t, src->x1 + new_src_w, INT_MIN, INT_MAX);
src->x2 = src->x1 + new_src_w;
dst->x2 = clip->x2;
}
diff = dst->y2 - clip->y2;
if (diff > 0) {
u32 new_src_h = clip_scaled(drm_rect_height(src),
drm_rect_height(dst), diff);

src->y2 = clamp_t(int64_t, src->y1 + new_src_h, INT_MIN, INT_MAX);
src->y2 = src->y1 + new_src_h;
dst->y2 = clip->y2;
}

Expand Down

0 comments on commit 2e35170

Please sign in to comment.