drm/atomic-helper: Add format-conversion state to shadow-plane state
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 9 Oct 2023 14:06:31 +0000 (16:06 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 14 Nov 2023 09:01:14 +0000 (10:01 +0100)
Store an instance of struct drm_format_conv_state in the shadow-plane
state struct drm_shadow_plane_state. Many drivers with shadow planes
use DRM's format helpers to copy or convert the framebuffer data to
backing storage in the scanout buffer. The shadow plane provides the
necessary state and manages the conversion's intermediate buffer memory.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
Tested-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231009141018.11291-3-tzimmermann@suse.de
drivers/gpu/drm/drm_gem_atomic_helper.c
include/drm/drm_gem_atomic_helper.h

index 5d4b9cd077f7a621f01718eea37359927c8965c7..e440f458b6633d71ab5c49c5e07c3687b6b025e8 100644 (file)
@@ -218,7 +218,14 @@ void
 __drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane,
                                       struct drm_shadow_plane_state *new_shadow_plane_state)
 {
+       struct drm_plane_state *plane_state = plane->state;
+       struct drm_shadow_plane_state *shadow_plane_state =
+               to_drm_shadow_plane_state(plane_state);
+
        __drm_atomic_helper_plane_duplicate_state(plane, &new_shadow_plane_state->base);
+
+       drm_format_conv_state_copy(&shadow_plane_state->fmtcnv_state,
+                                  &new_shadow_plane_state->fmtcnv_state);
 }
 EXPORT_SYMBOL(__drm_gem_duplicate_shadow_plane_state);
 
@@ -266,6 +273,7 @@ EXPORT_SYMBOL(drm_gem_duplicate_shadow_plane_state);
  */
 void __drm_gem_destroy_shadow_plane_state(struct drm_shadow_plane_state *shadow_plane_state)
 {
+       drm_format_conv_state_release(&shadow_plane_state->fmtcnv_state);
        __drm_atomic_helper_plane_destroy_state(&shadow_plane_state->base);
 }
 EXPORT_SYMBOL(__drm_gem_destroy_shadow_plane_state);
@@ -302,6 +310,7 @@ void __drm_gem_reset_shadow_plane(struct drm_plane *plane,
                                  struct drm_shadow_plane_state *shadow_plane_state)
 {
        __drm_atomic_helper_plane_reset(plane, &shadow_plane_state->base);
+       drm_format_conv_state_init(&shadow_plane_state->fmtcnv_state);
 }
 EXPORT_SYMBOL(__drm_gem_reset_shadow_plane);
 
index 40b8b039518e0cbdf275c57d5beba4f41b15da1d..3e01c619a25e0196e1bab2f537fcc023bb87580c 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <linux/iosys-map.h>
 
+#include <drm/drm_format_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_plane.h>
 
@@ -49,6 +50,15 @@ struct drm_shadow_plane_state {
        /** @base: plane state */
        struct drm_plane_state base;
 
+       /**
+        * @fmtcnv_state: Format-conversion state
+        *
+        * Per-plane state for format conversion.
+        * Flags for copying shadow buffers into backend storage. Also holds
+        * temporary storage for format conversion.
+        */
+       struct drm_format_conv_state fmtcnv_state;
+
        /* Transitional state - do not export or duplicate */
 
        /**