lkml.org 
[lkml]   [2022]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 189/545] drm/vc4: plane: Remove subpixel positioning check
    Date
    From: Dom Cobley <popcornmix@gmail.com>

    [ Upstream commit 517db1ab1566dba3093dbdb8de4263ba4aa66416 ]

    There is little harm in ignoring fractional coordinates
    (they just get truncated).

    Without this:
    modetest -M vc4 -F tiles,gradient -s 32:1920x1080-60 -P89@74:1920x1080*.1.1@XR24

    is rejected. We have the same issue in Kodi when trying to
    use zoom options on video.

    Note: even if all coordinates are fully integer. e.g.
    src:[0,0,1920,1080] dest:[-10,-10,1940,1100]

    it will still get rejected as drm_atomic_helper_check_plane_state
    uses drm_rect_clip_scaled which transforms this to fractional src coords

    Fixes: 21af94cf1a4c ("drm/vc4: Add support for scaling of display planes.")
    Signed-off-by: Dom Cobley <popcornmix@gmail.com>
    Link: https://lore.kernel.org/r/20220613144800.326124-5-maxime@cerno.tech
    Signed-off-by: Maxime Ripard <maxime@cerno.tech>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/vc4/vc4_plane.c | 22 +++++++++-------------
    1 file changed, 9 insertions(+), 13 deletions(-)

    diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
    index af4b8944a603..bdf16554cf68 100644
    --- a/drivers/gpu/drm/vc4/vc4_plane.c
    +++ b/drivers/gpu/drm/vc4/vc4_plane.c
    @@ -332,7 +332,6 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
    struct vc4_plane_state *vc4_state = to_vc4_plane_state(state);
    struct drm_framebuffer *fb = state->fb;
    struct drm_gem_cma_object *bo = drm_fb_cma_get_gem_obj(fb, 0);
    - u32 subpixel_src_mask = (1 << 16) - 1;
    int num_planes = fb->format->num_planes;
    struct drm_crtc_state *crtc_state;
    u32 h_subsample = fb->format->hsub;
    @@ -354,18 +353,15 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
    for (i = 0; i < num_planes; i++)
    vc4_state->offsets[i] = bo->paddr + fb->offsets[i];

    - /* We don't support subpixel source positioning for scaling. */
    - if ((state->src.x1 & subpixel_src_mask) ||
    - (state->src.x2 & subpixel_src_mask) ||
    - (state->src.y1 & subpixel_src_mask) ||
    - (state->src.y2 & subpixel_src_mask)) {
    - return -EINVAL;
    - }
    -
    - vc4_state->src_x = state->src.x1 >> 16;
    - vc4_state->src_y = state->src.y1 >> 16;
    - vc4_state->src_w[0] = (state->src.x2 - state->src.x1) >> 16;
    - vc4_state->src_h[0] = (state->src.y2 - state->src.y1) >> 16;
    + /*
    + * We don't support subpixel source positioning for scaling,
    + * but fractional coordinates can be generated by clipping
    + * so just round for now
    + */
    + vc4_state->src_x = DIV_ROUND_CLOSEST(state->src.x1, 1 << 16);
    + vc4_state->src_y = DIV_ROUND_CLOSEST(state->src.y1, 1 << 16);
    + vc4_state->src_w[0] = DIV_ROUND_CLOSEST(state->src.x2, 1 << 16) - vc4_state->src_x;
    + vc4_state->src_h[0] = DIV_ROUND_CLOSEST(state->src.y2, 1 << 16) - vc4_state->src_y;

    vc4_state->crtc_x = state->dst.x1;
    vc4_state->crtc_y = state->dst.y1;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-19 18:12    [W:2.291 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site