数据结构

struct drm_plane_state {
    struct drm_plane *plane; // backpointer指向plane
    struct drm_crtc *crtc; // 通过drm_atomic_set_crtc_for_plane绑定的crtc
    struct drm_framebuffer *fb; // 通过drm_atomic_set_fb_for_plane绑定的fb
    struct dma_fence *fence; //
    int32_t crtc_x; //
    int32_t crtc_y;
    uint32_t crtc_w, crtc_h;
    uint32_t src_x;
    uint32_t src_y;
    uint32_t src_h, src_w;
    int32_t hotspot_x, hotspot_y;
    u16 alpha;
    uint16_t pixel_blend_mode;
    unsigned int rotation;
    unsigned int zpos;
    unsigned int normalized_zpos;
    enum drm_color_encoding color_encoding;
    enum drm_color_range color_range;
    struct drm_property_blob *fb_damage_clips;
    bool ignore_damage_clips;
    struct drm_rect src, dst;
    bool visible;
    enum drm_scaling_filter scaling_filter;
    struct drm_crtc_commit *commit;
    struct drm_atomic_state *state;
    bool color_mgmt_changed : 1;
};
struct drm_plane_helper_funcs {
	int (*prepare_fb)(struct drm_plane *plane,
			  struct drm_plane_state *new_state);
	void (*cleanup_fb)(struct drm_plane *plane,
			   struct drm_plane_state *old_state);
	int (*begin_fb_access)(struct drm_plane *plane, struct drm_plane_state *new_plane_state);
	void (*end_fb_access)(struct drm_plane *plane, struct drm_plane_state *new_plane_state);
	int (*atomic_check)(struct drm_plane *plane,
			    struct drm_atomic_state *state);
	void (*atomic_update)(struct drm_plane *plane,
			      struct drm_atomic_state *state);
	void (*atomic_enable)(struct drm_plane *plane,
			      struct drm_atomic_state *state);
	void (*atomic_disable)(struct drm_plane *plane,
			       struct drm_atomic_state *state);
	int (*atomic_async_check)(struct drm_plane *plane,
				  struct drm_atomic_state *state);
	void (*atomic_async_update)(struct drm_plane *plane,
				    struct drm_atomic_state *state);
	int (*get_scanout_buffer)(struct drm_plane *plane,
				  struct drm_scanout_buffer *sb);
	void (*panic_flush)(struct drm_plane *plane);
};

prepare_fb: 如果没实现,那么在 drm_atomic_helper_prepare_planes 中会调用 drm_gem_plane_helper_prepare_fb()代替。

begin_fb_access: 和 prepare_fb 类似,主要是给使用 shadow buffer 的 driver。

atomic_check: check plane specific constraints。可调用 drm_atomic_helper_check_plane_state()。

atomic_update: 更新 plane state。