]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm: Add a new helper to validate damage during atomic_check
authorDeepak Rawat <drawat@vmware.com>
Thu, 9 Aug 2018 00:36:26 +0000 (17:36 -0700)
committerThomas Hellstrom <thellstrom@vmware.com>
Wed, 5 Dec 2018 09:00:36 +0000 (10:00 +0100)
This helper function makes sure that damage from plane state is
discarded for full modeset.

Signed-off-by: Deepak Rawat <drawat@vmware.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
drivers/gpu/drm/drm_atomic_helper.c
drivers/gpu/drm/drm_damage_helper.c
include/drm/drm_damage_helper.h

index bc9fc9665614f0904f6184be66903d71f93ff9dc..5ed12144ceb74b2b94428dc8652ee8340dc94e6f 100644 (file)
@@ -32,6 +32,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_writeback.h>
+#include <drm/drm_damage_helper.h>
 #include <linux/dma-fence.h>
 
 #include "drm_crtc_helper_internal.h"
@@ -862,6 +863,8 @@ drm_atomic_helper_check_planes(struct drm_device *dev,
 
                drm_atomic_helper_plane_changed(state, old_plane_state, new_plane_state, plane);
 
+               drm_atomic_helper_check_plane_damage(state, new_plane_state);
+
                if (!funcs || !funcs->atomic_check)
                        continue;
 
index 8dc906a489a965e8d9bd424a483c6896068b9e7f..d04937556bc780aa374dfd37837d4acbcf9c2f7e 100644 (file)
@@ -29,6 +29,7 @@
  *
  **************************************************************************/
 
+#include <drm/drm_atomic.h>
 #include <drm/drm_damage_helper.h>
 
 /**
@@ -81,3 +82,37 @@ void drm_plane_enable_fb_damage_clips(struct drm_plane *plane)
                                   0);
 }
 EXPORT_SYMBOL(drm_plane_enable_fb_damage_clips);
+
+/**
+ * drm_atomic_helper_check_plane_damage - Verify plane damage on atomic_check.
+ * @state: The driver state object.
+ * @plane_state: Plane state for which to verify damage.
+ *
+ * This helper function makes sure that damage from plane state is discarded
+ * for full modeset. If there are more reasons a driver would want to do a full
+ * plane update rather than processing individual damage regions, then those
+ * cases should be taken care of here.
+ *
+ * Note that &drm_plane_state.fb_damage_clips == NULL in plane state means that
+ * full plane update should happen. It also ensure helper iterator will return
+ * &drm_plane_state.src as damage.
+ */
+void drm_atomic_helper_check_plane_damage(struct drm_atomic_state *state,
+                                         struct drm_plane_state *plane_state)
+{
+       struct drm_crtc_state *crtc_state;
+
+       if (plane_state->crtc) {
+               crtc_state = drm_atomic_get_new_crtc_state(state,
+                                                          plane_state->crtc);
+
+               if (WARN_ON(!crtc_state))
+                       return;
+
+               if (drm_atomic_crtc_needs_modeset(crtc_state)) {
+                       drm_property_blob_put(plane_state->fb_damage_clips);
+                       plane_state->fb_damage_clips = NULL;
+               }
+       }
+}
+EXPORT_SYMBOL(drm_atomic_helper_check_plane_damage);
index 4947c614fff9b5c90380f44e38e1d7493c5620b4..59584cbf3d408d31dbddc44c8f79ade605f482e4 100644 (file)
@@ -35,5 +35,7 @@
 #include <drm/drm_atomic_helper.h>
 
 void drm_plane_enable_fb_damage_clips(struct drm_plane *plane);
+void drm_atomic_helper_check_plane_damage(struct drm_atomic_state *state,
+                                         struct drm_plane_state *plane_state);
 
 #endif