nixos fix: look for gsr-kms-server in PATH if not found in same directory as gpu-screen-recorder

This commit is contained in:
dec05eba
2024-10-19 00:48:04 +02:00
parent eb602b9b53
commit 62509a4b60
2 changed files with 43 additions and 5 deletions

View File

@@ -183,6 +183,40 @@ static void file_get_directory(char *filepath) {
*end = '\0'; *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 gsr_kms_client_init(gsr_kms_client *self, const char *card_path) {
int result = -1; int result = -1;
self->kms_server_pid = -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) { 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); 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);
return -1; 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); fprintf(stderr, "gsr info: gsr_kms_client_init: setting up connection to %s\n", server_filepath);

View File

@@ -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, " Note: the directory to the portal session token file is created automatically if it doesn't exist.\n");
fprintf(stderr, "\n"); fprintf(stderr, "\n");
fprintf(stderr, " -encoder\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, " Optional, set to 'gpu' by default.\n");
fprintf(stderr, "\n"); fprintf(stderr, "\n");
fprintf(stderr, " --info\n"); fprintf(stderr, " --info\n");
@@ -1177,6 +1177,7 @@ static void usage_full() {
fprintf(stderr, " For example:\n"); fprintf(stderr, " For example:\n");
fprintf(stderr, " bluez_input.88:C9:E8:66:A2:27|WH-1000XM4\n"); fprintf(stderr, " bluez_input.88:C9:E8:66:A2:27|WH-1000XM4\n");
fprintf(stderr, " The <audio_device_name> is the name to pass to GPU Screen Recorder in a -a option.\n"); fprintf(stderr, " The <audio_device_name> is the name to pass to GPU Screen Recorder in a -a option.\n");
fprintf(stderr, "\n");
fprintf(stderr, " --version\n"); fprintf(stderr, " --version\n");
fprintf(stderr, " Print version (%s) and exit\n", GSR_VERSION); fprintf(stderr, " Print version (%s) and exit\n", GSR_VERSION);
fprintf(stderr, "\n"); 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, " 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, " Note: the directory to the file is created automatically if it doesn't already exist.\n");
fprintf(stderr, "\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, "\n");
fprintf(stderr, " -h, --help\n"); fprintf(stderr, " -h, --help\n");
fprintf(stderr, " Show this help.\n"); fprintf(stderr, " Show this help.\n");
@@ -2609,7 +2610,7 @@ int main(int argc, char **argv) {
setenv("__GL_THREADED_OPTIMIZATIONS", "0", true); setenv("__GL_THREADED_OPTIMIZATIONS", "0", true);
// Forces low latency encoding mode. Use this environment variable until vaapi supports setting this as a parameter. // 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. // 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? // TODO: Add an option to enable/disable this?
// Seems like the performance issue is not in encoding, but rendering the frame. // 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? // 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?