viewport: Make implementation of tizen_viewport work with ds_tizen_scaler 42/309142/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 3 Apr 2024 22:58:05 +0000 (07:58 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 5 Apr 2024 06:01:41 +0000 (15:01 +0900)
The tizen_viewport implemented in E and the wl_scaler implemented in
libds cannot work together simultaneously.

Change-Id: I127bc2ff31a634ee677d44ccb05e25dc74f9c125

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

index 4e61966..4dba73f 100644 (file)
@@ -1661,12 +1661,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",
@@ -1689,6 +1683,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;
@@ -1714,9 +1716,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 5f9fc3e..5c77fda 100644 (file)
@@ -36,6 +36,7 @@ struct _E_Surface
 
    E_Client *ec;
    struct ds_surface *ds_surface;
+   struct ds_surface_viewport *surface_viewport;
 
    E_Client_Hook *client_del_hook;
 
@@ -278,18 +279,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
@@ -305,6 +312,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 786ea2f..19f136e 100644 (file)
@@ -17,7 +17,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);