mirror of
https://repo.dec05eba.com/gpu-screen-recorder
synced 2026-03-31 09:07:13 +09:00
Fix portal capture on broken amd drivers: fallback to opengl copy instead of vaapi on known buggy mesa version
This commit is contained in:
@@ -13,6 +13,11 @@ typedef struct {
|
|||||||
gsr_gpu_vendor vendor;
|
gsr_gpu_vendor vendor;
|
||||||
int gpu_version; /* 0 if unknown */
|
int gpu_version; /* 0 if unknown */
|
||||||
bool is_steam_deck;
|
bool is_steam_deck;
|
||||||
|
|
||||||
|
/* Only currently set for Mesa. 0 if unknown format */
|
||||||
|
int driver_major;
|
||||||
|
int driver_minor;
|
||||||
|
int driver_patch;
|
||||||
} gsr_gpu_info;
|
} gsr_gpu_info;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ typedef void(*__GLXextFuncPtr)(void);
|
|||||||
|
|
||||||
#define GL_VENDOR 0x1F00
|
#define GL_VENDOR 0x1F00
|
||||||
#define GL_RENDERER 0x1F01
|
#define GL_RENDERER 0x1F01
|
||||||
|
#define GL_VERSION 0x1F02
|
||||||
|
|
||||||
#define GL_COMPILE_STATUS 0x8B81
|
#define GL_COMPILE_STATUS 0x8B81
|
||||||
#define GL_INFO_LOG_LENGTH 0x8B84
|
#define GL_INFO_LOG_LENGTH 0x8B84
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ bool get_monitor_by_name(const gsr_egl *egl, gsr_connection_type connection_type
|
|||||||
gsr_monitor_rotation drm_monitor_get_display_server_rotation(const gsr_egl *egl, const gsr_monitor *monitor);
|
gsr_monitor_rotation drm_monitor_get_display_server_rotation(const gsr_egl *egl, const gsr_monitor *monitor);
|
||||||
|
|
||||||
bool gl_get_gpu_info(gsr_egl *egl, gsr_gpu_info *info);
|
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);
|
||||||
|
|
||||||
/* |output| should be at least 128 bytes in size */
|
/* |output| should be at least 128 bytes in size */
|
||||||
bool gsr_get_valid_card_path(gsr_egl *egl, char *output, bool is_monitor_capture);
|
bool gsr_get_valid_card_path(gsr_egl *egl, char *output, bool is_monitor_capture);
|
||||||
|
|||||||
@@ -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);
|
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->width = video_codec_context->width;
|
||||||
frame->height = video_codec_context->height;
|
frame->height = video_codec_context->height;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
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->width = video_codec_context->width;
|
||||||
frame->height = video_codec_context->height;
|
frame->height = video_codec_context->height;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
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->width = video_codec_context->width;
|
||||||
frame->height = video_codec_context->height;
|
frame->height = video_codec_context->height;
|
||||||
|
|
||||||
|
|||||||
27
src/utils.c
27
src/utils.c
@@ -415,9 +415,13 @@ bool gl_get_gpu_info(gsr_egl *egl, gsr_gpu_info *info) {
|
|||||||
bool supported = true;
|
bool supported = true;
|
||||||
const unsigned char *gl_vendor = egl->glGetString(GL_VENDOR);
|
const unsigned char *gl_vendor = egl->glGetString(GL_VENDOR);
|
||||||
const unsigned char *gl_renderer = egl->glGetString(GL_RENDERER);
|
const unsigned char *gl_renderer = egl->glGetString(GL_RENDERER);
|
||||||
|
const unsigned char *gl_version = egl->glGetString(GL_VERSION);
|
||||||
|
|
||||||
info->gpu_version = 0;
|
info->gpu_version = 0;
|
||||||
info->is_steam_deck = false;
|
info->is_steam_deck = false;
|
||||||
|
info->driver_major = 0;
|
||||||
|
info->driver_minor = 0;
|
||||||
|
info->driver_patch = 0;
|
||||||
|
|
||||||
if(!gl_vendor) {
|
if(!gl_vendor) {
|
||||||
fprintf(stderr, "gsr error: failed to get gpu vendor\n");
|
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;
|
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:
|
end:
|
||||||
return supported;
|
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) {
|
static bool try_card_has_valid_plane(const char *card_path) {
|
||||||
drmVersion *ver = NULL;
|
drmVersion *ver = NULL;
|
||||||
drmModePlaneResPtr planes = NULL;
|
drmModePlaneResPtr planes = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user