aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--kms/server/kms_server.c13
2 files changed, 8 insertions, 7 deletions
diff --git a/README.md b/README.md
index 17c2d7e..f107aae 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ GPU Screen Recorder only supports h264 and hevc codecs at the moment which means
### AMD/Intel root permission
When recording a window under AMD/Intel no special user permission is required, however when recording a monitor the program needs root permission (to access KMS).
To make this safer, the part that needs root access has been moved to its own executable (to make it as small as possible) and a GUI sudo prompt is shown to run this executable as root. The executable is called "gsr-kms-server".
-However this doesn't work if you want to start replay at startup for example. To fix this, run: `sudo setcap cap_sys_admin+ep /usr/bin/gsr-kms-server` if you have installed GPU Screen Recorder.
+However this doesn't work if you want to start replay at startup for example. To fix this, run: `sudo setcap cap_sys_admin+ep /usr/bin/gsr-kms-server` if you have installed GPU Screen Recorder from source or AUR.
# Performance
On a system with a i5 4690k CPU and a GTX 1080 GPU:\
diff --git a/kms/server/kms_server.c b/kms/server/kms_server.c
index 5aa6590..a15eb2b 100644
--- a/kms/server/kms_server.c
+++ b/kms/server/kms_server.c
@@ -167,28 +167,29 @@ static int kms_get_plane_ids(gsr_drm *drm) {
}
for(uint32_t i = 0; i < planes->count_planes && drm->num_plane_ids < GSR_KMS_MAX_PLANES; ++i) {
+ drmModeFB2Ptr drmfb = NULL;
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;
}
- if(!plane->fb_id) {
- drmModeFreePlane(plane);
- continue;
- }
+ if(!plane->fb_id)
+ goto next;
if(plane_is_cursor_plane(drm->drmfd, plane->plane_id))
- continue;
+ goto next;
// TODO: Fallback to getfb(1)?
- drmModeFB2Ptr drmfb = drmModeGetFB2(drm->drmfd, plane->fb_id);
+ drmfb = drmModeGetFB2(drm->drmfd, plane->fb_id);
if(drmfb) {
drm->plane_ids[drm->num_plane_ids] = plane->plane_id;
drm->connector_ids[drm->num_plane_ids] = get_connector_by_crtc_id(&c2crtc_map, plane->crtc_id);
++drm->num_plane_ids;
drmModeFreeFB2(drmfb);
}
+
+ next:
drmModeFreePlane(plane);
}