diff options
author | dec05eba <dec05eba@protonmail.com> | 2024-07-15 21:55:16 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2024-07-15 21:55:16 +0200 |
commit | a3b773a963adc57dfb0b22ca02ae7b5e30bdb716 (patch) | |
tree | eba5915c7915d2e84e6f25cb1e70e8c9b12c0134 /src | |
parent | 7b1c546321785224ef0d2df4d2f392d8d292c37e (diff) |
Show warning when capture monitor on intel and the plane is compressed. The warning tells the user to capture on x11 instead or use -w portal option
Diffstat (limited to 'src')
-rw-r--r-- | src/capture/kms.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/capture/kms.c b/src/capture/kms.c index e7b0b59..3e66bdb 100644 --- a/src/capture/kms.c +++ b/src/capture/kms.c @@ -8,6 +8,8 @@ #include <stdio.h> #include <unistd.h> +#include <libdrm/drm_fourcc.h> + #include <libavcodec/avcodec.h> #include <libavutil/mastering_display_metadata.h> @@ -266,6 +268,24 @@ static vec2i swap_vec2i(vec2i value) { return value; } +static bool is_plane_compressed(uint64_t modifier) { + switch(modifier) { + case I915_FORMAT_MOD_Y_TILED_CCS: + case I915_FORMAT_MOD_Yf_TILED_CCS: + case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS: + case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS: + case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC: + case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS: + case I915_FORMAT_MOD_4_TILED_DG2_MC_CCS: + case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC: + case I915_FORMAT_MOD_4_TILED_MTL_RC_CCS: + case I915_FORMAT_MOD_4_TILED_MTL_MC_CCS: + case I915_FORMAT_MOD_4_TILED_MTL_RC_CCS_CC: + return true; + } + return false; +} + static int gsr_capture_kms_capture(gsr_capture *cap, AVFrame *frame, gsr_color_conversion *color_conversion) { gsr_capture_kms *self = cap->priv; const bool screen_plane_use_modifiers = self->params.egl->gpu_info.vendor != GSR_GPU_VENDOR_AMD; @@ -346,6 +366,14 @@ static int gsr_capture_kms_capture(gsr_capture *cap, AVFrame *frame, gsr_color_c EGL_DMA_BUF_PLANE0_PITCH_EXT, drm_fd->pitch, }; + if(is_plane_compressed(drm_fd->modifier)) { + static bool compressed_plane_warning_shown = false; + if(!compressed_plane_warning_shown) { + compressed_plane_warning_shown = true; + fprintf(stderr, "gsr warning: gsr_capture_kms_capture: the monitor plane is compressed. The video will likely be glitched/black. Try recording on X11 instead (maybe capturing a single window) or use the \"-w portal\" capture option on Wayland.\n"); + } + } + if(screen_plane_use_modifiers) { img_attr[12] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT; img_attr[13] = drm_fd->modifier & 0xFFFFFFFFULL; |