前言:
无业居家,闭门造车。非常欢迎大家帮忙指正。
有些代码流程是看代码分析的,没有去验证是否正确
我对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

最低0.47元/天 解锁文章
618

被折叠的 条评论
为什么被折叠?



