From: Seunghun Lee Date: Fri, 14 Mar 2025 09:35:03 +0000 (+0900) Subject: compositor: Consider wayland_tbm buffer transform for actual buffer_transform X-Git-Tag: accepted/tizen/unified/20250319.072541~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=72ac596a7e5f8f357a32bb054c9c292ee338cd03;p=platform%2Fupstream%2Fenlightenment.git compositor: Consider wayland_tbm buffer transform for actual 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 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 --- diff --git a/src/bin/server/e_comp_wl.c b/src/bin/server/e_comp_wl.c index 6d9aa48e05..f1e2aaf4ae 100644 --- a/src/bin/server/e_comp_wl.c +++ b/src/bin/server/e_comp_wl.c @@ -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 diff --git a/src/bin/server/e_comp_wl_buffer.c b/src/bin/server/e_comp_wl_buffer.c index 576c2ff65b..1866d7df29 100644 --- a/src/bin/server/e_comp_wl_buffer.c +++ b/src/bin/server/e_comp_wl_buffer.c @@ -6,6 +6,7 @@ #include +#include #include 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; +} diff --git a/src/bin/server/e_comp_wl_buffer_intern.h b/src/bin/server/e_comp_wl_buffer_intern.h index ceb0b20fa0..b06e350571 100644 --- a/src/bin/server/e_comp_wl_buffer_intern.h +++ b/src/bin/server/e_comp_wl_buffer_intern.h @@ -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 diff --git a/src/bin/server/e_compositor.c b/src/bin/server/e_compositor.c index 1888c3932f..0ceced2bed 100644 --- a/src/bin/server/e_compositor.c +++ b/src/bin/server/e_compositor.c @@ -19,6 +19,7 @@ #include #include #include +#include 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 *