mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-13 08:22:16 -04:00
Merge branch 'master-drm' into 'master'
backend/drm: add virtual cursor plane See merge request wlroots/wlroots!4982
This commit is contained in:
commit
739ccb5059
1 changed files with 59 additions and 0 deletions
|
|
@ -261,6 +261,43 @@ static bool init_plane(struct wlr_drm_backend *drm,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t add_cursor_plane(struct wlr_drm_backend *drm, drmModePlaneRes *plane_res) {
|
||||||
|
if (drm->iface != &legacy_iface) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < drm->num_planes; ++i) {
|
||||||
|
uint32_t id = plane_res->planes[i];
|
||||||
|
|
||||||
|
struct wlr_drm_plane_props props = {0};
|
||||||
|
if (!get_drm_plane_props(drm->fd, id, &props)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t type;
|
||||||
|
if (!get_drm_prop(drm->fd, id, props.type, &type)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == DRM_PLANE_TYPE_CURSOR) {
|
||||||
|
// if cursor plane exits, do not add any
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t crtcs = 0;
|
||||||
|
// check each crtc whether hardware cursor is supported
|
||||||
|
for (size_t i = 0; i < drm->num_crtcs; i++) {
|
||||||
|
if (!drmModeSetCursor(drm->fd, drm->crtcs[i].id, 0, 0, 0)) {
|
||||||
|
++drm->num_planes;
|
||||||
|
crtcs |= 1 << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wlr_log(WLR_DEBUG, "Going to add cursor plane for crtcs %#x", crtcs);
|
||||||
|
return crtcs;
|
||||||
|
}
|
||||||
|
|
||||||
static bool init_planes(struct wlr_drm_backend *drm) {
|
static bool init_planes(struct wlr_drm_backend *drm) {
|
||||||
drmModePlaneRes *plane_res = drmModeGetPlaneResources(drm->fd);
|
drmModePlaneRes *plane_res = drmModeGetPlaneResources(drm->fd);
|
||||||
if (!plane_res) {
|
if (!plane_res) {
|
||||||
|
|
@ -271,6 +308,15 @@ static bool init_planes(struct wlr_drm_backend *drm) {
|
||||||
wlr_log(WLR_INFO, "Found %"PRIu32" DRM planes", plane_res->count_planes);
|
wlr_log(WLR_INFO, "Found %"PRIu32" DRM planes", plane_res->count_planes);
|
||||||
|
|
||||||
drm->num_planes = plane_res->count_planes;
|
drm->num_planes = plane_res->count_planes;
|
||||||
|
/**
|
||||||
|
* when drm works on legacy instead of atomic,
|
||||||
|
* hardware cursor do not work without cursor plane,
|
||||||
|
* add cursor plane for crtcs support hardware cursor.
|
||||||
|
*
|
||||||
|
* drm->num_planes may increase here.
|
||||||
|
*/
|
||||||
|
uint32_t crtcs_add_cursor_plane = add_cursor_plane(drm, plane_res);
|
||||||
|
|
||||||
drm->planes = calloc(drm->num_planes, sizeof(*drm->planes));
|
drm->planes = calloc(drm->num_planes, sizeof(*drm->planes));
|
||||||
if (drm->planes == NULL) {
|
if (drm->planes == NULL) {
|
||||||
wlr_log_errno(WLR_ERROR, "Allocation failed");
|
wlr_log_errno(WLR_ERROR, "Allocation failed");
|
||||||
|
|
@ -294,6 +340,19 @@ static bool init_planes(struct wlr_drm_backend *drm) {
|
||||||
drmModeFreePlane(drm_plane);
|
drmModeFreePlane(drm_plane);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0, j = plane_res->count_planes; i < drm->num_crtcs; ++i) {
|
||||||
|
if (~crtcs_add_cursor_plane & 1 << i) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct wlr_drm_plane *cursor_plane = &drm->planes[j++];
|
||||||
|
// add format ARGB8888 for cursor plane
|
||||||
|
wlr_drm_format_set_add(&cursor_plane->formats, DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_LINEAR);
|
||||||
|
cursor_plane->type = DRM_PLANE_TYPE_CURSOR;
|
||||||
|
|
||||||
|
drm->crtcs[i].cursor = cursor_plane;
|
||||||
|
}
|
||||||
|
|
||||||
drmModeFreePlaneResources(plane_res);
|
drmModeFreePlaneResources(plane_res);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue