From 62509a4b60def86c74093001c89297b2896243aa Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 19 Oct 2024 00:48:04 +0200 Subject: nixos fix: look for gsr-kms-server in PATH if not found in same directory as gpu-screen-recorder --- kms/client/kms_client.c | 41 +++++++++++++++++++++++++++++++++++++++-- src/main.cpp | 7 ++++--- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/kms/client/kms_client.c b/kms/client/kms_client.c index b72c64b..6f11244 100644 --- a/kms/client/kms_client.c +++ b/kms/client/kms_client.c @@ -183,6 +183,40 @@ static void file_get_directory(char *filepath) { *end = '\0'; } +static bool find_program_in_path(const char *program_name, char *filepath, int filepath_len) { + const char *path = getenv("PATH"); + if(!path) + return false; + + int program_name_len = strlen(program_name); + const char *end = path + strlen(path); + while(path != end) { + const char *part_end = strchr(path, ':'); + const char *next = part_end; + if(part_end) { + next = part_end + 1; + } else { + part_end = end; + next = end; + } + + int len = part_end - path; + if(len + 1 + program_name_len < filepath_len) { + memcpy(filepath, path, len); + filepath[len] = '/'; + memcpy(filepath + len + 1, program_name, program_name_len); + filepath[len + 1 + program_name_len] = '\0'; + + if(access(filepath, F_OK) == 0) + return true; + } + + path = next; + } + + return false; +} + int gsr_kms_client_init(gsr_kms_client *self, const char *card_path) { int result = -1; self->kms_server_pid = -1; @@ -212,8 +246,11 @@ int gsr_kms_client_init(gsr_kms_client *self, const char *card_path) { } if(access(server_filepath, F_OK) != 0) { - fprintf(stderr, "gsr error: gsr_kms_client_init: gsr-kms-server is not installed (%s not found)\n", server_filepath); - return -1; + fprintf(stderr, "gsr info: gsr_kms_client_init: gsr-kms-server is not installed in the same directory as gpu-screen-recorder (%s not found), looking for gsr-kms-server in PATH instead\n", server_filepath); + if(!find_program_in_path("gsr-kms-server", server_filepath, sizeof(server_filepath)) || access(server_filepath, F_OK) != 0) { + fprintf(stderr, "gsr error: gsr_kms_client_init: gsr-kms-server was not found in PATH. Please install gpu-screen-recorder properly\n"); + return -1; + } } fprintf(stderr, "gsr info: gsr_kms_client_init: setting up connection to %s\n", server_filepath); diff --git a/src/main.cpp b/src/main.cpp index 2073682..2b2f60c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1162,7 +1162,7 @@ static void usage_full() { fprintf(stderr, " Note: the directory to the portal session token file is created automatically if it doesn't exist.\n"); fprintf(stderr, "\n"); fprintf(stderr, " -encoder\n"); - fprintf(stderr, " Which device should be used for video encoding. Should either be 'gpu' or 'cpu'. Does currently only work with h264 codec option (-k).\n"); + fprintf(stderr, " Which device should be used for video encoding. Should either be 'gpu' or 'cpu'. 'cpu' option currently only work with h264 codec option (-k).\n"); fprintf(stderr, " Optional, set to 'gpu' by default.\n"); fprintf(stderr, "\n"); fprintf(stderr, " --info\n"); @@ -1177,6 +1177,7 @@ static void usage_full() { fprintf(stderr, " For example:\n"); fprintf(stderr, " bluez_input.88:C9:E8:66:A2:27|WH-1000XM4\n"); fprintf(stderr, " The is the name to pass to GPU Screen Recorder in a -a option.\n"); + fprintf(stderr, "\n"); fprintf(stderr, " --version\n"); fprintf(stderr, " Print version (%s) and exit\n", GSR_VERSION); fprintf(stderr, "\n"); @@ -1185,7 +1186,7 @@ static void usage_full() { fprintf(stderr, " In replay mode this has to be a directory instead of a file.\n"); fprintf(stderr, " Note: the directory to the file is created automatically if it doesn't already exist.\n"); fprintf(stderr, "\n"); - fprintf(stderr, " -v Prints per second, fps updates. Optional, set to 'yes' by default.\n"); + fprintf(stderr, " -v Prints fps and damage info once per second. Optional, set to 'yes' by default.\n"); fprintf(stderr, "\n"); fprintf(stderr, " -h, --help\n"); fprintf(stderr, " Show this help.\n"); @@ -2609,7 +2610,7 @@ int main(int argc, char **argv) { setenv("__GL_THREADED_OPTIMIZATIONS", "0", true); // Forces low latency encoding mode. Use this environment variable until vaapi supports setting this as a parameter. // The downside of this is that it always uses maximum power, which is not ideal for replay mode that runs on system startup. - // This option was added in mesa 24.1.4, released on july 17, 2024. + // This option was added in mesa 24.1.4, released in july 17, 2024. // TODO: Add an option to enable/disable this? // Seems like the performance issue is not in encoding, but rendering the frame. // Some frames end up taking 10 times longer. Seems to be an issue with amd gpu power management when letting the application sleep on the cpu side? -- cgit v1.2.3