From 9b44ebf3269a7838d2288753dd66d48ebce8f8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Thu, 13 Feb 2025 17:36:10 +0100 Subject: [PATCH] cursor-renderer/native: Fix crash with MUTTER_DEBUG_DISABLE_HW_CURSORS=1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don't try to realize the cursor sprite for the HW cursor when it's set. v2: * Refactor is_hw_cursor_supported helper out of realize_cursor_sprite_from_wl_buffer_for_crtc. (Jonas Ådahl) v3: * Keep meta_crtc_native_is_hw_cursor_supported check in meta_cursor_renderer_native_update_cursor, to try and avoid mysterious CI failure. v4: * Rename is_hw_cursor_supported → is_hw_cursor_available_for_gpu and take a MetaGpuKms * parameter. Part-of: --- .../native/meta-cursor-renderer-native.c | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c index 2686e811b4..f0c373e7dc 100644 --- a/src/backends/native/meta-cursor-renderer-native.c +++ b/src/backends/native/meta-cursor-renderer-native.c @@ -285,6 +285,19 @@ on_cursor_sprite_texture_changed (MetaCursorSprite *cursor_sprite, invalidate_cursor_gpu_state (cursor_renderer, cursor_sprite); } +static gboolean +is_hw_cursor_available_for_gpu (MetaGpuKms *gpu_kms) +{ + MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data; + + cursor_renderer_gpu_data = + meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms); + if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken) + return FALSE; + + return TRUE; +} + static gboolean meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer, MetaCursorSprite *cursor_sprite) @@ -316,6 +329,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer, MetaRendererView *renderer_view = META_RENDERER_VIEW (view); MetaCrtc *crtc = meta_renderer_view_get_crtc (renderer_view); MetaCrtcNative *crtc_native = META_CRTC_NATIVE (crtc); + MetaGpuKms *gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc)); ClutterColorState *target_color_state = clutter_stage_view_get_output_color_state (CLUTTER_STAGE_VIEW (view)); CursorStageView *cursor_stage_view = NULL; @@ -325,6 +339,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer, g_assert (cursor_stage_view); if (!META_IS_CRTC_KMS (crtc) || + !is_hw_cursor_available_for_gpu (gpu_kms) || !meta_crtc_native_is_hw_cursor_supported (crtc_native)) { if (cursor_stage_view->has_hw_cursor) @@ -1051,16 +1066,13 @@ realize_cursor_sprite_from_wl_buffer_for_crtc (MetaCursorRenderer *renderer MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (sprite_wayland); MetaGpu *gpu = meta_crtc_get_gpu (META_CRTC (crtc_kms)); MetaGpuKms *gpu_kms = META_GPU_KMS (gpu); - MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data; CoglTexture *texture; uint width, height; MetaWaylandBuffer *buffer; struct wl_resource *buffer_resource; struct wl_shm_buffer *shm_buffer; - cursor_renderer_gpu_data = - meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms); - if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken) + if (!is_hw_cursor_available_for_gpu (gpu_kms)) return FALSE; buffer = meta_cursor_sprite_wayland_get_buffer (sprite_wayland); -- 2.48.1