mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-22 06:38:14 +02:00
backend-drm: Add some underlay plane helper elements
Add 'is_underlay' in drm_plane, which is used to indicate whether the HW plane is below the primary plane at the Z position. Add 'has_underlay' in drm_backend, which is used indicate that there are underlay planes in drm backend. Signed-off-by: Chao Guo <chao.guo@nxp.com> Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
This commit is contained in:
parent
827e22761b
commit
a7bfecd541
2 changed files with 29 additions and 2 deletions
|
|
@ -257,6 +257,9 @@ struct drm_backend {
|
|||
|
||||
uint32_t pageflip_timeout;
|
||||
|
||||
/* True, if underlay planes exist. */
|
||||
bool has_underlay;
|
||||
|
||||
struct weston_log_scope *debug;
|
||||
};
|
||||
|
||||
|
|
@ -414,6 +417,8 @@ struct drm_plane {
|
|||
uint32_t crtc_id;
|
||||
|
||||
struct drm_property_info props[WDRM_PLANE__COUNT];
|
||||
/* True if the plane's zpos_max < primary plane's zpos_min. */
|
||||
bool is_underlay;
|
||||
|
||||
/* The last state submitted to the kernel for this plane. */
|
||||
struct drm_plane_state *state_cur;
|
||||
|
|
@ -651,7 +656,7 @@ drm_output_get_plane_type_name(struct drm_plane *p)
|
|||
case WDRM_PLANE_TYPE_CURSOR:
|
||||
return "cursor";
|
||||
case WDRM_PLANE_TYPE_OVERLAY:
|
||||
return "overlay";
|
||||
return p->is_underlay ? "underlay" : "overlay";
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -1155,6 +1155,7 @@ drm_plane_create(struct drm_device *device, const drmModePlane *kplane)
|
|||
plane->possible_crtcs = kplane->possible_crtcs;
|
||||
plane->plane_id = kplane->plane_id;
|
||||
plane->crtc_id = kplane->crtc_id;
|
||||
plane->is_underlay = false;
|
||||
|
||||
weston_drm_format_array_init(&plane->formats);
|
||||
|
||||
|
|
@ -1328,6 +1329,7 @@ create_sprites(struct drm_device *device)
|
|||
struct drm_plane *drm_plane;
|
||||
uint32_t i;
|
||||
uint32_t next_plane_idx = 0;
|
||||
uint64_t primary_plane_zpos_min = DRM_PLANE_ZPOS_INVALID_PLANE;
|
||||
kplane_res = drmModeGetPlaneResources(device->drm.fd);
|
||||
|
||||
if (!kplane_res) {
|
||||
|
|
@ -1350,11 +1352,30 @@ create_sprites(struct drm_device *device)
|
|||
weston_compositor_stack_plane(b->compositor,
|
||||
&drm_plane->base,
|
||||
NULL);
|
||||
|
||||
if (drm_plane->type == WDRM_PLANE_TYPE_PRIMARY)
|
||||
primary_plane_zpos_min = drm_plane->zpos_min;
|
||||
}
|
||||
|
||||
wl_list_for_each (drm_plane, &device->plane_list, link)
|
||||
wl_list_for_each (drm_plane, &device->plane_list, link) {
|
||||
drm_plane->plane_idx = next_plane_idx++;
|
||||
|
||||
if (primary_plane_zpos_min != DRM_PLANE_ZPOS_INVALID_PLANE &&
|
||||
drm_plane->zpos_max != DRM_PLANE_ZPOS_INVALID_PLANE &&
|
||||
drm_plane->zpos_max < primary_plane_zpos_min) {
|
||||
drm_plane->is_underlay = true;
|
||||
b->has_underlay = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (b->has_underlay && !b->format->opaque_substitute) {
|
||||
weston_log("WARNING: Unable to use hardware underlay "
|
||||
"planes as the output format is opaque. In "
|
||||
"order to make use of hardware overlay planes "
|
||||
"adjust the output format.\n");
|
||||
b->has_underlay = false;
|
||||
}
|
||||
|
||||
drmModeFreePlaneResources(kplane_res);
|
||||
}
|
||||
|
||||
|
|
@ -3974,6 +3995,7 @@ drm_backend_create(struct weston_compositor *compositor,
|
|||
b->compositor = compositor;
|
||||
b->pageflip_timeout = config->pageflip_timeout;
|
||||
b->use_pixman_shadow = config->use_pixman_shadow;
|
||||
b->has_underlay = false;
|
||||
|
||||
b->debug = weston_compositor_add_log_scope(compositor, "drm-backend",
|
||||
"Debug messages from DRM/KMS backend\n",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue