viewport: Make implementation of tizen_viewport work with ds_tizen_scaler 54/309154/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 3 Apr 2024 22:58:05 +0000 (07:58 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Fri, 5 Apr 2024 06:46:25 +0000 (15:46 +0900)
The tizen_viewport implemented in E and the wl_scaler implemented in
libds cannot work together simultaneously.

Change-Id: I4ee45283ebec49934acc0e7b3fe1347e00618a59

src/bin/e_comp_wl_viewport.c
src/bin/e_compositor.c
src/bin/e_compositor.h

index 2adf9ec1d7ff91b5854f6c115ae4bbf2f61d6ab5..b5c9d94811a6ce26eff6686e47b84720b4a154e1 100644 (file)
@@ -1658,12 +1658,6 @@ e_comp_wl_viewport_create(struct wl_resource *resource,
         return EINA_FALSE;
      }
 
-   if (e_surface_viewporter_resource_get(surface))
-     {
-        ERR("E_Surface(%p) already has a viewport", surface);
-        return EINA_FALSE;
-     }
-
    if (!(client = wl_resource_get_client(surface_resource)))
      {
         ERR("Could not get client from wl_surface@%d",
@@ -1686,6 +1680,14 @@ e_comp_wl_viewport_create(struct wl_resource *resource,
         return EINA_FALSE;
      }
 
+   if (!e_surface_viewporter_resource_set(surface, res))
+     {
+        ERR("E_Surface(%p) already has a viewporter", surface);
+        wl_resource_destroy(res);
+        free(viewport);
+        return EINA_FALSE;
+     }
+
    viewport->resource = res;
    viewport->ec = ec;
    viewport->surface = surface;
@@ -1711,9 +1713,6 @@ e_comp_wl_viewport_create(struct wl_resource *resource,
    viewport->surface_apply_viewport_listener.notify = _e_comp_wl_viewport_cb_apply_viewport;
    wl_signal_add(&ec->comp_data->apply_viewport_signal, &viewport->surface_apply_viewport_listener);
 
-   /* Use scaler variable because tizen_viewport is the alternative of wl_viewport */
-   e_surface_viewporter_resource_set(viewport->surface, res);
-
    wl_resource_set_implementation(res, &_e_comp_wl_viewport_interface,
                                   viewport, _e_comp_wl_viewport_destroy);
 
index f926011a0647450c8f936a44b5c5b6d14a88306e..8e09ecac6e548a08087e583f4d97acee1e99920f 100644 (file)
@@ -27,6 +27,7 @@ struct _E_Surface
 
    E_Client *ec;
    struct ds_surface *ds_surface;
+   struct ds_surface_viewport *surface_viewport;
 
    E_Client_Hook *client_del_hook;
 
@@ -269,18 +270,24 @@ e_surface_parent_destroy_listener_add(E_Surface *surface, struct wl_listener *li
    wl_signal_add(&surface->events.parent_destroy, listener);
 }
 
-EINTERN struct wl_resource *
-e_surface_viewporter_resource_get(E_Surface *surface)
-{
-   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, NULL);
-   return surface->base.scaler.viewport;
-}
-
-EINTERN void
+EINTERN Eina_Bool
 e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter)
 {
-   EINA_SAFETY_ON_NULL_RETURN(surface);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+
+   if (surface->base.scaler.viewport)
+     return EINA_FALSE;
+
+   if (surface->surface_viewport)
+     return EINA_FALSE;
+
+   surface->surface_viewport = ds_surface_take_viewport(surface->ds_surface);
+   if (!surface->surface_viewport)
+     return EINA_FALSE;
+
    surface->base.scaler.viewport = viewporter;
+
+   return EINA_TRUE;
 }
 
 EINTERN void
@@ -296,6 +303,12 @@ e_surface_viewporter_resource_unset(E_Surface *surface)
    surface->base.pending.buffer_viewport.surface.width = -1;
    surface->base.pending.buffer_viewport.changed = 1;
 
+   if (surface->surface_viewport)
+     {
+        ds_surface_viewport_release(surface->surface_viewport);
+        surface->surface_viewport = NULL;
+     }
+
    if (surface->ds_surface)
      _ds_surface_viewport_unset(surface->ds_surface);
 }
index f08dde84a17cc99000742a7b10ba9d5a25589c73..a2ecc622f1e1f34f4c9068c4a601d864ebe489f8 100644 (file)
@@ -12,7 +12,7 @@ EINTERN void e_surface_destroy_listener_add(E_Surface *surface, struct wl_listen
 EINTERN void e_surface_parent_destroy_listener_add(E_Surface *surface, struct wl_listener *listener);
 EINTERN struct wl_listener *e_surface_destroy_listener_get(E_Surface *surface, wl_notify_func_t notify);
 EINTERN struct wl_resource *e_surface_viewporter_resource_get(E_Surface *surface);
-EINTERN void e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter);
+EINTERN Eina_Bool e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter);
 EINTERN void e_surface_viewporter_resource_unset(E_Surface *surface);
 EINTERN enum wl_output_transform e_surface_buffer_transform_get(E_Surface *surface);
 EINTERN Eina_Bool e_surface_buffer_transform_set(E_Surface *surface, enum wl_output_transform transform);