aboutsummaryrefslogtreecommitdiff
path: root/kms/server/kms_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'kms/server/kms_server.c')
-rw-r--r--kms/server/kms_server.c38
1 files changed, 16 insertions, 22 deletions
diff --git a/kms/server/kms_server.c b/kms/server/kms_server.c
index dac7c31..9c4cb36 100644
--- a/kms/server/kms_server.c
+++ b/kms/server/kms_server.c
@@ -65,9 +65,9 @@ static int send_msg_to_client(int client_fd, gsr_kms_response *response, int *fd
static int kms_get_plane_id(gsr_drm *drm) {
drmModePlaneResPtr planes = NULL;
- drmModePlanePtr plane = NULL;
- drmModeFB2Ptr drmfb = NULL;
int result = -1;
+ int64_t max_size = 0;
+ uint32_t best_plane_match = UINT32_MAX;
if(drmSetClientCap(drm->drmfd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1) != 0) {
fprintf(stderr, "kms server error: drmSetClientCap failed, error: %s\n", strerror(errno));
@@ -81,7 +81,7 @@ static int kms_get_plane_id(gsr_drm *drm) {
}
for(uint32_t i = 0; i < planes->count_planes; ++i) {
- plane = drmModeGetPlane(drm->drmfd, planes->planes[i]);
+ drmModePlanePtr plane = drmModeGetPlane(drm->drmfd, planes->planes[i]);
if(!plane) {
fprintf(stderr, "kms server warning: failed to get drmModePlanePtr for plane %#x: %s (%d)\n", planes->planes[i], strerror(errno), errno);
continue;
@@ -92,34 +92,28 @@ static int kms_get_plane_id(gsr_drm *drm) {
continue;
}
- break;
+ // TODO: Fallback to getfb(1)?
+ drmModeFB2Ptr drmfb = drmModeGetFB2(drm->drmfd, plane->fb_id);
+ if(drmfb) {
+ const int64_t plane_size = (int64_t)drmfb->width * (int64_t)drmfb->height;
+ if(drmfb->handles[0] && plane_size >= max_size) {
+ max_size = plane_size;
+ best_plane_match = plane->plane_id;
+ }
+ drmModeFreeFB2(drmfb);
+ }
+ drmModeFreePlane(plane);
}
- if(!plane) {
+ if(best_plane_match == UINT32_MAX || max_size == 0) {
fprintf(stderr, "kms server error: failed to find a usable plane\n");
goto error;
}
- // TODO: Fallback to getfb(1)?
- drmfb = drmModeGetFB2(drm->drmfd, plane->fb_id);
- if(!drmfb) {
- fprintf(stderr, "kms server error: drmModeGetFB2 failed on plane fb id %d, error: %s\n", plane->fb_id, strerror(errno));
- goto error;
- }
-
- if(!drmfb->handles[0]) {
- fprintf(stderr, "kms server error: drmfb handle is NULL\n");
- goto error;
- }
-
- drm->plane_id = plane->plane_id;
+ drm->plane_id = best_plane_match;
result = 0;
error:
- if(drmfb)
- drmModeFreeFB2(drmfb);
- if(plane)
- drmModeFreePlane(plane);
if(planes)
drmModeFreePlaneResources(planes);