cursor-renderer/native: Transform cursor sprite into output color state
This avoids making the cursor too bright when HDR is enabled. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3433>
This commit is contained in:
parent
b0e4d7c6ad
commit
a72ee3be0d
@ -119,6 +119,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative, meta_cursor_renderer_nativ
|
|||||||
static gboolean
|
static gboolean
|
||||||
realize_cursor_sprite_for_crtc (MetaCursorRenderer *renderer,
|
realize_cursor_sprite_for_crtc (MetaCursorRenderer *renderer,
|
||||||
MetaCrtcKms *crtc_kms,
|
MetaCrtcKms *crtc_kms,
|
||||||
|
ClutterColorState *target_color_state,
|
||||||
MetaCursorSprite *cursor_sprite);
|
MetaCursorSprite *cursor_sprite);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -324,6 +325,8 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer,
|
|||||||
MetaRendererView *renderer_view = META_RENDERER_VIEW (view);
|
MetaRendererView *renderer_view = META_RENDERER_VIEW (view);
|
||||||
MetaCrtc *crtc = meta_renderer_view_get_crtc (renderer_view);
|
MetaCrtc *crtc = meta_renderer_view_get_crtc (renderer_view);
|
||||||
MetaCrtcNative *crtc_native = META_CRTC_NATIVE (crtc);
|
MetaCrtcNative *crtc_native = META_CRTC_NATIVE (crtc);
|
||||||
|
ClutterColorState *target_color_state =
|
||||||
|
clutter_stage_view_get_output_color_state (CLUTTER_STAGE_VIEW (view));
|
||||||
CursorStageView *cursor_stage_view = NULL;
|
CursorStageView *cursor_stage_view = NULL;
|
||||||
gboolean has_hw_cursor = FALSE;
|
gboolean has_hw_cursor = FALSE;
|
||||||
|
|
||||||
@ -350,6 +353,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer,
|
|||||||
{
|
{
|
||||||
has_hw_cursor = realize_cursor_sprite_for_crtc (cursor_renderer,
|
has_hw_cursor = realize_cursor_sprite_for_crtc (cursor_renderer,
|
||||||
META_CRTC_KMS (crtc),
|
META_CRTC_KMS (crtc),
|
||||||
|
target_color_state,
|
||||||
cursor_sprite);
|
cursor_sprite);
|
||||||
|
|
||||||
cursor_stage_view->is_hw_cursor_valid = TRUE;
|
cursor_stage_view->is_hw_cursor_valid = TRUE;
|
||||||
@ -759,6 +763,8 @@ load_cursor_sprite_gbm_buffer_for_crtc (MetaCursorRendererNative *native,
|
|||||||
|
|
||||||
static CoglTexture *
|
static CoglTexture *
|
||||||
scale_and_transform_cursor_sprite_cpu (MetaCursorRendererNative *cursor_renderer_native,
|
scale_and_transform_cursor_sprite_cpu (MetaCursorRendererNative *cursor_renderer_native,
|
||||||
|
ClutterColorState *target_color_state,
|
||||||
|
MetaCursorSprite *cursor_sprite,
|
||||||
uint8_t *pixels,
|
uint8_t *pixels,
|
||||||
CoglPixelFormat pixel_format,
|
CoglPixelFormat pixel_format,
|
||||||
int width,
|
int width,
|
||||||
@ -779,6 +785,8 @@ scale_and_transform_cursor_sprite_cpu (MetaCursorRendererNative *cursor_renderer
|
|||||||
g_autoptr (CoglPipeline) pipeline = NULL;
|
g_autoptr (CoglPipeline) pipeline = NULL;
|
||||||
graphene_matrix_t matrix;
|
graphene_matrix_t matrix;
|
||||||
MetaMonitorTransform pipeline_transform;
|
MetaMonitorTransform pipeline_transform;
|
||||||
|
ClutterColorState *color_state;
|
||||||
|
g_autoptr (CoglSnippet) color_snippet = NULL;
|
||||||
int dst_width;
|
int dst_width;
|
||||||
int dst_height;
|
int dst_height;
|
||||||
|
|
||||||
@ -810,6 +818,13 @@ scale_and_transform_cursor_sprite_cpu (MetaCursorRendererNative *cursor_renderer
|
|||||||
cogl_pipeline_set_layer_texture (pipeline, 0, src_texture);
|
cogl_pipeline_set_layer_texture (pipeline, 0, src_texture);
|
||||||
cogl_pipeline_set_layer_matrix (pipeline, 0, &matrix);
|
cogl_pipeline_set_layer_matrix (pipeline, 0, &matrix);
|
||||||
|
|
||||||
|
color_state = meta_cursor_sprite_get_color_state (cursor_sprite);
|
||||||
|
color_snippet =
|
||||||
|
clutter_color_state_get_transform_snippet (color_state,
|
||||||
|
target_color_state);
|
||||||
|
if (color_snippet)
|
||||||
|
cogl_pipeline_add_snippet (pipeline, color_snippet);
|
||||||
|
|
||||||
cogl_framebuffer_clear4f (COGL_FRAMEBUFFER (offscreen),
|
cogl_framebuffer_clear4f (COGL_FRAMEBUFFER (offscreen),
|
||||||
COGL_BUFFER_BIT_COLOR,
|
COGL_BUFFER_BIT_COLOR,
|
||||||
0.0f, 0.0f, 0.0f, 0.0f);
|
0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
@ -826,6 +841,7 @@ scale_and_transform_cursor_sprite_cpu (MetaCursorRendererNative *cursor_renderer
|
|||||||
static gboolean
|
static gboolean
|
||||||
load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
|
load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
|
||||||
MetaCrtcKms *crtc_kms,
|
MetaCrtcKms *crtc_kms,
|
||||||
|
ClutterColorState *target_color_state,
|
||||||
MetaCursorSprite *cursor_sprite,
|
MetaCursorSprite *cursor_sprite,
|
||||||
float relative_scale,
|
float relative_scale,
|
||||||
MetaMonitorTransform relative_transform,
|
MetaMonitorTransform relative_transform,
|
||||||
@ -835,11 +851,15 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
|
|||||||
int rowstride,
|
int rowstride,
|
||||||
uint32_t gbm_format)
|
uint32_t gbm_format)
|
||||||
{
|
{
|
||||||
|
ClutterColorState *cursor_color_state;
|
||||||
gboolean retval = FALSE;
|
gboolean retval = FALSE;
|
||||||
|
|
||||||
|
cursor_color_state = meta_cursor_sprite_get_color_state (cursor_sprite);
|
||||||
|
|
||||||
if (!G_APPROX_VALUE (relative_scale, 1.f, FLT_EPSILON) ||
|
if (!G_APPROX_VALUE (relative_scale, 1.f, FLT_EPSILON) ||
|
||||||
relative_transform != META_MONITOR_TRANSFORM_NORMAL ||
|
relative_transform != META_MONITOR_TRANSFORM_NORMAL ||
|
||||||
gbm_format != GBM_FORMAT_ARGB8888)
|
gbm_format != GBM_FORMAT_ARGB8888 ||
|
||||||
|
!clutter_color_state_equals (cursor_color_state, target_color_state))
|
||||||
{
|
{
|
||||||
const MetaFormatInfo *format_info;
|
const MetaFormatInfo *format_info;
|
||||||
g_autoptr (GError) error = NULL;
|
g_autoptr (GError) error = NULL;
|
||||||
@ -853,6 +873,8 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
texture = scale_and_transform_cursor_sprite_cpu (native,
|
texture = scale_and_transform_cursor_sprite_cpu (native,
|
||||||
|
target_color_state,
|
||||||
|
cursor_sprite,
|
||||||
data,
|
data,
|
||||||
format_info->cogl_format,
|
format_info->cogl_format,
|
||||||
width,
|
width,
|
||||||
@ -912,6 +934,7 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
|
|||||||
static gboolean
|
static gboolean
|
||||||
realize_cursor_sprite_from_wl_buffer_for_crtc (MetaCursorRenderer *renderer,
|
realize_cursor_sprite_from_wl_buffer_for_crtc (MetaCursorRenderer *renderer,
|
||||||
MetaCrtcKms *crtc_kms,
|
MetaCrtcKms *crtc_kms,
|
||||||
|
ClutterColorState *target_color_state,
|
||||||
MetaCursorSpriteWayland *sprite_wayland)
|
MetaCursorSpriteWayland *sprite_wayland)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
||||||
@ -989,6 +1012,7 @@ realize_cursor_sprite_from_wl_buffer_for_crtc (MetaCursorRenderer *renderer
|
|||||||
|
|
||||||
retval = load_scaled_and_transformed_cursor_sprite (native,
|
retval = load_scaled_and_transformed_cursor_sprite (native,
|
||||||
crtc_kms,
|
crtc_kms,
|
||||||
|
target_color_state,
|
||||||
cursor_sprite,
|
cursor_sprite,
|
||||||
relative_scale,
|
relative_scale,
|
||||||
relative_transform,
|
relative_transform,
|
||||||
@ -1087,6 +1111,7 @@ realize_cursor_sprite_from_wl_buffer_for_crtc (MetaCursorRenderer *renderer
|
|||||||
static gboolean
|
static gboolean
|
||||||
realize_cursor_sprite_from_xcursor_for_crtc (MetaCursorRenderer *renderer,
|
realize_cursor_sprite_from_xcursor_for_crtc (MetaCursorRenderer *renderer,
|
||||||
MetaCrtcKms *crtc_kms,
|
MetaCrtcKms *crtc_kms,
|
||||||
|
ClutterColorState *target_color_state,
|
||||||
MetaCursorSpriteXcursor *sprite_xcursor)
|
MetaCursorSpriteXcursor *sprite_xcursor)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
||||||
@ -1118,6 +1143,7 @@ realize_cursor_sprite_from_xcursor_for_crtc (MetaCursorRenderer *renderer,
|
|||||||
|
|
||||||
return load_scaled_and_transformed_cursor_sprite (native,
|
return load_scaled_and_transformed_cursor_sprite (native,
|
||||||
crtc_kms,
|
crtc_kms,
|
||||||
|
target_color_state,
|
||||||
cursor_sprite,
|
cursor_sprite,
|
||||||
relative_scale,
|
relative_scale,
|
||||||
relative_transform,
|
relative_transform,
|
||||||
@ -1131,6 +1157,7 @@ realize_cursor_sprite_from_xcursor_for_crtc (MetaCursorRenderer *renderer,
|
|||||||
static gboolean
|
static gboolean
|
||||||
realize_cursor_sprite_for_crtc (MetaCursorRenderer *renderer,
|
realize_cursor_sprite_for_crtc (MetaCursorRenderer *renderer,
|
||||||
MetaCrtcKms *crtc_kms,
|
MetaCrtcKms *crtc_kms,
|
||||||
|
ClutterColorState *target_color_state,
|
||||||
MetaCursorSprite *cursor_sprite)
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
|
MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
|
||||||
@ -1150,6 +1177,7 @@ realize_cursor_sprite_for_crtc (MetaCursorRenderer *renderer,
|
|||||||
|
|
||||||
return realize_cursor_sprite_from_xcursor_for_crtc (renderer,
|
return realize_cursor_sprite_from_xcursor_for_crtc (renderer,
|
||||||
crtc_kms,
|
crtc_kms,
|
||||||
|
target_color_state,
|
||||||
sprite_xcursor);
|
sprite_xcursor);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_WAYLAND
|
#ifdef HAVE_WAYLAND
|
||||||
@ -1160,6 +1188,7 @@ realize_cursor_sprite_for_crtc (MetaCursorRenderer *renderer,
|
|||||||
|
|
||||||
return realize_cursor_sprite_from_wl_buffer_for_crtc (renderer,
|
return realize_cursor_sprite_from_wl_buffer_for_crtc (renderer,
|
||||||
crtc_kms,
|
crtc_kms,
|
||||||
|
target_color_state,
|
||||||
sprite_wayland);
|
sprite_wayland);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user