aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2023-06-18 20:48:36 +0200
committerdec05eba <dec05eba@protonmail.com>2023-06-18 20:48:36 +0200
commit7f2099b3ca28b140ec8c9eed9a08c83c1e49c241 (patch)
tree7a9223b666f29357d6ee28d5a7e149f62f87f286
parentba86d20b2db5cc268a55f1333462217b3c2e9370 (diff)
Update readme
-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);
}