backend-drm: Pass the drm_fb to each prepare_overlay/scanout_view functions
authorMarius Vlad <marius.vlad@collabora.com>
Thu, 31 Oct 2019 10:48:35 +0000 (12:48 +0200)
committerDaniel Stone <daniels@collabora.com>
Mon, 11 Nov 2019 16:51:48 +0000 (16:51 +0000)
Avoids the need to retrieve the DRM framebuffer in each function and
re-uses the one got before constructing the zpos candidate list.

Takes another reference for the scanout as to live the state, like
there's one for the overlay bit.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
libweston/backend-drm/state-propose.c

index 2974167982a093d6c690dedd07af0dab58d73f17..6a1c4766f37c08c37a1adb790374b66affa97c01 100644 (file)
@@ -180,13 +180,12 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
                                struct drm_output_state *output_state,
                                struct weston_view *ev,
                                enum drm_output_propose_state_mode mode,
-                               uint64_t zpos)
+                               struct drm_fb *fb, uint64_t zpos)
 {
        struct drm_output *output = output_state->output;
        struct weston_compositor *ec = output->base.compositor;
        struct drm_backend *b = to_drm_backend(ec);
        struct drm_plane_state *state = NULL;
-       struct drm_fb *fb;
        int ret;
        enum {
                NO_PLANES,
@@ -197,7 +196,6 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
        assert(!b->sprites_are_broken);
        assert(b->atomic_modeset);
 
-       fb = drm_fb_get_from_view(output_state, ev);
        if (!fb) {
                drm_debug(b, "\t\t\t\t[overlay] not placing view %p on overlay: "
                             " couldn't get fb\n", ev);
@@ -205,13 +203,12 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
        }
 
        state = drm_output_state_get_plane(output_state, plane);
-       if (state->fb) {
-               state = NULL;
-               goto out;
-       }
+       /* we can't have a 'pending' framebuffer as never set one before reaching here */
+       assert(!state->fb);
 
        state->ev = ev;
        state->output = output;
+
        if (!drm_plane_state_coords_for_view(state, ev, zpos)) {
                drm_debug(b, "\t\t\t\t[overlay] not placing view %p on overlay: "
                             "unsuitable transform\n", ev);
@@ -232,10 +229,9 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
                goto out;
        }
 
-       /* We hold one reference for the lifetime of this function;
-        * from calling drm_fb_get_from_view, to the out label where
-        * we unconditionally drop the reference. So, we take another
-        * reference here to live within the state. */
+       /* We hold one reference for the lifetime of this function; from
+        * calling drm_fb_get_from_view() in drm_output_prepare_plane_view(),
+        * so, we take another reference here to live within the state. */
        state->fb = drm_fb_ref(fb);
 
        state->in_fence_fd = ev->surface->acquire_fence_fd;
@@ -277,7 +273,6 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
        }
 
 out:
-       drm_fb_unref(fb);
        return state;
 }
 
@@ -423,13 +418,12 @@ static struct drm_plane_state *
 drm_output_prepare_scanout_view(struct drm_output_state *output_state,
                                struct weston_view *ev,
                                enum drm_output_propose_state_mode mode,
-                               uint64_t zpos)
+                               struct drm_fb *fb, uint64_t zpos)
 {
        struct drm_output *output = output_state->output;
        struct drm_backend *b = to_drm_backend(output->base.compositor);
        struct drm_plane *scanout_plane = output->scanout_plane;
        struct drm_plane_state *state;
-       struct drm_fb *fb;
 
        assert(!b->sprites_are_broken);
        assert(b->atomic_modeset);
@@ -446,7 +440,6 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
            scanout_plane->props[WDRM_PLANE_IN_FENCE_FD].prop_id == 0)
                return NULL;
 
-       fb = drm_fb_get_from_view(output_state, ev);
        if (!fb) {
                drm_debug(b, "\t\t\t\t[scanout] not placing view %p on scanout: "
                             " couldn't get fb\n", ev);
@@ -461,7 +454,9 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
         * and in the latter case, the view must have been marked as occluded,
         * meaning we should never have ended up here. */
        assert(!state->fb);
-       state->fb = fb;
+
+       /* take another reference here to live within the state */
+       state->fb = drm_fb_ref(fb);
        state->ev = ev;
        state->output = output;
        if (!drm_plane_state_coords_for_view(state, ev, zpos))
@@ -510,7 +505,7 @@ drm_output_try_view_on_plane(struct drm_plane *plane,
                             struct drm_output_state *state,
                             struct weston_view *ev,
                             enum drm_output_propose_state_mode mode,
-                            uint64_t zpos)
+                            struct drm_fb *fb, uint64_t zpos)
 {
        struct drm_backend *b = state->pending_state->backend;
        struct weston_output *wet_output = &state->output->base;
@@ -547,7 +542,8 @@ drm_output_try_view_on_plane(struct drm_plane *plane,
                                     plane->plane_id, ev);
                        return NULL;
                }
-               return drm_output_prepare_overlay_view(plane, state, ev, mode, zpos);
+               return drm_output_prepare_overlay_view(plane, state, ev,
+                                                      mode, fb, zpos);
        case WDRM_PLANE_TYPE_PRIMARY:
                if (mode != DRM_OUTPUT_PROPOSE_STATE_PLANES_ONLY) {
                        drm_debug(b, "\t\t\t\t[plane] plane %d refusing to "
@@ -555,7 +551,8 @@ drm_output_try_view_on_plane(struct drm_plane *plane,
                                     plane->plane_id, ev);
                        return NULL;
                }
-               return drm_output_prepare_scanout_view(state, ev, mode, zpos);
+               return drm_output_prepare_scanout_view(state, ev, mode,
+                                                      fb, zpos);
        default:
                assert(0);
                break;
@@ -677,9 +674,9 @@ drm_output_prepare_plane_view(struct drm_output_state *state,
                             "from candidate list, type: %s\n",
                             plane->plane_id, p_name);
 
-               ps = drm_output_try_view_on_plane(plane, state, ev, mode, zpos);
+               ps = drm_output_try_view_on_plane(plane, state, ev,
+                                                 mode, fb, zpos);
                drm_output_destroy_zpos_plane(head_p_zpos);
-
                if (ps) {
                        drm_debug(b, "\t\t\t\t[view] view %p has been placed to "
                                     "%s plane with computed zpos %"PRIu64"\n",