From: Ville Syrjälä <ville.syrj...@linux.intel.com>

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 <benjamin.gaign...@st.com>
Cc: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/drm_rect.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_rect.c b/drivers/gpu/drm/drm_rect.c
index b8363aaa9032..7762b6e9278d 100644
--- a/drivers/gpu/drm/drm_rect.c
+++ b/drivers/gpu/drm/drm_rect.c
@@ -54,7 +54,12 @@ EXPORT_SYMBOL(drm_rect_intersect);
 
 static u32 clip_scaled(u32 src, u32 dst, u32 clip)
 {
-       u64 tmp = mul_u32_u32(src, dst - clip);
+       u64 tmp;
+
+       /* Only clip what we have. Keeps the result bounded as well. */
+       clip = min(clip, dst);
+
+       tmp = mul_u32_u32(src, dst - clip);
 
        /*
         * Round toward 1.0 when clipping so that we don't accidentally
@@ -89,7 +94,7 @@ 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;
@@ -97,7 +102,7 @@ bool drm_rect_clip_scaled(struct drm_rect *src, struct 
drm_rect *dst,
                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;
@@ -105,7 +110,7 @@ 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->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;
@@ -113,7 +118,7 @@ bool drm_rect_clip_scaled(struct drm_rect *src, struct 
drm_rect *dst,
                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;
        }
 
-- 
2.23.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to