Update waltham-transmitter patches to weston 5.0 & 6.0 02/22002/4 8.0.0 halibut/8.0.0 halibut_8.0.0
authorVeeresh Kadasani <external.vkadasani@jp.adit-jv.com>
Mon, 29 Jul 2019 08:29:20 +0000 (17:29 +0900)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Mon, 5 Aug 2019 21:51:30 +0000 (21:51 +0000)
Change-Id: Idedada02d63914f247a137d031e44b15bef16134
Signed-off-by: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
meta-agl-profile-graphical/recipes-graphics/wayland/weston/0002-compositor-add-output-type-to-weston_output.patch [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/weston/0003-compositor-drm-introduce-drm_get_dmafd_from_view.patch [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/weston/0016-compositor-add-output-type-to-weston_output.patch [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/weston/0017-compositor-drm-introduce-drm_get_dmafd_from_view.patch [moved from meta-agl-profile-graphical/recipes-graphics/wayland/weston/0019-compositor-drm-introduce-drm_get_dmafd_from_view.patch with 54% similarity]
meta-agl-profile-graphical/recipes-graphics/wayland/weston/0018-compositor-add-output-type-to-weston_output.patch [deleted file]
meta-agl-profile-graphical/recipes-graphics/wayland/weston/0018-compositor-drm-get-stride-from-drm_get_dma_fd_from_view.patch [new file with mode: 0644]
meta-agl-profile-graphical/recipes-graphics/wayland/weston_5.0.0.bbappend
meta-agl-profile-graphical/recipes-graphics/wayland/weston_6.0.0.bbappend

diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0002-compositor-add-output-type-to-weston_output.patch b/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0002-compositor-add-output-type-to-weston_output.patch
new file mode 100644 (file)
index 0000000..187bea5
--- /dev/null
@@ -0,0 +1,202 @@
+From e31e63976aab7616319c10ad21c998c3b4c634e6 Mon Sep 17 00:00:00 2001
+From: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+Date: Tue, 30 Jul 2019 20:22:15 +0900
+Subject: [PATCH 1/2] compositor: add output type to weston_output
+
+This enables weston to use multiple types of backend
+Each backends have own output structure for each functions
+To avoid invalid member access, type identifier is needed
+
+Signed-off-by: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+---
+ libweston/compositor-drm.c      | 12 +++++++++++-
+ libweston/compositor-fbdev.c    |  2 +-
+ libweston/compositor-headless.c |  2 +-
+ libweston/compositor-rdp.c      |  2 +-
+ libweston/compositor-wayland.c  |  2 +-
+ libweston/compositor-x11.c      |  2 +-
+ libweston/compositor.h          | 12 ++++++++++++
+ 7 files changed, 28 insertions(+), 6 deletions(-)
+
+diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
+index c110110..b83459a 100644
+--- a/libweston/compositor-drm.c
++++ b/libweston/compositor-drm.c
+@@ -923,6 +923,7 @@ drm_output_find_by_crtc(struct drm_backend *b, uint32_t crtc_id)
+       struct drm_output *output;
+       wl_list_for_each(output, &b->compositor->output_list, base.link) {
++                if(output->base.output_type == OUTPUT_DRM)
+               if (output->crtc_id == crtc_id)
+                       return output;
+       }
+@@ -939,6 +940,7 @@ drm_head_find_by_connector(struct drm_backend *backend, uint32_t connector_id)
+       wl_list_for_each(base,
+                        &backend->compositor->head_list, compositor_link) {
+               head = to_drm_head(base);
++              if(base->output->output_type == OUTPUT_DRM)
+               if (head->connector_id == connector_id)
+                       return head;
+       }
+@@ -6159,6 +6161,7 @@ drm_output_enable(struct weston_output *base)
+       assert(!output->virtual);
++        output->base.output_type = OUTPUT_DRM;
+       resources = drmModeGetResources(b->drm.fd);
+       if (!resources) {
+               weston_log("drmModeGetResources failed\n");
+@@ -6628,6 +6631,7 @@ drm_backend_update_heads(struct drm_backend *b, struct udev_device *drm_device)
+       /* Remove connectors that have disappeared. */
+       wl_list_for_each_safe(base, next,
+                             &b->compositor->head_list, compositor_link) {
++                if (base->output->output_type == OUTPUT_DRM) {
+               bool removed = true;
+               head = to_drm_head(base);
+@@ -6646,6 +6650,7 @@ drm_backend_update_heads(struct drm_backend *b, struct udev_device *drm_device)
+                          head->base.name, head->connector_id);
+               drm_head_destroy(head);
+       }
++      }
+       drm_backend_update_unused_outputs(b, resources);
+@@ -6751,12 +6756,14 @@ session_notify(struct wl_listener *listener, void *data)
+                * pending frame callbacks. */
+               wl_list_for_each(output, &compositor->output_list, base.link) {
++                      if(output->base.output_type == OUTPUT_DRM) {
+                       output->base.repaint_needed = false;
+                       if (output->cursor_plane)
+                               drmModeSetCursor(b->drm.fd, output->crtc_id,
+                                                0, 0, 0);
+               }
+-
++              }
++                if(output->base.output_type == OUTPUT_DRM) {
+               output = container_of(compositor->output_list.next,
+                                     struct drm_output, base.link);
+@@ -6768,6 +6775,7 @@ session_notify(struct wl_listener *listener, void *data)
+                                       plane->plane_id,
+                                       output->crtc_id, 0, 0,
+                                       0, 0, 0, 0, 0, 0, 0, 0);
++                      }
+               }
+       }
+ }
+@@ -7094,6 +7102,7 @@ switch_to_gl_renderer(struct drm_backend *b)
+       }
+       wl_list_for_each(output, &b->compositor->output_list, base.link)
++              if(output->base.output_type == OUTPUT_DRM)
+               pixman_renderer_output_destroy(&output->base);
+       b->compositor->renderer->destroy(b->compositor);
+@@ -7106,6 +7115,7 @@ switch_to_gl_renderer(struct drm_backend *b)
+       }
+       wl_list_for_each(output, &b->compositor->output_list, base.link)
++              if(output->base.output_type == OUTPUT_DRM)
+               drm_output_init_egl(output, b);
+       b->use_pixman = 0;
+diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c
+index 6031be5..97002e6 100644
+--- a/libweston/compositor-fbdev.c
++++ b/libweston/compositor-fbdev.c
+@@ -526,7 +526,7 @@ fbdev_output_enable(struct weston_output *base)
+       struct fbdev_head *head;
+       int fb_fd;
+       struct wl_event_loop *loop;
+-
++        output->base.output_type = OUTPUT_FBDEV;
+       head = fbdev_output_get_head(output);
+       /* Create the frame buffer. */
+diff --git a/libweston/compositor-headless.c b/libweston/compositor-headless.c
+index 5a0e46c..20b78b2 100644
+--- a/libweston/compositor-headless.c
++++ b/libweston/compositor-headless.c
+@@ -160,7 +160,7 @@ headless_output_enable(struct weston_output *base)
+       loop = wl_display_get_event_loop(b->compositor->wl_display);
+       output->finish_frame_timer =
+               wl_event_loop_add_timer(loop, finish_frame_handler, output);
+-
++        output->base.output_type = OUTPUT_HEADLESS;
+       if (b->use_pixman) {
+               output->image_buf = malloc(output->base.current_mode->width *
+                                          output->base.current_mode->height * 4);
+diff --git a/libweston/compositor-rdp.c b/libweston/compositor-rdp.c
+index 871a0a3..b3064dd 100644
+--- a/libweston/compositor-rdp.c
++++ b/libweston/compositor-rdp.c
+@@ -554,7 +554,7 @@ rdp_output_enable(struct weston_output *base)
+       struct rdp_output *output = to_rdp_output(base);
+       struct rdp_backend *b = to_rdp_backend(base->compositor);
+       struct wl_event_loop *loop;
+-
++        output->base.output_type = OUTPUT_RDP;
+       output->shadow_surface = pixman_image_create_bits(PIXMAN_x8r8g8b8,
+                                                         output->base.current_mode->width,
+                                                         output->base.current_mode->height,
+diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c
+index e1485ca..75140b2 100644
+--- a/libweston/compositor-wayland.c
++++ b/libweston/compositor-wayland.c
+@@ -1221,7 +1221,7 @@ wayland_output_enable(struct weston_output *base)
+       struct wayland_backend *b = to_wayland_backend(base->compositor);
+       enum mode_status mode_status;
+       int ret = 0;
+-
++        output->base.output_type = OUTPUT_WAYLAND;
+       weston_log("Creating %dx%d wayland output at (%d, %d)\n",
+                  output->base.current_mode->width,
+                  output->base.current_mode->height,
+diff --git a/libweston/compositor-x11.c b/libweston/compositor-x11.c
+index 922e3c8..8c20626 100644
+--- a/libweston/compositor-x11.c
++++ b/libweston/compositor-x11.c
+@@ -934,7 +934,7 @@ x11_output_enable(struct weston_output *base)
+               XCB_EVENT_MASK_STRUCTURE_NOTIFY,
+               0
+       };
+-
++        output->base.output_type = OUTPUT_X11;
+       if (!b->no_input)
+               values[0] |=
+                       XCB_EVENT_MASK_KEY_PRESS |
+diff --git a/libweston/compositor.h b/libweston/compositor.h
+index a5223c2..040917b 100644
+--- a/libweston/compositor.h
++++ b/libweston/compositor.h
+@@ -169,6 +169,17 @@ enum dpms_enum {
+       WESTON_DPMS_OFF
+ };
++/* bit compatible with drm definitions. */
++enum output_type {
++      OUTPUT_DRM,
++      OUTPUT_FBDEV,
++      OUTPUT_HEADLESS,
++      OUTPUT_RDP,
++      OUTPUT_WAYLAND,
++      OUTPUT_X11,
++      OUTPUT_WALTHAM
++};
++
+ /** Represents a monitor
+  *
+  * This object represents a monitor (hardware backends like DRM) or a window
+@@ -202,6 +213,7 @@ struct weston_head {
+ struct weston_output {
+       uint32_t id;
+       char *name;
++        enum output_type output_type;
+       /** Matches the lifetime from the user perspective */
+       struct wl_signal user_destroy_signal;
+-- 
+2.7.4
+
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0003-compositor-drm-introduce-drm_get_dmafd_from_view.patch b/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0003-compositor-drm-introduce-drm_get_dmafd_from_view.patch
new file mode 100644 (file)
index 0000000..f67f1c0
--- /dev/null
@@ -0,0 +1,103 @@
+From 6bed527fe0a4101ef214abaf2cd82609b6c510e4 Mon Sep 17 00:00:00 2001
+From: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+Date: Tue, 30 Jul 2019 20:25:34 +0900
+Subject: [PATCH 2/2] compositor-drm: introduce drm_get_dmafd_from_view
+
+This API enables to get dmafd from weston_view
+
+Signed-off-by: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+---
+ libweston/compositor-drm.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++
+ libweston/compositor-drm.h |  7 ++++++
+ 2 files changed, 65 insertions(+)
+
+diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
+index b83459a..5cabfb5 100644
+--- a/libweston/compositor-drm.c
++++ b/libweston/compositor-drm.c
+@@ -5849,6 +5849,64 @@ drm_output_set_seat(struct weston_output *base,
+ }
+ static int
++drm_get_dma_fd_from_view(struct weston_output *base,
++                         struct weston_view *ev, int *buf_stride)
++{
++      struct drm_backend *b = to_drm_backend(base->compositor);
++      struct weston_buffer *buffer = ev->surface->buffer_ref.buffer;
++      struct gbm_bo *bo;
++      struct drm_fb *current;
++      struct linux_dmabuf_buffer *dmabuf;
++      bool is_opaque = drm_view_is_opaque(ev);
++      uint32_t format;
++      int fd, ret;
++
++      if(!buffer) {
++              weston_log("buffer is NULL\n");
++              return -1;
++      }
++
++      if(dmabuf = linux_dmabuf_buffer_get(buffer->resource)) {
++              current = drm_fb_get_from_dmabuf(dmabuf, b, is_opaque);
++              if (!current)
++              {
++                      fprintf(stderr, "failed to get drm_fb from dmabuf\n");
++                      return -1;
++              }
++              *buf_stride=current->strides[0];
++      }
++      else if(ev->surface->buffer_ref.buffer->legacy_buffer) {
++              bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
++                                 buffer->resource, GBM_BO_USE_SCANOUT);
++              if (!bo) {
++                      weston_log("failed to get gbm_bo\n");
++                      return -1;
++              }
++              current = drm_fb_get_from_bo(bo, b, is_opaque, BUFFER_CLIENT);
++
++              if (!current) {
++                      weston_log("failed to get drm_fb from bo\n");
++                      return -1;
++              }
++                *buf_stride=current->strides[0];
++      }
++      else {
++              weston_log("Buffer is not supported\n");
++              return -1;
++      }
++
++      ret = drmPrimeHandleToFD(b->drm.fd, current->handles[0],
++                               DRM_CLOEXEC, &fd);
++      free(current);
++      if (ret) {
++              weston_log("failed to create prime fd for front buffer\n");
++              return -1;
++      }
++
++      return fd;
++}
++
++static int
+ drm_output_init_gamma_size(struct drm_output *output)
+ {
+       struct drm_backend *backend = to_drm_backend(output->base.compositor);
+diff --git a/libweston/compositor-drm.h b/libweston/compositor-drm.h
+index 71a306f..4f985d3 100644
+--- a/libweston/compositor-drm.h
++++ b/libweston/compositor-drm.h
+@@ -78,6 +78,13 @@ struct weston_drm_output_api {
+        */
+       void (*set_seat)(struct weston_output *output,
+                        const char *seat);
++
++        /** Get the dma fd from drm view.
++       *
++         *  The dma fd is got from weston_view.
++       *  Returns fd on success, -1 on failure.
++       */
++      int (*get_dma_fd_from_view)(struct weston_output *output, struct weston_view *view, int *buf_stride);
+ };
+ static inline const struct weston_drm_output_api *
+-- 
+2.7.4
+
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0016-compositor-add-output-type-to-weston_output.patch b/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0016-compositor-add-output-type-to-weston_output.patch
new file mode 100644 (file)
index 0000000..6b93b06
--- /dev/null
@@ -0,0 +1,254 @@
+From 8ea60075d5310101bebedf09c94902e9d41432ac Mon Sep 17 00:00:00 2001
+From: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+Date: Mon, 29 Jul 2019 17:04:12 +0900
+Subject: [PATCH 1/3] compositor: add output type to weston_output
+
+This enables weston to use multiple types of backend
+Each backends have own output structure for each functions
+To avoid invalid member access, type identifier is needed
+
+Signed-off-by: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+---
+ libweston/compositor-drm.c      | 78 +++++++++++++++++++++++------------------
+ libweston/compositor-fbdev.c    |  2 +-
+ libweston/compositor-headless.c |  2 +-
+ libweston/compositor-rdp.c      |  2 +-
+ libweston/compositor-wayland.c  |  2 +-
+ libweston/compositor-x11.c      |  2 +-
+ libweston/compositor.h          | 12 ++++++-
+ 7 files changed, 60 insertions(+), 40 deletions(-)
+
+diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
+index 3891176..26a480c 100644
+--- a/libweston/compositor-drm.c
++++ b/libweston/compositor-drm.c
+@@ -843,8 +843,9 @@ drm_output_find_by_crtc(struct drm_backend *b, uint32_t crtc_id)
+       struct drm_output *output;
+       wl_list_for_each(output, &b->compositor->output_list, base.link) {
+-              if (output->crtc_id == crtc_id)
+-                      return output;
++                if(output->base.output_type == OUTPUT_DRM)
++                      if (output->crtc_id == crtc_id)
++                              return output;
+       }
+       return NULL;
+@@ -859,7 +860,8 @@ drm_head_find_by_connector(struct drm_backend *backend, uint32_t connector_id)
+       wl_list_for_each(base,
+                        &backend->compositor->head_list, compositor_link) {
+               head = to_drm_head(base);
+-              if (head->connector_id == connector_id)
++              if(base->output->output_type == OUTPUT_DRM)
++                      if (head->connector_id == connector_id)
+                       return head;
+       }
+@@ -5728,6 +5730,7 @@ drm_output_enable(struct weston_output *base)
+       drmModeRes *resources;
+       int ret;
++        output->base.output_type = OUTPUT_DRM;
+       resources = drmModeGetResources(b->drm.fd);
+       if (!resources) {
+               weston_log("drmModeGetResources failed\n");
+@@ -6188,23 +6191,25 @@ drm_backend_update_heads(struct drm_backend *b, struct udev_device *drm_device)
+       /* Remove connectors that have disappeared. */
+       wl_list_for_each_safe(base, next,
+                             &b->compositor->head_list, compositor_link) {
+-              bool removed = true;
++                if (base->output->output_type == OUTPUT_DRM) {
++                      bool removed = true;
+-              head = to_drm_head(base);
++                      head = to_drm_head(base);
+-              for (i = 0; i < resources->count_connectors; i++) {
+-                      if (resources->connectors[i] == head->connector_id) {
+-                              removed = false;
+-                              break;
+-                      }
+-              }
++                      for (i = 0; i < resources->count_connectors; i++) {
++                              if (resources->connectors[i] == head->connector_id) {
++                                      removed = false;
++                                      break;
++                              }
++                      }
+-              if (!removed)
+-                      continue;
++                      if (!removed)
++                              continue;
+-              weston_log("DRM: head '%s' (connector %d) disappeared.\n",
+-                         head->base.name, head->connector_id);
+-              drm_head_destroy(head);
++                      weston_log("DRM: head '%s' (connector %d) disappeared.\n",
++                                 head->base.name, head->connector_id);
++                      drm_head_destroy(head);
++                }
+       }
+       drm_backend_update_unused_outputs(b, resources);
+@@ -6309,23 +6314,26 @@ session_notify(struct wl_listener *listener, void *data)
+                * pending frame callbacks. */
+               wl_list_for_each(output, &compositor->output_list, base.link) {
+-                      output->base.repaint_needed = false;
+-                      if (output->cursor_plane)
+-                              drmModeSetCursor(b->drm.fd, output->crtc_id,
+-                                               0, 0, 0);
++                      if(output->base.output_type == OUTPUT_DRM) {
++                                output->base.repaint_needed = false;
++                                if (output->cursor_plane)
++                                        drmModeSetCursor(b->drm.fd, output->crtc_id,
++                                                        0, 0, 0);
++                        }
+               }
+-
+-              output = container_of(compositor->output_list.next,
+-                                    struct drm_output, base.link);
+-
+-              wl_list_for_each(plane, &b->plane_list, link) {
+-                      if (plane->type != WDRM_PLANE_TYPE_OVERLAY)
+-                              continue;
+-
+-                      drmModeSetPlane(b->drm.fd,
+-                                      plane->plane_id,
+-                                      output->crtc_id, 0, 0,
+-                                      0, 0, 0, 0, 0, 0, 0, 0);
++                if(output->base.output_type == OUTPUT_DRM) {
++                      output = container_of(compositor->output_list.next,
++                                struct drm_output, base.link);
++
++                      wl_list_for_each(plane, &b->plane_list, link) {
++                                if (plane->type != WDRM_PLANE_TYPE_OVERLAY)
++                                        continue;
++
++                                drmModeSetPlane(b->drm.fd,
++                                                plane->plane_id,
++                                                output->crtc_id, 0, 0,
++                                                0, 0, 0, 0, 0, 0, 0, 0);
++                      }
+               }
+       }
+ }
+@@ -6649,7 +6657,8 @@ switch_to_gl_renderer(struct drm_backend *b)
+       }
+       wl_list_for_each(output, &b->compositor->output_list, base.link)
+-              pixman_renderer_output_destroy(&output->base);
++              if(output->base.output_type == OUTPUT_DRM)
++                        pixman_renderer_output_destroy(&output->base);
+       b->compositor->renderer->destroy(b->compositor);
+@@ -6661,7 +6670,8 @@ switch_to_gl_renderer(struct drm_backend *b)
+       }
+       wl_list_for_each(output, &b->compositor->output_list, base.link)
+-              drm_output_init_egl(output, b);
++              if(output->base.output_type == OUTPUT_DRM)
++                      drm_output_init_egl(output, b);
+       b->use_pixman = 0;
+diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c
+index a71b7bd..8edb50b 100644
+--- a/libweston/compositor-fbdev.c
++++ b/libweston/compositor-fbdev.c
+@@ -501,7 +501,7 @@ fbdev_output_enable(struct weston_output *base)
+       struct fbdev_head *head;
+       int fb_fd;
+       struct wl_event_loop *loop;
+-
++        output->base.output_type = OUTPUT_FBDEV;
+       head = fbdev_output_get_head(output);
+       /* Create the frame buffer. */
+diff --git a/libweston/compositor-headless.c b/libweston/compositor-headless.c
+index 61a5bd9..f633cd7 100644
+--- a/libweston/compositor-headless.c
++++ b/libweston/compositor-headless.c
+@@ -159,7 +159,7 @@ headless_output_enable(struct weston_output *base)
+       loop = wl_display_get_event_loop(b->compositor->wl_display);
+       output->finish_frame_timer =
+               wl_event_loop_add_timer(loop, finish_frame_handler, output);
+-
++        output->base.output_type = OUTPUT_HEADLESS;
+       if (b->use_pixman) {
+               output->image_buf = malloc(output->base.current_mode->width *
+                                          output->base.current_mode->height * 4);
+diff --git a/libweston/compositor-rdp.c b/libweston/compositor-rdp.c
+index 134e729..429370c 100644
+--- a/libweston/compositor-rdp.c
++++ b/libweston/compositor-rdp.c
+@@ -554,7 +554,7 @@ rdp_output_enable(struct weston_output *base)
+       struct rdp_output *output = to_rdp_output(base);
+       struct rdp_backend *b = to_rdp_backend(base->compositor);
+       struct wl_event_loop *loop;
+-
++        output->base.output_type = OUTPUT_RDP;
+       output->shadow_surface = pixman_image_create_bits(PIXMAN_x8r8g8b8,
+                                                         output->base.current_mode->width,
+                                                         output->base.current_mode->height,
+diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c
+index e80ecc1..808fc8f 100644
+--- a/libweston/compositor-wayland.c
++++ b/libweston/compositor-wayland.c
+@@ -1221,7 +1221,7 @@ wayland_output_enable(struct weston_output *base)
+       struct wayland_backend *b = to_wayland_backend(base->compositor);
+       enum mode_status mode_status;
+       int ret = 0;
+-
++        output->base.output_type = OUTPUT_WAYLAND;
+       weston_log("Creating %dx%d wayland output at (%d, %d)\n",
+                  output->base.current_mode->width,
+                  output->base.current_mode->height,
+diff --git a/libweston/compositor-x11.c b/libweston/compositor-x11.c
+index 4a9d068..afbaa73 100644
+--- a/libweston/compositor-x11.c
++++ b/libweston/compositor-x11.c
+@@ -933,7 +933,7 @@ x11_output_enable(struct weston_output *base)
+               XCB_EVENT_MASK_STRUCTURE_NOTIFY,
+               0
+       };
+-
++        output->base.output_type = OUTPUT_X11;
+       if (!b->no_input)
+               values[0] |=
+                       XCB_EVENT_MASK_KEY_PRESS |
+diff --git a/libweston/compositor.h b/libweston/compositor.h
+index 8b7a102..60feda3 100644
+--- a/libweston/compositor.h
++++ b/libweston/compositor.h
+@@ -169,6 +169,16 @@ enum dpms_enum {
+       WESTON_DPMS_OFF
+ };
++/* bit compatible with drm definitions. */
++enum output_type {
++      OUTPUT_DRM,
++      OUTPUT_FBDEV,
++      OUTPUT_HEADLESS,
++      OUTPUT_RDP,
++      OUTPUT_WAYLAND,
++      OUTPUT_X11,
++      OUTPUT_WALTHAM
++};
+ /** Represents a monitor
+  *
+  * This object represents a monitor (hardware backends like DRM) or a window
+@@ -201,7 +211,7 @@ struct weston_head {
+ struct weston_output {
+       uint32_t id;
+       char *name;
+-
++        enum output_type output_type;
+       /** Matches the lifetime from the user perspective */
+       struct wl_signal user_destroy_signal;
+-- 
+2.7.4
+
@@ -1,21 +1,21 @@
-From 3dbffb783f44752ec221a2ee7a94a21934d681a2 Mon Sep 17 00:00:00 2001
-From: Wataru Mizuno <wmizuno@jp.adit-jv.com>
-Date: Tue, 10 Apr 2018 12:22:07 +0900
-Subject: [PATCH 5/5] compositor-drm: introduce drm_get_dmafd_from_view
+From 020508b35b2bf6c89d62961eb95e2f81d6381ab5 Mon Sep 17 00:00:00 2001
+From: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+Date: Mon, 29 Jul 2019 17:07:00 +0900
+Subject: [PATCH 2/3] compositor-drm: introduce drm_get_dmafd_from_view
 
 This API enables to get dmafd from weston_view
 
-Signed-off-by: Wataru Mizuno <wmizuno@jp.adit-jv.com>
+Signed-off-by: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
 ---
- libweston/compositor-drm.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++
- libweston/compositor-drm.h |  7 ++++
- 2 files changed, 87 insertions(+)
+ libweston/compositor-drm.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++
+ libweston/compositor-drm.h |  7 ++++++
+ 2 files changed, 64 insertions(+)
 
 diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
-index 0b5b4c4..77f2ece 100644
+index 26a480c..2b99db5 100644
 --- a/libweston/compositor-drm.c
 +++ b/libweston/compositor-drm.c
-@@ -2430,6 +2430,85 @@ drm_output_set_seat(struct weston_output *base,
+@@ -5420,6 +5420,62 @@ drm_output_set_seat(struct weston_output *base,
  }
  
  static int
@@ -27,6 +27,7 @@ index 0b5b4c4..77f2ece 100644
 +      struct gbm_bo *bo;
 +      struct drm_fb *current;
 +      struct linux_dmabuf_buffer *dmabuf;
++      bool is_opaque = drm_view_is_opaque(ev);
 +      uint32_t format;
 +      int fd, ret;
 +
@@ -36,57 +37,34 @@ index 0b5b4c4..77f2ece 100644
 +      }
 +
 +      if(dmabuf = linux_dmabuf_buffer_get(buffer->resource)) {
-+              struct gbm_import_fd_data gbm_dmabuf = {
-+                      .fd     = dmabuf->attributes.fd[0],
-+                      .width  = dmabuf->attributes.width,
-+                      .height = dmabuf->attributes.height,
-+                      .stride = dmabuf->attributes.stride[0],
-+                      .format = dmabuf->attributes.format
-+              };
-+
-+              bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_FD,
-+                                 &gbm_dmabuf, GBM_BO_USE_SCANOUT);
-+              if (!bo) {
-+                      weston_log("failed to get gbm_bo\n");
-+                      return -1;
-+              }
-+
-+              current = zalloc(sizeof *current);
-+              current->handle = gbm_bo_get_handle(bo).s32;
-+              if (!current->handle) {
-+                      fprintf(stderr, "failed to get drm_handle\n");
++              current = drm_fb_get_from_dmabuf(dmabuf, b, is_opaque);
++              if (!current)
++              {
++                      fprintf(stderr, "failed to get drm_fb from dmabuf\n");
 +                      return -1;
 +              }
 +      }
 +      else if(ev->surface->buffer_ref.buffer->legacy_buffer) {
 +              bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
 +                                 buffer->resource, GBM_BO_USE_SCANOUT);
-+
 +              if (!bo) {
 +                      weston_log("failed to get gbm_bo\n");
 +                      return -1;
 +              }
++              current = drm_fb_get_from_bo(bo, b, is_opaque, BUFFER_CLIENT);
 +
-+              format = gbm_bo_get_format(bo);
-+              if (!format) {
-+                      weston_log("failed to get format\n");
-+                      gbm_bo_destroy(bo);
-+                      return -1;
-+              }
-+
-+              current = drm_fb_get_from_bo(bo, b, format);
 +              if (!current) {
-+                      weston_log("failed to get drm_fb\n");
-+                      gbm_bo_destroy(bo);
++                      weston_log("failed to get drm_fb from bo\n");
 +                      return -1;
 +              }
++
 +      }
 +      else {
 +              weston_log("Buffer is not supported\n");
 +              return -1;
 +      }
 +
-+      ret = drmPrimeHandleToFD(b->drm.fd, current->handle,
++      ret = drmPrimeHandleToFD(b->drm.fd, current->handles[0],
 +                               DRM_CLOEXEC, &fd);
 +      free(current);
 +      if (ret) {
@@ -96,12 +74,11 @@ index 0b5b4c4..77f2ece 100644
 +
 +      return fd;
 +}
-+
 +static int
- drm_output_enable(struct weston_output *base)
+ drm_output_init_gamma_size(struct drm_output *output)
  {
-       struct drm_output *output = to_drm_output(base);
-@@ -3199,6 +3278,7 @@ static const struct weston_drm_output_api api = {
+       struct drm_backend *backend = to_drm_backend(output->base.compositor);
+@@ -6696,6 +6752,7 @@ static const struct weston_drm_output_api api = {
        drm_output_set_mode,
        drm_output_set_gbm_format,
        drm_output_set_seat,
@@ -110,7 +87,7 @@ index 0b5b4c4..77f2ece 100644
  
  static struct drm_backend *
 diff --git a/libweston/compositor-drm.h b/libweston/compositor-drm.h
-index 2e2995a..fe00bd5 100644
+index 9c37c15..a82a2a9 100644
 --- a/libweston/compositor-drm.h
 +++ b/libweston/compositor-drm.h
 @@ -78,6 +78,13 @@ struct weston_drm_output_api {
@@ -118,7 +95,7 @@ index 2e2995a..fe00bd5 100644
        void (*set_seat)(struct weston_output *output,
                         const char *seat);
 +
-+      /** Get the dma fd from drm view.
++        /** Get the dma fd from drm view.
 +       *
 +         *  The dma fd is got from weston_view.
 +       *  Returns fd on success, -1 on failure.
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0018-compositor-add-output-type-to-weston_output.patch b/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0018-compositor-add-output-type-to-weston_output.patch
deleted file mode 100644 (file)
index 4c46ec4..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-From 99fb36e62d3d0e3bda3d2984f280f534a629f70c Mon Sep 17 00:00:00 2001
-From: Wataru Mizuno <wmizuno@jp.adit-jv.com>
-Date: Thu, 12 Oct 2017 14:55:13 +0900
-Subject: [PATCH 1/5] compositor: add output type to weston_output
-
-This enables weston to use multiple types of backend
-Each backends have own output structure for each functions
-To avoid invalid member access, type identifier is needed
-
-Signed-off-by: Wataru Mizuno <wmizuno@jp.adit-jv.com>
----
- libweston/compositor-drm.c      | 100 +++++++++++++++++++++++-----------------
- libweston/compositor-fbdev.c    |   1 +
- libweston/compositor-headless.c |   1 +
- libweston/compositor-rdp.c      |   1 +
- libweston/compositor-wayland.c  |   1 +
- libweston/compositor-x11.c      |   1 +
- libweston/compositor.h          |  12 +++++
- 7 files changed, 74 insertions(+), 43 deletions(-)
-
-diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
-index 1d38f05..0b5b4c4 100644
---- a/libweston/compositor-drm.c
-+++ b/libweston/compositor-drm.c
-@@ -243,14 +243,16 @@ drm_output_find_by_crtc(struct drm_backend *b, uint32_t crtc_id)
-       struct drm_output *output;
-       wl_list_for_each(output, &b->compositor->output_list, base.link) {
--              if (output->crtc_id == crtc_id)
--                      return output;
-+              if(output->base.output_type == OUTPUT_DRM)
-+                      if (output->crtc_id == crtc_id)
-+                              return output;
-       }
-       wl_list_for_each(output, &b->compositor->pending_output_list,
-                        base.link) {
--              if (output->crtc_id == crtc_id)
--                      return output;
-+              if(output->base.output_type == OUTPUT_DRM)
-+                      if (output->crtc_id == crtc_id)
-+                              return output;
-       }
-       return NULL;
-@@ -262,14 +264,16 @@ drm_output_find_by_connector(struct drm_backend *b, uint32_t connector_id)
-       struct drm_output *output;
-       wl_list_for_each(output, &b->compositor->output_list, base.link) {
--              if (output->connector_id == connector_id)
--                      return output;
-+              if(output->base.output_type == OUTPUT_DRM)
-+                      if (output->connector_id == connector_id)
-+                              return output;
-       }
-       wl_list_for_each(output, &b->compositor->pending_output_list,
-                        base.link) {
--              if (output->connector_id == connector_id)
--                      return output;
-+              if(output->base.output_type == OUTPUT_DRM)
-+                      if (output->connector_id == connector_id)
-+                              return output;
-       }
-       return NULL;
-@@ -2433,6 +2437,7 @@ drm_output_enable(struct weston_output *base)
-       struct weston_mode *m;
-       output->dpms_prop = drm_get_prop(b->drm.fd, output->connector, "DPMS");
-+      output->base.output_type = OUTPUT_DRM;
-       if (b->use_pixman) {
-               if (drm_output_init_pixman(output, b) < 0) {
-@@ -2797,38 +2802,42 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device)
-       wl_list_for_each_safe(output, next, &b->compositor->output_list,
-                             base.link) {
--              bool disconnected = true;
--
--              for (i = 0; i < resources->count_connectors; i++) {
--                      if (connected[i] == output->connector_id) {
--                              disconnected = false;
--                              break;
-+              if (output->base.output_type == OUTPUT_DRM) {
-+                      bool disconnected = true;
-+
-+                      for (i = 0; i < resources->count_connectors; i++) {
-+                              if (connected[i] == output->connector_id) {
-+                                      disconnected = false;
-+                                      break;
-+                              }
-                       }
--              }
--              if (!disconnected)
--                      continue;
-+                      if (!disconnected)
-+                              continue;
--              weston_log("connector %d disconnected\n", output->connector_id);
--              drm_output_destroy(&output->base);
-+                      weston_log("connector %d disconnected\n", output->connector_id);
-+                      drm_output_destroy(&output->base);
-+              }
-       }
-       wl_list_for_each_safe(output, next, &b->compositor->pending_output_list,
-                             base.link) {
--              bool disconnected = true;
--
--              for (i = 0; i < resources->count_connectors; i++) {
--                      if (connected[i] == output->connector_id) {
--                              disconnected = false;
--                              break;
-+              if (output->base.output_type == OUTPUT_DRM) {
-+                      bool disconnected = true;
-+
-+                      for (i = 0; i < resources->count_connectors; i++) {
-+                              if (connected[i] == output->connector_id) {
-+                                      disconnected = false;
-+                                      break;
-+                              }
-                       }
--              }
--              if (!disconnected)
--                      continue;
-+                      if (!disconnected)
-+                              continue;
--              weston_log("connector %d disconnected\n", output->connector_id);
--              drm_output_destroy(&output->base);
-+                      weston_log("connector %d disconnected\n", output->connector_id);
-+                      drm_output_destroy(&output->base);
-+              }
-       }
-       free(connected);
-@@ -2925,18 +2934,21 @@ session_notify(struct wl_listener *listener, void *data)
-                * pending frame callbacks. */
-               wl_list_for_each(output, &compositor->output_list, base.link) {
--                      output->base.repaint_needed = 0;
--                      drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0);
-+                      if(output->base.output_type == OUTPUT_DRM) {
-+                              output->base.repaint_needed = 0;
-+                              drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0);
-+                      }
-+              }
-+              if(output->base.output_type == OUTPUT_DRM) {
-+                      output = container_of(compositor->output_list.next,
-+                                            struct drm_output, base.link);
-+
-+                      wl_list_for_each(sprite, &b->sprite_list, link)
-+                              drmModeSetPlane(b->drm.fd,
-+                                              sprite->plane_id,
-+                                              output->crtc_id, 0, 0,
-+                                              0, 0, 0, 0, 0, 0, 0, 0);
-               }
--
--              output = container_of(compositor->output_list.next,
--                                    struct drm_output, base.link);
--
--              wl_list_for_each(sprite, &b->sprite_list, link)
--                      drmModeSetPlane(b->drm.fd,
--                                      sprite->plane_id,
--                                      output->crtc_id, 0, 0,
--                                      0, 0, 0, 0, 0, 0, 0, 0);
-       };
- }
-@@ -3148,7 +3160,8 @@ switch_to_gl_renderer(struct drm_backend *b)
-       }
-       wl_list_for_each(output, &b->compositor->output_list, base.link)
--              pixman_renderer_output_destroy(&output->base);
-+              if(output->base.output_type == OUTPUT_DRM)
-+                      pixman_renderer_output_destroy(&output->base);
-       b->compositor->renderer->destroy(b->compositor);
-@@ -3160,7 +3173,8 @@ switch_to_gl_renderer(struct drm_backend *b)
-       }
-       wl_list_for_each(output, &b->compositor->output_list, base.link)
--              drm_output_init_egl(output, b);
-+              if(output->base.output_type == OUTPUT_DRM)
-+                      drm_output_init_egl(output, b);
-       b->use_pixman = 0;
-diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c
-index 44f0cf5..9cb903e 100644
---- a/libweston/compositor-fbdev.c
-+++ b/libweston/compositor-fbdev.c
-@@ -433,6 +433,7 @@ fbdev_output_enable(struct weston_output *base)
-       int fb_fd;
-       struct wl_event_loop *loop;
-+      output->base.output_type = OUTPUT_FBDEV;
-       /* Create the frame buffer. */
-       fb_fd = fbdev_frame_buffer_open(output, output->device, &output->fb_info);
-       if (fb_fd < 0) {
-diff --git a/libweston/compositor-headless.c b/libweston/compositor-headless.c
-index a1aec6d..b0d5afb 100644
---- a/libweston/compositor-headless.c
-+++ b/libweston/compositor-headless.c
-@@ -148,6 +148,7 @@ headless_output_enable(struct weston_output *base)
-       loop = wl_display_get_event_loop(b->compositor->wl_display);
-       output->finish_frame_timer =
-               wl_event_loop_add_timer(loop, finish_frame_handler, output);
-+      output->base.output_type = OUTPUT_HEADLESS;
-       if (b->use_pixman) {
-               output->image_buf = malloc(output->base.current_mode->width *
-diff --git a/libweston/compositor-rdp.c b/libweston/compositor-rdp.c
-index d9668e8..d525982 100644
---- a/libweston/compositor-rdp.c
-+++ b/libweston/compositor-rdp.c
-@@ -519,6 +519,7 @@ rdp_output_enable(struct weston_output *base)
-       struct rdp_backend *b = to_rdp_backend(base->compositor);
-       struct wl_event_loop *loop;
-+      output->base.output_type = OUTPUT_RDP;
-       output->shadow_surface = pixman_image_create_bits(PIXMAN_x8r8g8b8,
-                                                         output->base.current_mode->width,
-                                                         output->base.current_mode->height,
-diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c
-index 9d35ef7..66a0dbf 100644
---- a/libweston/compositor-wayland.c
-+++ b/libweston/compositor-wayland.c
-@@ -1164,6 +1164,7 @@ wayland_output_enable(struct weston_output *base)
-       struct wayland_backend *b = to_wayland_backend(base->compositor);
-       int ret = 0;
-+      output->base.output_type = OUTPUT_WAYLAND;
-       weston_log("Creating %dx%d wayland output at (%d, %d)\n",
-                  output->base.current_mode->width,
-                  output->base.current_mode->height,
-diff --git a/libweston/compositor-x11.c b/libweston/compositor-x11.c
-index f9cb461..fcf39e1 100644
---- a/libweston/compositor-x11.c
-+++ b/libweston/compositor-x11.c
-@@ -825,6 +825,7 @@ x11_output_enable(struct weston_output *base)
-               XCB_EVENT_MASK_STRUCTURE_NOTIFY,
-               0
-       };
-+      output->base.output_type = OUTPUT_X11;
-       if (!b->no_input)
-               values[0] |=
-diff --git a/libweston/compositor.h b/libweston/compositor.h
-index 08e728a..51157d0 100644
---- a/libweston/compositor.h
-+++ b/libweston/compositor.h
-@@ -146,9 +146,21 @@ enum dpms_enum {
-       WESTON_DPMS_OFF
- };
-+/* bit compatible with drm definitions. */
-+enum output_type {
-+      OUTPUT_DRM,
-+      OUTPUT_FBDEV,
-+      OUTPUT_HEADLESS,
-+      OUTPUT_RDP,
-+      OUTPUT_WAYLAND,
-+      OUTPUT_X11,
-+      OUTPUT_WALTHAM
-+};
-+
- struct weston_output {
-       uint32_t id;
-       char *name;
-+      enum output_type output_type;
-       void *renderer_state;
--- 
-2.7.4
-
diff --git a/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0018-compositor-drm-get-stride-from-drm_get_dma_fd_from_view.patch b/meta-agl-profile-graphical/recipes-graphics/wayland/weston/0018-compositor-drm-get-stride-from-drm_get_dma_fd_from_view.patch
new file mode 100644 (file)
index 0000000..e2655d1
--- /dev/null
@@ -0,0 +1,59 @@
+From 0dac780379228396a19048544b9e53d5aa407583 Mon Sep 17 00:00:00 2001
+From: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+Date: Mon, 29 Jul 2019 17:08:31 +0900
+Subject: [PATCH 3/3] compositor-drm: get stride from drm_get_dma_fd_from_view
+
+Modify drm_get_dma_fd_from_view to get buffer stride.
+
+Signed-off-by: Veeresh Kadasani <external.vkadasani@jp.adit-jv.com>
+---
+ libweston/compositor-drm.c | 5 +++--
+ libweston/compositor-drm.h | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
+index 2b99db5..ec2765f 100644
+--- a/libweston/compositor-drm.c
++++ b/libweston/compositor-drm.c
+@@ -5421,7 +5421,7 @@ drm_output_set_seat(struct weston_output *base,
+ static int
+ drm_get_dma_fd_from_view(struct weston_output *base,
+-                         struct weston_view *ev)
++                         struct weston_view *ev, int *buf_stride)
+ {
+       struct drm_backend *b = to_drm_backend(base->compositor);
+       struct weston_buffer *buffer = ev->surface->buffer_ref.buffer;
+@@ -5444,6 +5444,7 @@ drm_get_dma_fd_from_view(struct weston_output *base,
+                       fprintf(stderr, "failed to get drm_fb from dmabuf\n");
+                       return -1;
+               }
++              *buf_stride=current->strides[0];
+       }
+       else if(ev->surface->buffer_ref.buffer->legacy_buffer) {
+               bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
+@@ -5458,7 +5459,7 @@ drm_get_dma_fd_from_view(struct weston_output *base,
+                       weston_log("failed to get drm_fb from bo\n");
+                       return -1;
+               }
+-
++                *buf_stride=current->strides[0];
+       }
+       else {
+               weston_log("Buffer is not supported\n");
+diff --git a/libweston/compositor-drm.h b/libweston/compositor-drm.h
+index a82a2a9..c2461b3 100644
+--- a/libweston/compositor-drm.h
++++ b/libweston/compositor-drm.h
+@@ -84,7 +84,7 @@ struct weston_drm_output_api {
+          *  The dma fd is got from weston_view.
+        *  Returns fd on success, -1 on failure.
+        */
+-      int (*get_dma_fd_from_view)(struct weston_output *output, struct weston_view *view);
++      int (*get_dma_fd_from_view)(struct weston_output *output, struct weston_view *view, int *buf_stride);
+ };
+ static inline const struct weston_drm_output_api *
+-- 
+2.7.4
+
index 579429b..108cca8 100644 (file)
@@ -18,11 +18,10 @@ SRC_URI_append = "\
     file://0014-simple-shm-remove-ivi-application-support.patch \
     file://0015-window-client-remove-ivi-application-support.patch \
     file://use-XDG_RUNTIMESHARE_DIR.patch \
+    file://0016-compositor-add-output-type-to-weston_output.patch \
+    file://0017-compositor-drm-introduce-drm_get_dmafd_from_view.patch \
+    file://0018-compositor-drm-get-stride-from-drm_get_dma_fd_from_view.patch \
     "
 
-# FIXME: The following patches need to be updated for weston 5.0.0:
-#    file://0018-compositor-add-output-type-to-weston_output.patch
-#    file://0019-compositor-drm-introduce-drm_get_dmafd_from_view.patch
-
 
 EXTRA_OECONF_append = " --enable-sys-uid"
index 4bd4d68..44fcdcb 100644 (file)
@@ -3,6 +3,8 @@ FILESEXTRAPATHS_append := ":${THISDIR}/${PN}"
 SRC_URI_append = "\
     file://0001-Allow-regular-users-to-launch-Weston_2.0.0.patch \
     file://use-XDG_RUNTIMESHARE_DIR.patch \
+    file://0002-compositor-add-output-type-to-weston_output.patch \
+    file://0003-compositor-drm-introduce-drm_get_dmafd_from_view.patch \
     "
 
 EXTRA_OECONF_append = " --enable-sys-uid"