1381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke/*
2381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * Mesa 3-D graphics library
3381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * Version:  7.11
4381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke *
5381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * Copyright (C) 2011 Benjamin Franzke <benjaminfranzke@googlemail.com>
6381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke *
7381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * Permission is hereby granted, free of charge, to any person obtaining a
8381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * copy of this software and associated documentation files (the "Software"),
9381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * to deal in the Software without restriction, including without limitation
10381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * and/or sell copies of the Software, and to permit persons to whom the
12381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * Software is furnished to do so, subject to the following conditions:
13381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke *
14381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * The above copyright notice and this permission notice shall be included
15381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * in all copies or substantial portions of the Software.
16381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke *
17381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke * DEALINGS IN THE SOFTWARE.
24381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke */
25381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
26381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "util/u_memory.h"
27381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "util/u_inlines.h"
28381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
29381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "pipe/p_compiler.h"
30381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "pipe/p_screen.h"
31381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "pipe/p_context.h"
32381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "pipe/p_state.h"
33381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "state_tracker/drm_driver.h"
34381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "egllog.h"
35381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
36381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke#include "native_wayland.h"
37381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
38a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic void
39a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergsync_callback(void *data, struct wl_callback *callback, uint32_t serial)
40a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg{
41a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   int *done = data;
42a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg
43a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   *done = 1;
44a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   wl_callback_destroy(callback);
45a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg}
46a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg
47a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergstatic const struct wl_callback_listener sync_listener = {
48a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   sync_callback
49a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg};
50a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg
51a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergint
52a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsbergwayland_roundtrip(struct wayland_display *display)
53a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg{
54a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   struct wl_callback *callback;
55a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   int done = 0, ret = 0;
56a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg
57a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   callback = wl_display_sync(display->dpy);
58a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   wl_callback_add_listener(callback, &sync_listener, &done);
59a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   wl_proxy_set_queue((struct wl_proxy *) callback, display->queue);
60f2da7e720f60e8df96bf2530f35e3e79897e0cb7Jonas Ådahl   while (ret != -1 && !done)
61a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg      ret = wl_display_dispatch_queue(display->dpy, display->queue);
62a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg
63f2da7e720f60e8df96bf2530f35e3e79897e0cb7Jonas Ådahl   if (!done)
64f2da7e720f60e8df96bf2530f35e3e79897e0cb7Jonas Ådahl      wl_callback_destroy(callback);
65f2da7e720f60e8df96bf2530f35e3e79897e0cb7Jonas Ådahl
66a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   return ret;
67a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg}
68a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg
6973df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wustatic const struct native_event_handler *wayland_event_handler;
70381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
711191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzkeconst static struct {
721191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke   enum pipe_format format;
731191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke   enum wayland_format_flag flag;
741191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke} wayland_formats[] = {
7558dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg   { PIPE_FORMAT_B8G8R8A8_UNORM, HAS_ARGB8888 },
7658dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg   { PIPE_FORMAT_B8G8R8X8_UNORM, HAS_XRGB8888 },
771191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke};
781191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke
79381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic const struct native_config **
801191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzkewayland_display_get_configs(struct native_display *ndpy, int *num_configs)
81381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
82381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_display *display = wayland_display(ndpy);
83381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   const struct native_config **configs;
84ca79036fe8170a87fe8118fb812320c2536b6d46Benjamin Franzke   int i;
85381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
861191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke   if (!display->configs) {
87ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu      struct native_config *nconf;
881191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke
891191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke      display->num_configs = 0;
901191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke      display->configs = CALLOC(Elements(wayland_formats),
911191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke                                sizeof(*display->configs));
921191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke      if (!display->configs)
93ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu         return NULL;
94ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu
951191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke      for (i = 0; i < Elements(wayland_formats); ++i) {
961191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke         if (!(display->formats & wayland_formats[i].flag))
971191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke            continue;
981191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke
991191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke         nconf = &display->configs[display->num_configs].base;
100ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu         nconf->buffer_mask =
101ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu            (1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
102ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu            (1 << NATIVE_ATTACHMENT_BACK_LEFT);
103ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu
104ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu         nconf->window_bit = TRUE;
1051191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke
1061191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke         nconf->color_format = wayland_formats[i].format;
1071191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke         display->num_configs++;
10895b445699d7f049116ee0927387a958a9933766bChia-I Wu      }
109ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu   }
110ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu
1111191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke   configs = MALLOC(display->num_configs * sizeof(*configs));
112ee0e6ae2bb25bfa02547ef9986bdff8afc792d49Chia-I Wu   if (configs) {
1131191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke      for (i = 0; i < display->num_configs; ++i)
1141191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke         configs[i] = &display->configs[i].base;
115381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      if (num_configs)
1161191d203632e2954ce59163f87c9896b1c6ed40aBenjamin Franzke         *num_configs = display->num_configs;
117381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   }
118381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
119381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   return configs;
120381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
121381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
122381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic int
123381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_display_get_param(struct native_display *ndpy,
124381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                          enum native_param_type param)
125381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
126381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   int val;
127381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
128381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   switch (param) {
1297645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke   case NATIVE_PARAM_PREMULTIPLIED_ALPHA:
13058dc1b28d1ef4d1931c52b079d304f2e1546329dKristian Høgsberg      val = 1;
1317645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke      break;
13234fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke   case NATIVE_PARAM_USE_NATIVE_BUFFER:
13334fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke   case NATIVE_PARAM_PRESERVE_BUFFER:
13434fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
13534fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke   default:
13634fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke      val = 0;
13734fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke      break;
138381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   }
139381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
140381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   return val;
141381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
142381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
143381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic void
144287278352ea26947f8d304458c10bf0388beebb5Chia-I Wuwayland_release_pending_resource(void *data,
145287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu                                 struct wl_callback *callback,
146287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu                                 uint32_t time)
1479f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke{
1489f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   struct wayland_surface *surface = data;
1499f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke
150287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu   wl_callback_destroy(callback);
151287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu
1529f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   /* FIXME: print internal error */
1539f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   if (!surface->pending_resource)
1549f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke      return;
1559f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke
1569f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   pipe_resource_reference(&surface->pending_resource, NULL);
1579f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke}
1589f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke
159287278352ea26947f8d304458c10bf0388beebb5Chia-I Wustatic const struct wl_callback_listener release_buffer_listener = {
160287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu   wayland_release_pending_resource
161287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu};
162287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu
1639f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzkestatic void
164381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_window_surface_handle_resize(struct wayland_surface *surface)
165381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
1669f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   struct wayland_display *display = surface->display;
1679f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   struct pipe_resource *front_resource;
1689f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   const enum native_attachment front_natt = NATIVE_ATTACHMENT_FRONT_LEFT;
169381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   int i;
17034fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke
1719f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   front_resource = resource_surface_get_single_resource(surface->rsurf,
1729f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke                                                         front_natt);
173381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (resource_surface_set_size(surface->rsurf,
17434fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke                                 surface->win->width, surface->win->height)) {
1759f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke
1769f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke      if (surface->pending_resource)
177a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg         wayland_roundtrip(display);
1789f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke
1799f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke      if (front_resource) {
180287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu         struct wl_callback *callback;
181287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu
1829f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke         surface->pending_resource = front_resource;
1839f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke         front_resource = NULL;
184287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu
185287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu         callback = wl_display_sync(display->dpy);
186287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu         wl_callback_add_listener(callback, &release_buffer_listener, surface);
187a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg         wl_proxy_set_queue((struct wl_proxy *) callback, display->queue);
1889f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke      }
1899f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke
190381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      for (i = 0; i < WL_BUFFER_COUNT; ++i) {
191381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke         if (surface->buffer[i])
192381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke            wl_buffer_destroy(surface->buffer[i]);
193381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke         surface->buffer[i] = NULL;
194381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      }
19587c3bb65bbd4fdf868d57c2c58f3330efa36b75bBenjamin Franzke
19687c3bb65bbd4fdf868d57c2c58f3330efa36b75bBenjamin Franzke      surface->dx = surface->win->dx;
19787c3bb65bbd4fdf868d57c2c58f3330efa36b75bBenjamin Franzke      surface->dy = surface->win->dy;
198381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   }
1999f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   pipe_resource_reference(&front_resource, NULL);
200381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
201381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
202381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic boolean
203381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_surface_validate(struct native_surface *nsurf, uint attachment_mask,
204381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                         unsigned int *seq_num, struct pipe_resource **textures,
205381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                         int *width, int *height)
206381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
207381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_surface *surface = wayland_surface(nsurf);
208381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
209381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (surface->type == WL_WINDOW_SURFACE)
210381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      wayland_window_surface_handle_resize(surface);
211381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
212381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (!resource_surface_add_resources(surface->rsurf, attachment_mask |
213381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                                       surface->attachment_mask))
214381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      return FALSE;
215381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
216381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (textures)
217381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      resource_surface_get_resources(surface->rsurf, textures, attachment_mask);
218381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
219381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (seq_num)
220381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      *seq_num = surface->sequence_number;
221381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
222381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   resource_surface_get_size(surface->rsurf, (uint *) width, (uint *) height);
223381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
224381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   return TRUE;
225381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
226381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
227381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic void
228287278352ea26947f8d304458c10bf0388beebb5Chia-I Wuwayland_frame_callback(void *data, struct wl_callback *callback, uint32_t time)
229381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
230381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_surface *surface = data;
231381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
232a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   surface->frame_callback = NULL;
233287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu
234287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu   wl_callback_destroy(callback);
235381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
236381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
237287278352ea26947f8d304458c10bf0388beebb5Chia-I Wustatic const struct wl_callback_listener frame_listener = {
238287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu   wayland_frame_callback
239287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu};
240287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu
241381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic INLINE void
242381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_buffers_swap(struct wl_buffer **buffer,
243381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                     enum wayland_buffer_type buf1,
244381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                     enum wayland_buffer_type buf2)
245381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
246381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wl_buffer *tmp = buffer[buf1];
247381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   buffer[buf1] = buffer[buf2];
248381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   buffer[buf2] = tmp;
249381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
250381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
251381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic boolean
252381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_surface_swap_buffers(struct native_surface *nsurf)
253381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
254381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_surface *surface = wayland_surface(nsurf);
255381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_display *display = surface->display;
256a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   int ret = 0;
257381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
258a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   while (surface->frame_callback && ret != -1)
259a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg      ret = wl_display_dispatch_queue(display->dpy, display->queue);
260a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   if (ret == -1)
261a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg      return EGL_FALSE;
262287278352ea26947f8d304458c10bf0388beebb5Chia-I Wu
263a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   surface->frame_callback = wl_surface_frame(surface->win->surface);
264a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   wl_callback_add_listener(surface->frame_callback, &frame_listener, surface);
265a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   wl_proxy_set_queue((struct wl_proxy *) surface->frame_callback,
266a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg                      display->queue);
267381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
268381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (surface->type == WL_WINDOW_SURFACE) {
269381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      resource_surface_swap_buffers(surface->rsurf,
27034fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke                                    NATIVE_ATTACHMENT_FRONT_LEFT,
27134fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke                                    NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
272381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
273381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      wayland_buffers_swap(surface->buffer, WL_BUFFER_FRONT, WL_BUFFER_BACK);
274381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
275381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      if (surface->buffer[WL_BUFFER_FRONT] == NULL)
276381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke         surface->buffer[WL_BUFFER_FRONT] =
27734fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke            display->create_buffer(display, surface,
27834fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke                                   NATIVE_ATTACHMENT_FRONT_LEFT);
279381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
280381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      wl_surface_attach(surface->win->surface, surface->buffer[WL_BUFFER_FRONT],
281381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                        surface->dx, surface->dy);
28234fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke
283381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      resource_surface_get_size(surface->rsurf,
284381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                                (uint *) &surface->win->attached_width,
285381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                                (uint *) &surface->win->attached_height);
286381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      surface->dx = 0;
287381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      surface->dy = 0;
288381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   }
289381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
290381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->sequence_number++;
291381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   wayland_event_handler->invalid_surface(&display->base,
29234fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke                                          &surface->base,
29334fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke                                          surface->sequence_number);
294381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
295381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   return TRUE;
296381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
297381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
298381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic boolean
299381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_surface_present(struct native_surface *nsurf,
30008e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu                        const struct native_present_control *ctrl)
301381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
302381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_surface *surface = wayland_surface(nsurf);
303381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   uint width, height;
304381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   boolean ret;
305381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
30608e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   if (ctrl->preserve || ctrl->swap_interval)
307381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      return FALSE;
308381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
3097645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke   /* force buffers to be re-created if they will be presented differently */
3107645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke   if (surface->premultiplied_alpha != ctrl->premultiplied_alpha) {
3117645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke      enum wayland_buffer_type buffer;
3127645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke
3137645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke      for (buffer = 0; buffer < WL_BUFFER_COUNT; ++buffer) {
3147645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke         if (surface->buffer[buffer]) {
3157645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke            wl_buffer_destroy(surface->buffer[buffer]);
3167645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke            surface->buffer[buffer] = NULL;
3177645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke         }
3187645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke      }
3197645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke
3207645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke      surface->premultiplied_alpha = ctrl->premultiplied_alpha;
3217645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke   }
3227645c49e07b638de94f03d5f71fde397066a46eeBenjamin Franzke
32308e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   switch (ctrl->natt) {
324381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   case NATIVE_ATTACHMENT_FRONT_LEFT:
325381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      ret = TRUE;
326381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      break;
327381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   case NATIVE_ATTACHMENT_BACK_LEFT:
328381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      ret = wayland_surface_swap_buffers(nsurf);
329381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      break;
330381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   default:
331381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      ret = FALSE;
332381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      break;
333381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   }
334381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
335381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (surface->type == WL_WINDOW_SURFACE) {
336381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      resource_surface_get_size(surface->rsurf, &width, &height);
337381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      wl_surface_damage(surface->win->surface, 0, 0, width, height);
338a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg      wl_surface_commit(surface->win->surface);
339381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   }
340381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
341381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   return ret;
342381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
343381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
344381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic void
345381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_surface_wait(struct native_surface *nsurf)
346381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
347381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   /* no-op */
348381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
349381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
350381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic void
351381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_surface_destroy(struct native_surface *nsurf)
352381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
353381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_surface *surface = wayland_surface(nsurf);
354381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   enum wayland_buffer_type buffer;
355381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
356381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   for (buffer = 0; buffer < WL_BUFFER_COUNT; ++buffer) {
357381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      if (surface->buffer[buffer])
358381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke         wl_buffer_destroy(surface->buffer[buffer]);
359381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   }
360381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
3612332bc26d435e465a6f6571ab267db2a33ce05d2Jonas Ådahl   if (surface->frame_callback)
3622332bc26d435e465a6f6571ab267db2a33ce05d2Jonas Ådahl      wl_callback_destroy(surface->frame_callback);
3632332bc26d435e465a6f6571ab267db2a33ce05d2Jonas Ådahl
364381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   resource_surface_destroy(surface->rsurf);
365381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   FREE(surface);
366381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
367381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
36834fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke
369381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic struct native_surface *
370381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkewayland_create_window_surface(struct native_display *ndpy,
371381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                              EGLNativeWindowType win,
372381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke                              const struct native_config *nconf)
373381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
374381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_display *display = wayland_display(ndpy);
375381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_config *config = wayland_config(nconf);
376381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   struct wayland_surface *surface;
37734fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke   uint bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW |
37834fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke      PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT;
379381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
380381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface = CALLOC_STRUCT(wayland_surface);
381381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (!surface)
382381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      return NULL;
383381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
384381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->display = display;
385381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->color_format = config->base.color_format;
386381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
387381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->win = (struct wl_egl_window *) win;
388381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
3899f213f6a4af9d6b3663bd2fbd371fbec9f869c75Benjamin Franzke   surface->pending_resource = NULL;
390a5776ac0b8c015bf5d6a8513cefec5920895cc8eKristian Høgsberg   surface->frame_callback = NULL;
391381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->type = WL_WINDOW_SURFACE;
392381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
393381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->buffer[WL_BUFFER_FRONT] = NULL;
394381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->buffer[WL_BUFFER_BACK] = NULL;
395381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->attachment_mask = (1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
39634fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke      (1 << NATIVE_ATTACHMENT_BACK_LEFT);
397381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
398381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->rsurf = resource_surface_create(display->base.screen,
39934fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke                                            surface->color_format, bind);
400381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
401381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (!surface->rsurf) {
40234fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke      FREE(surface);
40334fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke      return NULL;
404381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   }
405381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
406381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->base.destroy = wayland_surface_destroy;
407381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->base.present = wayland_surface_present;
408381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->base.validate = wayland_surface_validate;
409381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   surface->base.wait = wayland_surface_wait;
410381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
411381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   return &surface->base;
412381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
413381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
414381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic struct native_display *
41573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_create_display(void *dpy, boolean use_sw)
416381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
41734fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke   struct wayland_display *display = NULL;
418a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke   boolean own_dpy = FALSE;
419381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
420d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke   use_sw = use_sw || debug_get_bool_option("EGL_SOFTWARE", FALSE);
421d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke
422a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke   if (dpy == NULL) {
423a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke      dpy = wl_display_connect(NULL);
424a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke      if (dpy == NULL)
425a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke         return NULL;
426a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke      own_dpy = TRUE;
427a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke   }
428a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke
429d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke   if (use_sw) {
430d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke      _eglLog(_EGL_INFO, "use software fallback");
431d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke      display = wayland_create_shm_display((struct wl_display *) dpy,
43273df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu                                           wayland_event_handler);
433d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke   } else {
434d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke      display = wayland_create_drm_display((struct wl_display *) dpy,
43573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu                                           wayland_event_handler);
436d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke   }
437d72e7f0dd95fdf28cf64c0b5b6d42c16f087008aBenjamin Franzke
438381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   if (!display)
439381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke      return NULL;
440381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
441381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   display->base.get_param = wayland_display_get_param;
442381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   display->base.get_configs = wayland_display_get_configs;
443381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   display->base.create_window_surface = wayland_create_window_surface;
444381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
445a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke   display->own_dpy = own_dpy;
446a23bf646bdeb72381e7f2bc784d47748cdd7d1ceBenjamin Franzke
447381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   return &display->base;
448381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
449381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
450381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkestatic const struct native_platform wayland_platform = {
451381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   "wayland", /* name */
45234fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke   native_create_display
453381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke};
454381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke
455381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzkeconst struct native_platform *
45673df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_get_wayland_platform(const struct native_event_handler *event_handler)
457381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke{
45873df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu   wayland_event_handler = event_handler;
459381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke   return &wayland_platform;
460381ea0d67a6d84a34d23571c49bbf4339ffda364Benjamin Franzke}
46134fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke
46234fd282b270dbaf0ce87e342b3183eb3a4bf4a44Benjamin Franzke/* vim: set sw=3 ts=8 sts=3 expandtab: */
463