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)
{
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);
_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);
_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) &&
}
}
- if (cdata->scaler.buffer_viewport.changed)
+ if (e_surface_viewport_changed_get(surface))
e_comp_wl_map_apply(ec);
state->sx = 0;
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);
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);
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 */
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);
}
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.",
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
}
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)
{
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
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)
{
_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 |
.surface = surface,
};
wl_signal_emit(&surface->events.commit, &event);
- surface->current.committed = E_SURFACE_STATE_CLEAN;
+
+ _e_surface_committed_state_clear(surface);
}
static void