aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO14
-rw-r--r--include/utils.h2
-rw-r--r--src/capture/kms.c2
-rw-r--r--src/capture/portal.c2
-rw-r--r--src/capture/xcomposite.c2
-rw-r--r--src/main.cpp3
-rw-r--r--src/utils.c4
7 files changed, 19 insertions, 10 deletions
diff --git a/TODO b/TODO
index 984f42e..5b8d30a 100644
--- a/TODO
+++ b/TODO
@@ -69,8 +69,6 @@ Exit if X11/Wayland killed (if drm plane dead or something?)
Use SRC_W and SRC_H for screen plane instead of crtc_w and crtc_h.
-Make it possible to select which /dev/dri/card* to use, but that requires opengl to also use the same card. Not sure if that is possible for amd, intel and nvidia without using vulkan instead.
-
Test if p2 state can be worked around by using pure nvenc api and overwriting cuInit/cuCtxCreate* to not do anything. Cuda might be loaded when using nvenc but it might not be used, with certain record options? (such as h264 p5).
nvenc uses cuda when using b frames and rgb->yuv conversion, so convert the image ourselves instead.-
@@ -207,4 +205,14 @@ Use different exit codes for different errors. Use one for invalid -w option, an
Ffmpeg fixed black bars in videos on amd when using hevc and when recording at some resolutions, such as 1080p:
https://github.com/FFmpeg/FFmpeg/commit/bcfbf2bac8f9eeeedc407b40596f5c7aaa0d5b47
https://github.com/FFmpeg/FFmpeg/commit/d0facac679faf45d3356dff2e2cb382580d7a521
- Disable gpu screen recorder black bar handling when using hevc on amd when the libavcodec version is the one that comes after those commits. \ No newline at end of file
+ Disable gpu screen recorder black bar handling when using hevc on amd when the libavcodec version is the one that comes after those commits.
+
+Use opengl compute shader instead of graphics shader. This might allow for better performance when games are using 100% of graphics unit which might fix issue with 100% gpu usage causing gpu screen recorder to run slow when not using vaapi to convert rgb to nv12(?).
+
+Always disable prime run/dri prime and list all monitors to record from from all cards.
+ Do this instead of adding an option to choose which gpu to use.
+ On X11 the primary gpu will always have the framebuffer for all monitors combined.
+ Use randr to list all monitors and always record and encode with the primary gpu.
+ On Wayland each gpu will have its own list of monitors with framebuffers.
+ Iterate through all cards with drm and list all monitors with associated framebuffers and when choosing a monitor to record
+ automatically use the associated gpu card. \ No newline at end of file
diff --git a/include/utils.h b/include/utils.h
index d8fa99a..8837c13 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -50,7 +50,7 @@ drm_connector_type_count* drm_connector_types_get_index(drm_connector_type_count
uint32_t monitor_identifier_from_type_and_count(int monitor_type_index, int monitor_type_count);
bool gl_get_gpu_info(gsr_egl *egl, gsr_gpu_info *info);
-bool gl_driver_version_greater_than(const gsr_egl *egl, int major, int minor, int patch);
+bool gl_driver_version_greater_than(const gsr_gpu_info *gpu_info, int major, int minor, int patch);
bool try_card_has_valid_plane(const char *card_path);
/* |output| should be at least 128 bytes in size */
diff --git a/src/capture/kms.c b/src/capture/kms.c
index 27ddec4..ba062f8 100644
--- a/src/capture/kms.c
+++ b/src/capture/kms.c
@@ -227,7 +227,7 @@ static int gsr_capture_kms_start(gsr_capture *cap, AVCodecContext *video_codec_c
video_codec_context->height = FFALIGN(self->params.output_resolution.y, 2);
}
- self->fast_path_failed = self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_AMD && !gl_driver_version_greater_than(self->params.egl, 24, 0, 9);
+ self->fast_path_failed = self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_AMD && !gl_driver_version_greater_than(&self->params.egl->gpu_info, 24, 0, 9);
if(self->fast_path_failed)
fprintf(stderr, "gsr warning: gsr_capture_kms_start: your amd driver (mesa) version is known to be buggy (<= version 24.0.9), falling back to opengl copy\n");
diff --git a/src/capture/portal.c b/src/capture/portal.c
index a441299..9161671 100644
--- a/src/capture/portal.c
+++ b/src/capture/portal.c
@@ -310,7 +310,7 @@ static int gsr_capture_portal_start(gsr_capture *cap, AVCodecContext *video_code
video_codec_context->height = FFALIGN(self->params.output_resolution.y, 2);
}
- self->fast_path_failed = self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_AMD && !gl_driver_version_greater_than(self->params.egl, 24, 0, 9);
+ self->fast_path_failed = self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_AMD && !gl_driver_version_greater_than(&self->params.egl->gpu_info, 24, 0, 9);
if(self->fast_path_failed)
fprintf(stderr, "gsr warning: gsr_capture_kms_start: your amd driver (mesa) version is known to be buggy (<= version 24.0.9), falling back to opengl copy\n");
diff --git a/src/capture/xcomposite.c b/src/capture/xcomposite.c
index 66c700d..d10807e 100644
--- a/src/capture/xcomposite.c
+++ b/src/capture/xcomposite.c
@@ -124,7 +124,7 @@ static int gsr_capture_xcomposite_start(gsr_capture *cap, AVCodecContext *video_
video_codec_context->height = FFALIGN(self->params.output_resolution.y, 2);
}
- self->fast_path_failed = self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_AMD && !gl_driver_version_greater_than(self->params.egl, 24, 0, 9);
+ self->fast_path_failed = self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_AMD && !gl_driver_version_greater_than(&self->params.egl->gpu_info, 24, 0, 9);
if(self->fast_path_failed)
fprintf(stderr, "gsr warning: gsr_capture_kms_start: your amd driver (mesa) version is known to be buggy (<= version 24.0.9), falling back to opengl copy\n");
diff --git a/src/main.cpp b/src/main.cpp
index 994ddef..6b07a76 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1894,7 +1894,7 @@ static bool is_xwayland(Display *display) {
static bool is_using_prime_run() {
const char *prime_render_offload = getenv("__NV_PRIME_RENDER_OFFLOAD");
- return prime_render_offload && strcmp(prime_render_offload, "1") == 0;
+ return (prime_render_offload && strcmp(prime_render_offload, "1") == 0) || getenv("DRI_PRIME");
}
static void disable_prime_run() {
@@ -1902,6 +1902,7 @@ static void disable_prime_run() {
unsetenv("__NV_PRIME_RENDER_OFFLOAD_PROVIDER");
unsetenv("__GLX_VENDOR_LIBRARY_NAME");
unsetenv("__VK_LAYER_NV_optimus");
+ unsetenv("DRI_PRIME");
}
static gsr_window* gsr_window_create(Display *display, bool wayland) {
diff --git a/src/utils.c b/src/utils.c
index 9295541..1feff9d 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -417,8 +417,8 @@ static bool version_greater_than(int major, int minor, int patch, int other_majo
return (major > other_major) || (major == other_major && minor > other_minor) || (major == other_major && minor == other_minor && patch > other_patch);
}
-bool gl_driver_version_greater_than(const gsr_egl *egl, int major, int minor, int patch) {
- return version_greater_than(egl->gpu_info.driver_major, egl->gpu_info.driver_minor, egl->gpu_info.driver_patch, major, minor, patch);
+bool gl_driver_version_greater_than(const gsr_gpu_info *gpu_info, int major, int minor, int patch) {
+ return version_greater_than(gpu_info->driver_major, gpu_info->driver_minor, gpu_info->driver_patch, major, minor, patch);
}
bool try_card_has_valid_plane(const char *card_path) {