DRM框架(vkms)分析(6)---- plane初始化

本文详细解读了Drm_plane结构体的构成,介绍了Vkms Plane的初始化过程,包括plane支持的格式设置、属性管理和plane控制函数的实现逻辑。重点讨论了plane的原子操作接口,私有属性管理和辅助函数的作用。

一 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 {

    /*使能配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值