remote_surface: send latest buffer of the provider to the consumer while clearing...
authorGwanglim Lee <gl77.lee@samsung.com>
Wed, 19 Jul 2017 13:06:11 +0000 (22:06 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Thu, 20 Jul 2017 23:58:54 +0000 (08:58 +0900)
Change-Id: Ie9596e609d0d1ff4fd4726bda7f90523dfa85a8a

src/bin/e_comp_wl_rsm.c

index 3203311de97eae01bd35804f4f7014be7159e6f7..b975dfc0b7ae38e6aa33ee622257b454de0746cc 100644 (file)
@@ -720,8 +720,44 @@ _remote_surface_bind_client(E_Comp_Wl_Remote_Surface *remote_surface, E_Client *
         e_comp_wl_surface_commit(remote_surface->bind_ec);
 
         remote_surface->bind_ec = NULL;
+
+        /* try to send latest buffer of the provider to the consumer when unbinding
+         * the remote surface to avoid showing old buffer on consumer's window for a while.
+         */
+        if (remote_surface->provider)
+          {
+             E_Comp_Wl_Buffer *buffer;
+             struct wl_resource *remote_buffer_resource;
+             E_Comp_Wl_Remote_Buffer *remote_buffer;
+
+             RSMINF("Try to send latest buffer of provider:%p(ec:%p)",
+                    NULL, NULL,
+                    "SURFACE", remote_surface,
+                    remote_surface->provider,
+                    remote_surface->provider->common.ec);
+
+             EINA_SAFETY_ON_NULL_GOTO(remote_surface->provider->common.ec, bind_ec_set);
+
+             buffer = e_pixmap_resource_get(remote_surface->provider->common.ec->pixmap);
+             EINA_SAFETY_ON_NULL_GOTO(buffer, bind_ec_set);
+
+             remote_buffer_resource = e_comp_wl_tbm_remote_buffer_get(remote_surface->wl_tbm, buffer->resource);
+             EINA_SAFETY_ON_NULL_GOTO(remote_buffer_resource, bind_ec_set);
+
+             remote_buffer = _e_comp_wl_remote_buffer_get(remote_buffer_resource);
+             EINA_SAFETY_ON_NULL_GOTO(remote_buffer, bind_ec_set);
+
+             _remote_surface_changed_buff_protocol_send(remote_surface,
+                                                        TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM,
+                                                        remote_buffer,
+                                                        _rsm->dummy_fd,
+                                                        0,
+                                                        EINA_TRUE,
+                                                        buffer);
+          }
      }
 
+bind_ec_set:
    if (ec)
      {
         if (e_object_is_del(E_OBJECT(ec)))