drm/vc4: Drop planes that have 0 destination size
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Tue, 6 Feb 2024 17:52:49 +0000 (17:52 +0000)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:35:36 +0000 (11:35 +0000)
There is no point in trying to create a dlist entry for planes
that have a 0 crtc size, and it can also cause grief in the vc6
dlist generation as it takes width-1 and height-1, causing wrap
around.
Drop these planes.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/gpu/drm/vc4/vc4_plane.c

index 4f9057a..bd021d5 100644 (file)
@@ -1114,7 +1114,7 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
        width = vc4_state->src_w[0] >> 16;
        height = vc4_state->src_h[0] >> 16;
 
-       if (!width || !height) {
+       if (!width || !height || !vc4_state->crtc_w || !vc4_state->crtc_h) {
                /* 0 source size probably means the plane is offscreen */
                vc4_state->dlist_initialized = 1;
                return 0;
@@ -1641,8 +1641,10 @@ static int vc6_plane_mode_set(struct drm_plane *plane,
        width = vc4_state->src_w[0] >> 16;
        height = vc4_state->src_h[0] >> 16;
 
-       if (!width || !height) {
-               /* 0 source size probably means the plane is offscreen */
+       if (!width || !height || !vc4_state->crtc_w || !vc4_state->crtc_h) {
+               /* 0 source size probably means the plane is offscreen.
+                * 0 destination size is a redundant plane.
+                */
                vc4_state->dlist_initialized = 1;
                return 0;
        }
@@ -2018,7 +2020,8 @@ int vc4_plane_atomic_check(struct drm_plane *plane,
        if (ret)
                return ret;
 
-       if (!vc4_state->src_w[0] || !vc4_state->src_h[0])
+       if (!vc4_state->src_w[0] || !vc4_state->src_h[0] ||
+           !vc4_state->crtc_w || !vc4_state->crtc_h)
                return 0;
 
        ret = vc4_plane_allocate_lbm(new_plane_state);