Stored transform value at 'E_Comp_Wl_Buffer' and update its value whenever wl_buffer...
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 4 Dec 2018 23:49:21 +0000 (08:49 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Fri, 12 Apr 2019 10:00:22 +0000 (19:00 +0900)
In case wl_buffer was binded with tbm_surface, buffer has a transform value.
(see 'wayland-tbm.xml')

It used to be acquired by calling wayland_tbm_server_buffer_get_buffer_transform
with passing wl_resource whenever the value is needed, but this caused that
couldn't get transform properly when backup buffer is used by hw composer.
(Backup buffer has no wl_resource, it means resource of 'E_Comp_Wl_Buffer' can
be null.) This patch fixes this case.

Change-Id: I7ad584654fb03202434aef9157736b7de411c6a5

src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/bin/e_plane_renderer.c

index af88cf910e030b63e80308c2667b690f96dc015c..5b5d71321b9f76375ffded0d6343441fcf1a3e62 100644 (file)
@@ -183,7 +183,7 @@ e_comp_wl_output_buffer_transform_get(E_Client *ec)
        (buffer->type != E_COMP_WL_BUFFER_TYPE_NATIVE && buffer->type != E_COMP_WL_BUFFER_TYPE_TBM))
      return vp->buffer.transform;
 
-   rotation = wayland_tbm_server_buffer_get_buffer_transform(NULL, buffer->resource);
+   rotation = buffer->transform;
    if (rotation == 0)
      return vp->buffer.transform;
 
@@ -5177,7 +5177,10 @@ e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec)
    listener =
      wl_resource_get_destroy_listener(resource, _e_comp_wl_buffer_cb_destroy);
    if (listener)
-     return container_of(listener, E_Comp_Wl_Buffer, destroy_listener);
+     {
+        buffer = container_of(listener, E_Comp_Wl_Buffer, destroy_listener);
+        goto update;
+     }
 
    if (!(buffer = E_NEW(E_Comp_Wl_Buffer, 1))) return NULL;
 
@@ -5299,6 +5302,10 @@ e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec)
    DBG("Wl Buffer Create: b %p owner '%s'(%p)",
        buffer, buffer->debug_info.owner_name, buffer->debug_info.owner_ptr);
 
+update:
+   if (buffer->tbm_surface)
+     buffer->transform = wayland_tbm_server_buffer_get_buffer_transform(NULL, resource);
+
    return buffer;
 
 err:
index 8de69f01c40579c15e5a559445e5406f339e3ef0..64cd6067a475b799528d17be8cca70313e718287 100644 (file)
@@ -97,6 +97,7 @@ struct _E_Comp_Wl_Buffer
       void *owner_ptr;
    } debug_info;
    int32_t w, h;
+   int transform; // the value of wl_tbm.set_buffer_transform
    uint32_t busy;
 };
 
index 5fea50e58a3b3708bedb47fb88d1168c4adcd251..5eac07a17d0b7197b8381cfed84da76bec76ed2e 100644 (file)
@@ -375,7 +375,7 @@ _e_plane_renderer_client_backup_buffer_cb_destroy(struct wl_listener *listener,
 static Eina_Bool
 _e_plane_renderer_client_backup_buffer_set(E_Plane_Renderer_Client *renderer_client)
 {
-   E_Comp_Wl_Buffer *backup_buffer = NULL;
+   E_Comp_Wl_Buffer *buffer, *backup_buffer = NULL;
    tbm_surface_h copied_tsurface = NULL;
    E_Client *ec = NULL;
 
@@ -394,6 +394,10 @@ _e_plane_renderer_client_backup_buffer_set(E_Plane_Renderer_Client *renderer_cli
    backup_buffer = e_comp_wl_tbm_buffer_get(copied_tsurface);
    EINA_SAFETY_ON_NULL_GOTO(backup_buffer, fail);
 
+   buffer = _get_comp_wl_buffer(ec);
+   if (buffer)
+     backup_buffer->transform = buffer->transform;
+
    if (renderer_client->buffer)
      wl_list_remove(&renderer_client->buffer_destroy_listener.link);