compositor: Consider wayland_tbm buffer transform for actual buffer_transform 14/321214/1
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 14 Mar 2025 09:35:03 +0000 (18:35 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 17 Mar 2025 09:28:07 +0000 (18:28 +0900)
In Tizen environment, we support window rotation by having clients
include the window rotation value in the buffer_transform. The window
rotation value is passed as the transform value of wayland_tbm buffers.

To get the actual buffer transform set by the client, we need to
subtract the window rotation value from the buffer_transform.

The e_comp_wl_output_buffer_transform_get is deprecated with this patch.

Change-Id: I5254d8bacab3a303a95d5a5e113d3eadd98b5a5e

src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_buffer.c
src/bin/server/e_comp_wl_buffer_intern.h
src/bin/server/e_compositor.c

index 6d9aa48e0562a18a50abdc8ec32f24ceec747a12..f1e2aaf4ae788605d6212708a43db8b1226ef2bf 100644 (file)
@@ -400,37 +400,14 @@ E_API enum wl_output_transform
 e_comp_wl_output_buffer_transform_get(E_Client *ec)
 {
    E_Surface *surface;
-   E_Comp_Wl_Buffer *buffer;
-   enum wl_output_transform buffer_transform, transform, rotation;
 
    if (!ec) return WL_OUTPUT_TRANSFORM_NORMAL;
-   if (e_object_is_del(E_OBJECT(ec))) return WL_OUTPUT_TRANSFORM_NORMAL;
 
    surface = e_surface_try_from_ec(ec);
    if (!surface)
      return WL_OUTPUT_TRANSFORM_NORMAL;
 
-   buffer_transform = e_surface_buffer_transform_get(surface);
-
-   buffer = e_surface_buffer_try_get(surface);
-
-   if (!buffer ||
-       (buffer->type != E_COMP_WL_BUFFER_TYPE_NATIVE && buffer->type != E_COMP_WL_BUFFER_TYPE_TBM))
-     return buffer_transform;
-
-   rotation = buffer->transform;
-   if (rotation == 0)
-     return buffer_transform;
-
-   /* ignore the flip value when calculating transform because the screen rotation
-    * functionality doesn't consider the flip output transform currently
-    */
-   transform = (4 + (buffer_transform & 0x3) - rotation) & 0x3;
-
-   DBG("ec(%p) window rotation(%d) buffer_transform(%d) : transform(%d)",
-       ec, rotation, buffer_transform, transform);
-
-   return transform;
+   return e_surface_buffer_transform_get(surface);
 }
 
 EINTERN enum wl_output_transform
index 576c2ff65b9c318661271f560a297ca52efa240b..1866d7df29c2a13114ee408f8e325e14e78c69df 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <libds/single_pixel_buffer_v1.h>
 
+#include <wayland-server-protocol.h>
 #include <wayland-tbm-server.h>
 
 typedef struct _E_Buffer E_Buffer;
@@ -573,3 +574,13 @@ e_comp_wl_buffer_viewport_wait_for_transform_change_set(E_Comp_Wl_Buffer_Viewpor
    if (!viewport) return;
    viewport->wait_for_transform_change = wait_for_transform_change;
 }
+
+EINTERN enum wl_output_transform
+e_comp_wl_buffer_window_rotation_get(E_Comp_Wl_Buffer *buffer)
+{
+   if (buffer->type != E_COMP_WL_BUFFER_TYPE_NATIVE &&
+       buffer->type != E_COMP_WL_BUFFER_TYPE_TBM)
+     return WL_OUTPUT_TRANSFORM_NORMAL;
+
+   return buffer->transform;
+}
index ceb0b20fa0a5fed0822c878f90c5cd927b7e6ff4..b06e350571f39c76929c73798b952b5a4535beb2 100644 (file)
@@ -13,5 +13,6 @@ void e_comp_wl_buffer_destroy(E_Comp_Wl_Buffer *comp_buffer);
 void *e_comp_wl_buffer_single_pixel_buffer_data_get(E_Comp_Wl_Buffer *buffer);
 void e_comp_wl_buffer_size_get(E_Comp_Wl_Buffer *comp_buffer, int32_t *width, int32_t *height);
 void e_comp_wl_buffer_damage_region_set(E_Comp_Wl_Buffer *buffer, pixman_region32_t *damage);
+enum wl_output_transform e_comp_wl_buffer_window_rotation_get(E_Comp_Wl_Buffer *buffer);
 
 #endif
index 1888c3932f9bf91fe262eef9953f98e446ae342c..0ceced2bed097b4833de67399ac6c8dc10844a34 100644 (file)
@@ -19,6 +19,7 @@
 #include <libds/types/ds_subsurface.h>
 #include <libds-tizen/surface_exporter.h>
 #include <wayland-server-core.h>
+#include <wayland-server-protocol.h>
 
 typedef struct _E_Subsurface E_Subsurface;
 typedef struct _E_Subsurface_View E_Subsurface_View;
@@ -442,9 +443,28 @@ e_surface_buffer_scale_get(E_Surface *surface)
 EINTERN enum wl_output_transform
 e_surface_buffer_transform_get(E_Surface *surface)
 {
-   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, WL_OUTPUT_TRANSFORM_NORMAL);
+   E_Comp_Wl_Buffer *buffer;
+   enum wl_output_transform buffer_transform;
 
-   return surface->base.scaler.buffer_viewport.buffer.transform;
+   buffer_transform = surface->base.scaler.buffer_viewport.buffer.transform;
+   buffer = surface->base.buffer_ref.buffer;
+   if (!buffer)
+     return buffer_transform;
+
+   /* NOTE: Subtract window_rotation value from buffer_transform
+    *
+    * In Tizen environment, we support window rotation by having clients include
+    * the window rotation value in the buffer_transform. The window rotation
+    * value is passed as the transform value of wayland_tbm buffers.
+    *
+    * To return the actual buffer transform set by the client, we need to
+    * subtract the window rotation value from the buffer_transform.
+    */
+
+   /* ignore the flip value when calculating transform because the screen rotation
+    * functionality doesn't consider the flip output transform currently
+    */
+   return (4 + (buffer_transform & 0x3) - e_comp_wl_buffer_window_rotation_get(buffer)) & 0x3;
 }
 
 EINTERN E_Comp_Wl_Buffer *