数据结构
struct drm_plane{
}
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;
};
crtc_x/y/w/h
: 设置该 plane 可见区域的起始位置和大小。
src_x/y/w/h
: 从 framebuffer 中取 pixels 的可见区域起始位置和大小
当 SRC 与 CRTC 的 X/Y 不相等时,则实现了平移的效果; 当 SRC 与 CRTC 的 W/H 不相等时,则实现了缩放的效果; 当 SRC 与 FrameBuffer 的 W/H 不相等时,则实现了裁剪的效果;
hotspot_x/y
:
alpha
: 该 plane 的透明度,0x0 为全透明,0xff 为不透明。需要调用 drm_plane_create_alpha_property()来创建该 property。
pixel_blend_mode
: 当前 plane 和背景 blend 的模式。有三种 blend mode, DRM_MODE_BLEND_PIXEL_NONE, DRM_MODE_BLEND_PREMULTI, DRM_MODE_BLEND_COVERAGE。
三者计算公式不同,具体参考 drm_blend.c 注释。
rotation
: 旋转/镜像 plane,需要通过 drm_plane_create_rotation_property()创建该 property。
zpos
: plane 的叠加优先顺序。需要通过 drm_plane_create_zpos_property() 或 drm_plane_create_zpos_immutable_property()创建该 property。
normalized_zpos
: 相比于 zpos 可以自行设定值,normalize 后的 zpos 在范围 0~N-1, N 为 plane 的数量。
color_encoding
: 设置非 RGB 格式的颜色编码,包括 BT601, BT709, BT2020。
color_range
: 设置非 RGB 格式的颜色范围,包括 limited range, full range。
fb_damage_clips
:
ignore_damage_clips
:
src/dst
: 经过 drm_atomic_helper_check_plane_state clip 后的 fb 源地址和 plane 目标地址。硬件编程最好使用这个属性,而不是前面的 crtc_x/y/w/h 和 src_x/y/w/h。
visible
: 表示该 plane 是否可见,可在 plane atomic_check, atomic_update 中来检查一下该属性。
scaling_filter
: 参考 enum drm_scaling_filter。大部分 driver 都不支持。
color_mgmt_changed
: 表示 color management 属性是否被改变。注意这边 crtc_state 中也有一样的 color_mgmt_changed,在代码中看到一般都是操作 crtc_state 的 color_mgmt_changed。
struct drm_plane_funcs {
int (*update_plane)(struct drm_plane *plane,
struct drm_crtc *crtc, struct drm_framebuffer *fb,
int crtc_x, int crtc_y,
unsigned int crtc_w, unsigned int crtc_h,
uint32_t src_x, uint32_t src_y,
uint32_t src_w, uint32_t src_h,
struct drm_modeset_acquire_ctx *ctx);
int (*disable_plane)(struct drm_plane *plane,
struct drm_modeset_acquire_ctx *ctx);
void (*destroy)(struct drm_plane *plane);
void (*reset)(struct drm_plane *plane);
int (*set_property)(struct drm_plane *plane,
struct drm_property *property, uint64_t val);
struct drm_plane_state *(*atomic_duplicate_state)(struct drm_plane *plane);
void (*atomic_destroy_state)(struct drm_plane *plane,
struct drm_plane_state *state);
int (*atomic_set_property)(struct drm_plane *plane,
struct drm_plane_state *state,
struct drm_property *property,
uint64_t val);
int (*atomic_get_property)(struct drm_plane *plane,
const struct drm_plane_state *state,
struct drm_property *property,
uint64_t *val);
int (*late_register)(struct drm_plane *plane);
void (*early_unregister)(struct drm_plane *plane);
void (*atomic_print_state)(struct drm_printer *p,
const struct drm_plane_state *state);
bool (*format_mod_supported)(struct drm_plane *plane, uint32_t format,
uint64_t modifier);
};
update_plane
: legacy support,ioctrl setplane 会调用到,直接用 drm_atomic_helper_update_plane
disable_plane
: legacy support, 直接用 drm_atomic_helper_disable_plane
destroy
: 和 crtc 相关回调类似, drm_plane_cleanupreset
: 同上, drm_atomic_helper_plane_resetset_preperty
: 同上atomic_duplicate_state
: 同上, drm_atomic_helper_plane_duplicate_stateatomic_destroy_state
: 同上, drm_atomic_helper_plane_destroy_stateatomic_set_property
: 同上atomic_get_property
: 同上late_register
: 同上early_unregister
: 同上atomic_print_state
: 同上
format_mod_supported
: 检查 format 和 modifier 是否支持。
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
: optional hook, 准备 framebuffer,包括 flush cache 等。如果没实现,那么在 drm_atomic_helper_prepare_planes 中会调用 drm_gem_plane_helper_prepare_fb()代替cleanup_fb
: optional hook, free resources in prepare fb
begin_fb_access
: optional hook, 和 prepare_fb 类似,主要是给使用 shadow buffer 的 driverend_fb_access
: optional hook, free resources in begin_fb_access
atomic_check
: optional hook, check plane specific constraints。可在回调中调用 drm_atomic_helper_check_plane_state()。
atomic_update
: 更新 plane state。