OSDN Git Service

drm/vkms: Inherit plane state from struct drm_shadow_plane_state
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 5 Jul 2021 07:46:31 +0000 (09:46 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 13 Jul 2021 11:31:05 +0000 (13:31 +0200)
Subclass struct drm_shadow_plane_state for VKMS planes and update
all plane-state callbacks accordingly.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Melissa Wen <melissa.srw@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210705074633.9425-3-tzimmermann@suse.de
drivers/gpu/drm/vkms/vkms_composer.c
drivers/gpu/drm/vkms/vkms_drv.h
drivers/gpu/drm/vkms/vkms_plane.c

index e495238..3ade0df 100644 (file)
@@ -251,7 +251,7 @@ void vkms_composer_worker(struct work_struct *work)
 
        if (crtc_state->num_active_planes >= 1) {
                act_plane = crtc_state->active_planes[0];
-               if (act_plane->base.plane->type == DRM_PLANE_TYPE_PRIMARY)
+               if (act_plane->base.base.plane->type == DRM_PLANE_TYPE_PRIMARY)
                        primary_composer = act_plane->composer;
        }
 
index ac8c9c2..7a76dcc 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <drm/drm.h>
 #include <drm/drm_gem.h>
+#include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_writeback.h>
 
@@ -33,7 +34,7 @@ struct vkms_composer {
  * @composer: data required for composing computation
  */
 struct vkms_plane_state {
-       struct drm_plane_state base;
+       struct drm_shadow_plane_state base;
        struct vkms_composer *composer;
 };
 
@@ -111,7 +112,7 @@ struct vkms_device {
        container_of(target, struct vkms_crtc_state, base)
 
 #define to_vkms_plane_state(target)\
-       container_of(target, struct vkms_plane_state, base)
+       container_of(target, struct vkms_plane_state, base.base)
 
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
index 107521a..6ee4fa7 100644 (file)
@@ -40,17 +40,16 @@ vkms_plane_duplicate_state(struct drm_plane *plane)
 
        vkms_state->composer = composer;
 
-       __drm_atomic_helper_plane_duplicate_state(plane,
-                                                 &vkms_state->base);
+       __drm_gem_duplicate_shadow_plane_state(plane, &vkms_state->base);
 
-       return &vkms_state->base;
+       return &vkms_state->base.base;
 }
 
 static void vkms_plane_destroy_state(struct drm_plane *plane,
                                     struct drm_plane_state *old_state)
 {
        struct vkms_plane_state *vkms_state = to_vkms_plane_state(old_state);
-       struct drm_crtc *crtc = vkms_state->base.crtc;
+       struct drm_crtc *crtc = vkms_state->base.base.crtc;
 
        if (crtc) {
                /* dropping the reference we acquired in
@@ -63,7 +62,7 @@ static void vkms_plane_destroy_state(struct drm_plane *plane,
        kfree(vkms_state->composer);
        vkms_state->composer = NULL;
 
-       __drm_atomic_helper_plane_destroy_state(old_state);
+       __drm_gem_destroy_shadow_plane_state(&vkms_state->base);
        kfree(vkms_state);
 }
 
@@ -71,8 +70,10 @@ static void vkms_plane_reset(struct drm_plane *plane)
 {
        struct vkms_plane_state *vkms_state;
 
-       if (plane->state)
+       if (plane->state) {
                vkms_plane_destroy_state(plane, plane->state);
+               plane->state = NULL; /* must be set to NULL here */
+       }
 
        vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
        if (!vkms_state) {
@@ -80,8 +81,7 @@ static void vkms_plane_reset(struct drm_plane *plane)
                return;
        }
 
-       plane->state = &vkms_state->base;
-       plane->state->plane = plane;
+       __drm_gem_reset_shadow_plane(plane, &vkms_state->base);
 }
 
 static const struct drm_plane_funcs vkms_plane_funcs = {