From: Reza Amini <reza.am...@amd.com>

[why]
We want to guarantee integer ratio scaling for all scaling modes.

[how]
Treat centered, fullscreen, preserve aspect ratio the same: scale
the view as many times as possible, and fill in the rest with a black
border.

Signed-off-by: Reza Amini <reza.am...@amd.com>
Reviewed-by: Aric Cyr <aric....@amd.com>
Acked-by: Bhawanpreet Lakha <bhawanpreet.la...@amd.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c      |  8 +++++--
 .../gpu/drm/amd/display/dc/core/dc_resource.c | 21 ++++---------------
 drivers/gpu/drm/amd/display/dc/dc_stream.h    |  1 +
 3 files changed, 11 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index b3366ccc29c3..6d650a0ecbb9 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1551,7 +1551,10 @@ static enum surface_update_type 
get_scaling_info_update_type(
        if (u->scaling_info->clip_rect.width != u->surface->clip_rect.width
                        || u->scaling_info->clip_rect.height != 
u->surface->clip_rect.height
                        || u->scaling_info->dst_rect.width != 
u->surface->dst_rect.width
-                       || u->scaling_info->dst_rect.height != 
u->surface->dst_rect.height) {
+                       || u->scaling_info->dst_rect.height != 
u->surface->dst_rect.height
+                       || u->scaling_info->scaling_quality.integer_scaling !=
+                               u->surface->scaling_quality.integer_scaling
+                       ) {
                update_flags->bits.scaling_change = 1;
 
                if ((u->scaling_info->dst_rect.width < 
u->surface->dst_rect.width
@@ -1672,7 +1675,8 @@ static enum surface_update_type 
check_update_surfaces_for_stream(
                union stream_update_flags *su_flags = 
&stream_update->stream->update_flags;
 
                if ((stream_update->src.height != 0 && stream_update->src.width 
!= 0) ||
-                               (stream_update->dst.height != 0 && 
stream_update->dst.width != 0))
+                       (stream_update->dst.height != 0 && 
stream_update->dst.width != 0) ||
+                       stream_update->integer_scaling_update)
                        su_flags->bits.scaling = 1;
 
                if (stream_update->out_transfer_func)
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 37698305a2dc..30f5434fa8e9 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -951,25 +951,14 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx 
*pipe_ctx)
        data->inits.v_c_bot = dc_fixpt_add(data->inits.v_c, 
data->ratios.vert_c);
 
 }
-static bool are_rects_integer_multiples(struct rect src, struct rect dest)
-{
-       if (dest.width  >= src.width  && dest.width  % src.width  == 0 &&
-               dest.height >= src.height && dest.height % src.height == 0)
-               return true;
-
-       return false;
-}
 
 static void calculate_integer_scaling(struct pipe_ctx *pipe_ctx)
 {
-       if (!pipe_ctx->plane_state->scaling_quality.integer_scaling)
-               return;
+       unsigned int integer_multiple = 1;
 
-       //for Centered Mode
-       if (pipe_ctx->stream->dst.width  == pipe_ctx->stream->src.width &&
-               pipe_ctx->stream->dst.height == pipe_ctx->stream->src.height) {
+       if (pipe_ctx->plane_state->scaling_quality.integer_scaling) {
                // calculate maximum # of replication of src onto addressable
-               unsigned int integer_multiple = min(
+               integer_multiple = min(
                                pipe_ctx->stream->timing.h_addressable / 
pipe_ctx->stream->src.width,
                                pipe_ctx->stream->timing.v_addressable  / 
pipe_ctx->stream->src.height);
 
@@ -980,10 +969,8 @@ static void calculate_integer_scaling(struct pipe_ctx 
*pipe_ctx)
                //center dst onto addressable
                pipe_ctx->stream->dst.x = 
(pipe_ctx->stream->timing.h_addressable - pipe_ctx->stream->dst.width)/2;
                pipe_ctx->stream->dst.y = 
(pipe_ctx->stream->timing.v_addressable - pipe_ctx->stream->dst.height)/2;
-       }
 
-       //disable taps if src & dst are integer ratio
-       if (are_rects_integer_multiples(pipe_ctx->stream->src, 
pipe_ctx->stream->dst)) {
+               //We are guaranteed that we are scaling in integer ratio
                pipe_ctx->plane_state->scaling_quality.v_taps = 1;
                pipe_ctx->plane_state->scaling_quality.h_taps = 1;
                pipe_ctx->plane_state->scaling_quality.v_taps_c = 1;
diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h 
b/drivers/gpu/drm/amd/display/dc/dc_stream.h
index f8c07d5a4054..70274fc43a72 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
@@ -252,6 +252,7 @@ struct dc_stream_update {
        struct dc_info_packet *vsp_infopacket;
 
        bool *dpms_off;
+       bool integer_scaling_update;
 
        struct colorspace_transform *gamut_remap;
        enum dc_color_space *output_color_space;
-- 
2.17.1

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

Reply via email to