一 drm_plane结构体
struct drm_plane {
struct drm_device *dev;
//挂载到&drm_mode_config.plane_list
struct list_head head;
char *name;
struct drm_modeset_lock mutex;
//表示plane的mode对象, 其包含了plane的各种属性
struct drm_mode_object base;
/**
* @possible_crtcs: pipes this plane can be bound to constructed from
* drm_crtc_mask()
*/
//绑定的crtc
uint32_t possible_crtcs;
//plane支持的fb像素format类型数组, format类型如DRM_FORMAT_ARGB8888
uint32_t *format_types;
//plane支持的fb像素format类型数组大小
unsigned int format_count;
bool format_default;
//modifier数组,其存放的值如DRM_FORMAT_MOD_LINEAR/DRM_FORMAT_MOD_X_TILED等
uint64_t *modifiers;
unsigned int modifier_count;
/**
* @crtc:
*
* Currently bound CRTC, only meaningful for non-atomic drivers. For
* atomic drivers this is forced to be NULL, atomic drivers should
* instead check &drm_plane_state.crtc.
*/
/*no-atomic drivers用来标识当前绑定的crtc。 对于atomic driver,该值应该为null
*并使用 &drm_plane_state.crtc替代
*/
struct drm_crtc *crtc;
/*no-atomic drivers用来标识当前绑定的fb。 对于atomic driver,该值应该为null
*并使用 &drm_plane_state.fb替代
*/
struct drm_framebuffer *fb;
/*对于non-atomic drivers, old_fb用于在modeset操作时跟踪老的fb
* atomic drivers下,该值为Null
*/
struct drm_framebuffer *old_fb;
//plane funcs
const struct drm_plane_funcs *funcs;
/** @properties: property tracking for this plane */
//plane的属性
struct drm_object_properties properties;
//如DRM_PLANE_TYPE_OVERLAY/DRM_PLANE_TYPE_PRIMARY/DRM_PLANE_TYPE_CURSOR
enum drm_plane_type type;
//mode_config.list中的序号
unsigned index;
const struct drm_plane_helper_funcs *helper_private;
//表示plane的各种状态,如其绑定的crtc/fb等,用于atomic操作
struct drm_plane_state *state;
//这些属性待研究
struct drm_property *alpha_property;
struct drm_property *zpos_property;
struct drm_property *rotation_property;
struct drm_property *blend_mode_property;
struct drm_property *color_encoding_property;
struct drm_property *color_range_property;
struct drm_property *scaling_filter_property;
};
二 drm_plane的初始化
vkms_plane_init
//设置plane支持的fb formats
fromats = vkms_formats
//设置plane->helper_private
funcs = &vkms_primary_helper_funcs
ret = drm_universal_plane_init(dev, plane, 1<<index,
&vkms_plane_funcs,
formats, nformats,
NULL, type, NULL);
__drm_universal_plane_init
//创建DRM_MODE_OBJECT_PLANE类型的drm_mode_object对象plane->base
ret = drm_mode_object_add(dev, &plane->base, DRM_MODE_OBJECT_PLANE);
//绑定base.properties到plane->properties
plane->base.properties = &plane->properties
plane->funs = funcs; // vkms_plane_funcs;
//.... 设置format_types/ modifiers/ possible_crtcs等
// 将dev->mode_config->prop_fb_id等属性绑定到plane->base中
drm_obj_attack_property(....)
//设置plane->helper_private = vkms_primary_helper_funcs
drm_plane_helper_add(plane, funcs)
三 plane->funcs
/**
* struct drm_plane_funcs - driver plane control functions
*/
struct drm_plane_funcs {
/*使能配置