compositor: Centralize scaler viewport update 41/321341/1
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 14 Mar 2025 00:52:07 +0000 (09:52 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 19 Mar 2025 05:47:23 +0000 (14:47 +0900)
This patch refactors the code to centralize buffer transform updates in
the e_compositor. Previously, these updates were scattered across
e_comp_wl_rsm and e_comp_wl, leading to potential inconsistencies and
maintenace issues.

No functional changes.

Change-Id: I8bdbad1db3b3240dfbc5b55d06537ab199f72dc2

src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_rsm.c
src/bin/server/e_compositor.c

index aa08f08ae59583cd2a529abae533206db7040903..8e1eb62777c882a77cc1c7248ef462522387a47e 100644 (file)
@@ -2884,21 +2884,6 @@ _e_comp_wl_client_unignore(E_Client *ec, Eina_Bool buffer_attached)
    e_client_unignore(ec);
 }
 
-static void
-_e_comp_wl_client_buffer_viewport_set(E_Client *ec, E_Comp_Wl_Buffer_Viewport *new_vp)
-{
-   E_Comp_Wl_Buffer_Viewport *vp = &ec->comp_data->scaler.buffer_viewport;
-
-   if (vp->buffer.transform != new_vp->buffer.transform)
-     {
-        ELOGF("TRANSFORM", "buffer_transform changed: old(%d) new(%d)",
-              ec,
-              vp->buffer.transform, new_vp->buffer.transform);
-     }
-
-   ec->comp_data->scaler.buffer_viewport = *new_vp;
-}
-
 static void
 _e_comp_wl_client_buffer_set(E_Client *ec, E_Comp_Wl_Buffer *buffer)
 {
@@ -2967,7 +2952,6 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
    E_Comp_Wl_Data *comp_wl;
 
    _e_comp_wl_client_unignore(ec, state->new_attach);
-   _e_comp_wl_client_buffer_viewport_set(ec, &state->buffer_viewport);
 
    if (state->new_attach)
      _e_comp_wl_client_buffer_set(ec, state->buffer);
@@ -2978,7 +2962,7 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
    _e_comp_wl_surface_state_buffer_set(state, NULL);
 
    if ((state->new_attach) ||
-       (state->buffer_viewport.changed))
+       (e_surface_viewport_changed_get(surface)))
      {
         e_comp_wl_map_size_cal_from_viewport(ec);
 
@@ -2991,7 +2975,7 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
    _e_comp_wl_client_map_update(ec);
 
    if ((state->new_attach) ||
-       (state->buffer_viewport.changed))
+       (e_surface_viewport_changed_get(surface)))
      {
         comp_wl = e_comp_wl_get();
         if ((comp_wl->drag) &&
@@ -3024,7 +3008,7 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
           }
      }
 
-   if (cdata->scaler.buffer_viewport.changed)
+   if (e_surface_viewport_changed_get(surface))
      e_comp_wl_map_apply(ec);
 
    state->sx = 0;
@@ -3037,8 +3021,6 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
 
    e_comp_wl_subsurface_check_alpha_mask_rect(ec);
 
-   state->buffer_viewport.changed = 0;
-
    wl_signal_emit(&cdata->state_commit_signal, &cdata->surface);
 
    buffer = e_surface_buffer_try_get(surface);
index f40bd3bca582f0ad1815d2644170fbcaee062376..c22428213d74ead61c72c3ca6887ca297097bea5 100644 (file)
@@ -3041,16 +3041,6 @@ _e_comp_wl_remote_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *st
    E_Comp_Wl_Buffer *buffer;
    Eina_List *l;
    E_Comp_Wl_Client_Data *cdata = e_client_cdata_get(ec);
-   E_Comp_Wl_Buffer_Viewport *vp = &ec->comp_data->scaler.buffer_viewport;
-
-   if (vp->buffer.transform != state->buffer_viewport.buffer.transform)
-     {
-        ELOGF("TRANSFORM", "buffer_transform changed: old(%d) new(%d)",
-              ec,
-              vp->buffer.transform, state->buffer_viewport.buffer.transform);
-     }
-
-   ec->comp_data->scaler.buffer_viewport = state->buffer_viewport;
 
    if (state->new_attach)
      e_comp_wl_surface_attach(ec, state->buffer);
@@ -3074,8 +3064,6 @@ _e_comp_wl_remote_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *st
    state->sy = 0;
    state->new_attach = EINA_FALSE;
 
-   state->buffer_viewport.changed = 0;
-
    wl_signal_emit(&cdata->state_commit_signal, &cdata->surface);
 
    /* send remote buffer to remote surfaces */
index 12dad40b4d25a6097687179166eac32a6b151fca..5d8aecba3592926f4cd68e4b0b1c87456f3d0247 100644 (file)
@@ -768,6 +768,7 @@ e_surface_viewporter_commit(E_Surface_Viewporter *viewporter)
    ELOGF("SURFACE", "Viewporter(%p): Commit(changed:%d)", surface->ec, viewporter, vp->changed);
 
    surface->base.scaler.buffer_viewport = *vp;
+   vp->changed = EINA_FALSE;
 
    e_comp_wl_map_size_cal_from_buffer(surface->ec);
    e_comp_wl_map_size_cal_from_viewport(surface->ec);
@@ -1210,10 +1211,13 @@ _e_surface_pending_buffer_update(E_Surface *surface)
 }
 
 static void
-_e_surface_pending_buffer_transform_update(E_Surface *surface)
+_e_surface_buffer_transform_update(E_Surface *surface)
 {
    int32_t transform = surface->ds_surface->current.transform;
 
+   if (surface->base.scaler.buffer_viewport.buffer.transform == transform)
+     return;
+
    if (surface->viewporter.acquired)
      {
         ELOGF("SURFACE", "Cannot update buffer transform(%d), viewporter has been acquired.",
@@ -1221,17 +1225,23 @@ _e_surface_pending_buffer_transform_update(E_Surface *surface)
         return;
      }
 
-   surface->base.pending.buffer_viewport.buffer.transform = transform;
-   surface->base.pending.buffer_viewport.changed = 1;
+   INF("SURFACE(%p): Buffer transform changed: old(%d) new(%d)",
+       surface, surface->base.scaler.buffer_viewport.buffer.transform, transform);
+
+   surface->base.scaler.buffer_viewport.buffer.transform = transform;
+   surface->base.scaler.buffer_viewport.changed = 1;
 }
 
 static void
-_e_surface_pending_buffer_scale_update(E_Surface *surface)
+_e_surface_buffer_scale_update(E_Surface *surface)
 {
    int32_t scale = surface->ds_surface->current.scale;
 
-   surface->base.pending.buffer_viewport.buffer.scale = scale;
-   surface->base.pending.buffer_viewport.changed = 1;
+   if (surface->base.scaler.buffer_viewport.buffer.scale == scale)
+     return;
+
+   surface->base.scaler.buffer_viewport.buffer.scale = scale;
+   surface->base.scaler.buffer_viewport.changed = 1;
 }
 
 static void
@@ -1251,11 +1261,11 @@ _e_surface_frame_callback_list_update(E_Surface *surface)
 }
 
 static void
-_e_surface_pending_viewport_update(E_Surface *surface)
+_e_surface_viewport_update(E_Surface *surface)
 {
    struct ds_surface *ds_surface = surface->ds_surface;
    struct ds_surface_state *state = &ds_surface->current;
-   E_Comp_Wl_Buffer_Viewport *vp = &surface->base.pending.buffer_viewport;
+   E_Comp_Wl_Buffer_Viewport *vp = &surface->base.scaler.buffer_viewport;
 
    if (state->viewport.has_src)
      {
@@ -1345,18 +1355,9 @@ _e_surface_pending_update(E_Surface *surface)
    if (ds_surface->current.committed & DS_SURFACE_STATE_BUFFER)
      _e_surface_pending_buffer_update(surface);
 
-   if (ds_surface->current.committed & DS_SURFACE_STATE_TRANSFORM)
-     _e_surface_pending_buffer_transform_update(surface);
-
-   if (ds_surface->current.committed & DS_SURFACE_STATE_SCALE)
-     _e_surface_pending_buffer_scale_update(surface);
-
    if (ds_surface->current.committed & DS_SURFACE_STATE_FRAME_CALLBACK_LIST)
      _e_surface_frame_callback_list_update(surface);
 
-   if (ds_surface->current.committed & DS_SURFACE_STATE_VIEWPORT)
-     _e_surface_pending_viewport_update(surface);
-
    // FIXME
    // It's not supposed to update subsurface order for entire surface tree.
    // This is for backward compatibility
@@ -1488,6 +1489,28 @@ _e_surface_state_field_from_ds(enum ds_surface_state_field ds_field)
    return field;
 }
 
+static void
+_e_surface_current_state_update(E_Surface *surface)
+{
+   struct ds_surface *ds_surface = surface->ds_surface;
+
+   if (ds_surface->current.committed & DS_SURFACE_STATE_TRANSFORM)
+     _e_surface_buffer_transform_update(surface);
+
+   if (ds_surface->current.committed & DS_SURFACE_STATE_SCALE)
+     _e_surface_buffer_scale_update(surface);
+
+   if (ds_surface->current.committed & DS_SURFACE_STATE_VIEWPORT)
+     _e_surface_viewport_update(surface);
+}
+
+static void
+_e_surface_committed_state_clear(E_Surface *surface)
+{
+   surface->current.committed = E_SURFACE_STATE_CLEAN;
+   surface->base.scaler.buffer_viewport.changed = 0;
+}
+
 static void
 _e_surface_cb_commit(struct wl_listener *listener, void *data)
 {
@@ -1497,6 +1520,7 @@ _e_surface_cb_commit(struct wl_listener *listener, void *data)
 
    _e_surface_pending_update(surface);
    _e_surface_commit_pre(surface);
+   _e_surface_current_state_update(surface);
 
    E_Surface_Event_Commit event = {
        .committed = surface->current.committed |
@@ -1504,7 +1528,8 @@ _e_surface_cb_commit(struct wl_listener *listener, void *data)
        .surface = surface,
    };
    wl_signal_emit(&surface->events.commit, &event);
-   surface->current.committed = E_SURFACE_STATE_CLEAN;
+
+   _e_surface_committed_state_clear(surface);
 }
 
 static void