aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-11-21 00:25:56 +0100
committerdec05eba <dec05eba@protonmail.com>2024-11-21 00:25:56 +0100
commit02673c46445a78324416e08ec61284012f7bcc8d (patch)
tree54cf80ba361b6981cdecebe74e89c8b89dd8680a /src
parent68c9781f44bddc7256677668b559cd02f29bb059 (diff)
Fix portal capture on broken amd drivers: fallback to opengl copy instead of vaapi on known buggy mesa version
Diffstat (limited to 'src')
-rw-r--r--src/capture/kms.c4
-rw-r--r--src/capture/portal.c4
-rw-r--r--src/capture/xcomposite.c4
-rw-r--r--src/utils.c27
4 files changed, 39 insertions, 0 deletions
diff --git a/src/capture/kms.c b/src/capture/kms.c
index c85811e..fcf3b85 100644
--- a/src/capture/kms.c
+++ b/src/capture/kms.c
@@ -224,6 +224,10 @@ 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);
+ 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");
+
frame->width = video_codec_context->width;
frame->height = video_codec_context->height;
diff --git a/src/capture/portal.c b/src/capture/portal.c
index d68e86f..a441299 100644
--- a/src/capture/portal.c
+++ b/src/capture/portal.c
@@ -310,6 +310,10 @@ 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);
+ 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");
+
frame->width = video_codec_context->width;
frame->height = video_codec_context->height;
diff --git a/src/capture/xcomposite.c b/src/capture/xcomposite.c
index 2867b45..79cd60a 100644
--- a/src/capture/xcomposite.c
+++ b/src/capture/xcomposite.c
@@ -122,6 +122,10 @@ 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);
+ 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");
+
frame->width = video_codec_context->width;
frame->height = video_codec_context->height;
diff --git a/src/utils.c b/src/utils.c
index 188718f..be5e58b 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -415,9 +415,13 @@ bool gl_get_gpu_info(gsr_egl *egl, gsr_gpu_info *info) {
bool supported = true;
const unsigned char *gl_vendor = egl->glGetString(GL_VENDOR);
const unsigned char *gl_renderer = egl->glGetString(GL_RENDERER);
+ const unsigned char *gl_version = egl->glGetString(GL_VERSION);
info->gpu_version = 0;
info->is_steam_deck = false;
+ info->driver_major = 0;
+ info->driver_minor = 0;
+ info->driver_patch = 0;
if(!gl_vendor) {
fprintf(stderr, "gsr error: failed to get gpu vendor\n");
@@ -455,10 +459,33 @@ bool gl_get_gpu_info(gsr_egl *egl, gsr_gpu_info *info) {
info->is_steam_deck = strstr((const char*)gl_renderer, "vangogh") != NULL;
}
+ if(gl_version) {
+ const char *mesa_p = strstr((const char*)gl_version, "Mesa ");
+ if(mesa_p) {
+ mesa_p += 5;
+ int major = 0;
+ int minor = 0;
+ int patch = 0;
+ if(sscanf(mesa_p, "%d.%d.%d", &major, &minor, &patch) == 3) {
+ info->driver_major = major;
+ info->driver_minor = minor;
+ info->driver_patch = patch;
+ }
+ }
+ }
+
end:
return supported;
}
+static bool version_greater_than(int major, int minor, int patch, int other_major, int other_minor, int other_patch) {
+ 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);
+}
+
static bool try_card_has_valid_plane(const char *card_path) {
drmVersion *ver = NULL;
drmModePlaneResPtr planes = NULL;