DRM驱动代码分析:图层参数更新

前言:
无业居家,闭门造车。非常欢迎大家帮忙指正。
有些代码流程是看代码分析的,没有去验证是否正确
我对DRM框架的很多东西都不了解,所以有些地方会比较生硬。熟悉学习需要时间,文章一直堆在草稿箱可能会降低我的积极性,所以我还是先发布了文章,后面慢慢改进。

1.DRM驱动怎么获得图层的宽、高等参数

1.1 图层参数有哪些?

drivers\gpu\drm\drm_blend.c

standard plane properties
SRC_X &drm_framebuffer里源矩形的x坐标偏移值。必须为正。
SRC_Y &drm_framebuffer里源矩形的y坐标偏移值。必须为正。
SRC_W &drm_framebuffer里原矩形的宽。 SRC_X 加上SRC_W要小于source framebuffer的宽。必须为正。
SRC_H &drm_framebuffer里原矩形的高。 SRC_Y 加上SRC_H要小于source framebuffer的高。必须为正。
CRTC_X 目标矩形的x坐标偏移,可以为负。
CRTC_Y 目标矩形的y坐标偏移,可以为负。
CRTC_W 目标矩形的宽。 CRTC_X加上CRTC_W可以超出&drm_crtc当前的可见水平区域
CRTC_H 目标矩形的高。 CRTC_Y加上CRTC_H可以超出&drm_crtc当前的可见垂直区域
FB_ID Mode object ID of the &drm_framebuffer this plane should scan out.
CRTC_ID Mode object ID of the &drm_crtc this plane should be connected to.
additional plane properties
alpha 透明度,取值范围是0(透明)~0xfff(不透明)。有些格式每个像素都有一个透明度,比如ARGB8888格式。
drm_plane_create_alpha_property()
rotation 旋转角度(包括翻转)
drm_plane_create_rotation_property()
zpos z order,指定图层的顺序。
drm_plane_create_zpos_immutable_property() * drm_plane_create_zpos_property()
pixel blend mode 合成方式,描述了当前图层像素和背景图层的合成方式。

None”: 忽略像素alpha
out.rgb = plane_alpha * fg.rgb + (1 - plane_alpha) * bg.rgb

Pre-multiplied”: 像素rgb值和像素alpha已经预乘过。
out.rgb = plane_alpha * fg.rgb + (1 - (plane_alpha * fg.alpha)) * bg.rgb

Coverage”: 像素rgb值和像素alpha没有预乘过。
out.rgb = plane_alpha * fg.alpha * fg.rgb + (1 - (plane_alpha * fg.alpha)) * bg.rgb

drm_plane_create_blend_mode_property()
SCALING_FILTER Indicates scaling filter to be used for plane scaler.
drm_plane_create_scaling_filter_property

1.2 struct drm_plane_state

include/drm/drm_plane.h
struct drm_plane_state {
   
	...
	struct drm_framebuffer *fb;
	...
	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;
	u16 alpha;
	uint16_t pixel_blend_mode;
	unsigned int rotation;
	unsigned int zpos;
	...
};

struct drm_plane_state里存储了图层的一些参数

crtc_x,图层可见区域在CRTC上的左侧位置(pos x)。数据类型是int32_t有符号整数,位置可以在屏幕之外(代码上怎么处理?)。

crtc_y,图层可见区域在CRTC上的上方位置(pos y)。数据类型是int32_t有符号整数,位置可以在屏幕之外。

crtc_w,图层可见区域在CRTC上的宽

crtc_h,图层可见区域在CRTC上的高

src_x,图层可见区域在图层上的左侧位置(crop start x)

src_y,图层可见区域在图层上的上方位置(crop start y)

src_h,图层可见区域的高

src_w,图层可见区域的宽

alpha,图层透明度,0表示完全透明,0xffff表示完全不透明

pixel_blend_mode,透明度合成公式的选择,表示当前图层的像素用什么方式和背景图层合成。

rotation,图层的旋转角度

zpos,图层在CRTC上的优先级(zorder)

normalized_zpos,归一化的zpos,范围是0~N-1,其中N是CRTC的有效图层

1.3 更新图层属性(plane property)

drivers\gpu\drm\drm_ioctl.c
DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER),
drivers\gpu\drm\drm_atomic_uapi.c
int drm_mode_atomic_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
for (j = 0; j < count_props; j++)
		ret = drm_atomic_set_property(state, file_priv, obj, prop, prop_value);
drivers\gpu\drm\drm_atomic_uapi.c
int drm_atomic_set_property(struct drm_atomic_state *state, struct 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值