1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.11
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2011 Benjamin Franzke <benjaminfranzke@googlemail.com>
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/drm_driver.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egllog.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "native_wayland.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsync_callback(void *data, struct wl_callback *callback, uint32_t serial)
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int *done = data;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *done = 1;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wl_callback_destroy(callback);
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct wl_callback_listener sync_listener = {
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sync_callback
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_roundtrip(struct wayland_display *display)
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wl_callback *callback;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int done = 0, ret = 0;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   callback = wl_display_sync(display->dpy);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wl_callback_add_listener(callback, &sync_listener, &done);
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wl_proxy_set_queue((struct wl_proxy *) callback, display->queue);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (ret != -1 && !done)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = wl_display_dispatch_queue(display->dpy, display->queue);
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!done)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wl_callback_destroy(callback);
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ret;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct native_event_handler *wayland_event_handler;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst static struct {
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_format format;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum wayland_format_flag flag;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} wayland_formats[] = {
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_B8G8R8A8_UNORM, HAS_ARGB8888 },
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_B8G8R8X8_UNORM, HAS_XRGB8888 },
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct native_config **
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_display_get_configs(struct native_display *ndpy, int *num_configs)
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_display *display = wayland_display(ndpy);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct native_config **configs;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!display->configs) {
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct native_config *nconf;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      display->num_configs = 0;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      display->configs = CALLOC(Elements(wayland_formats),
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                sizeof(*display->configs));
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!display->configs)
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(wayland_formats); ++i) {
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!(display->formats & wayland_formats[i].flag))
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nconf = &display->configs[display->num_configs].base;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nconf->buffer_mask =
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            (1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            (1 << NATIVE_ATTACHMENT_BACK_LEFT);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nconf->window_bit = TRUE;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nconf->color_format = wayland_formats[i].format;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         display->num_configs++;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   configs = MALLOC(display->num_configs * sizeof(*configs));
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (configs) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < display->num_configs; ++i)
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         configs[i] = &display->configs[i].base;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (num_configs)
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *num_configs = display->num_configs;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return configs;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_display_get_param(struct native_display *ndpy,
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          enum native_param_type param)
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int val;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (param) {
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NATIVE_PARAM_PREMULTIPLIED_ALPHA:
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      val = 1;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NATIVE_PARAM_USE_NATIVE_BUFFER:
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NATIVE_PARAM_PRESERVE_BUFFER:
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      val = 0;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return val;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_release_pending_resource(void *data,
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct wl_callback *callback,
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 uint32_t time)
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_surface *surface = data;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wl_callback_destroy(callback);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* FIXME: print internal error */
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!surface->pending_resource)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&surface->pending_resource, NULL);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct wl_callback_listener release_buffer_listener = {
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wayland_release_pending_resource
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_window_surface_handle_resize(struct wayland_surface *surface)
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_display *display = surface->display;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource *front_resource;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const enum native_attachment front_natt = NATIVE_ATTACHMENT_FRONT_LEFT;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   front_resource = resource_surface_get_single_resource(surface->rsurf,
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                         front_natt);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (resource_surface_set_size(surface->rsurf,
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 surface->win->width, surface->win->height)) {
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (surface->pending_resource)
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         wayland_roundtrip(display);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (front_resource) {
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct wl_callback *callback;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         surface->pending_resource = front_resource;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         front_resource = NULL;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         callback = wl_display_sync(display->dpy);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         wl_callback_add_listener(callback, &release_buffer_listener, surface);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         wl_proxy_set_queue((struct wl_proxy *) callback, display->queue);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < WL_BUFFER_COUNT; ++i) {
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (surface->buffer[i])
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            wl_buffer_destroy(surface->buffer[i]);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         surface->buffer[i] = NULL;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface->dx = surface->win->dx;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface->dy = surface->win->dy;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&front_resource, NULL);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_surface_validate(struct native_surface *nsurf, uint attachment_mask,
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int *seq_num, struct pipe_resource **textures,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         int *width, int *height)
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_surface *surface = wayland_surface(nsurf);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surface->type == WL_WINDOW_SURFACE)
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wayland_window_surface_handle_resize(surface);
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!resource_surface_add_resources(surface->rsurf, attachment_mask |
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       surface->attachment_mask))
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (textures)
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      resource_surface_get_resources(surface->rsurf, textures, attachment_mask);
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (seq_num)
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *seq_num = surface->sequence_number;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   resource_surface_get_size(surface->rsurf, (uint *) width, (uint *) height);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_frame_callback(void *data, struct wl_callback *callback, uint32_t time)
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_surface *surface = data;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->frame_callback = NULL;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wl_callback_destroy(callback);
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct wl_callback_listener frame_listener = {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wayland_frame_callback
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_buffers_swap(struct wl_buffer **buffer,
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     enum wayland_buffer_type buf1,
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     enum wayland_buffer_type buf2)
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wl_buffer *tmp = buffer[buf1];
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buffer[buf1] = buffer[buf2];
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buffer[buf2] = tmp;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_surface_swap_buffers(struct native_surface *nsurf)
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_surface *surface = wayland_surface(nsurf);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_display *display = surface->display;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ret = 0;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (surface->frame_callback && ret != -1)
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = wl_display_dispatch_queue(display->dpy, display->queue);
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret == -1)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->frame_callback = wl_surface_frame(surface->win->surface);
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wl_callback_add_listener(surface->frame_callback, &frame_listener, surface);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wl_proxy_set_queue((struct wl_proxy *) surface->frame_callback,
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      display->queue);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surface->type == WL_WINDOW_SURFACE) {
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      resource_surface_swap_buffers(surface->rsurf,
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    NATIVE_ATTACHMENT_FRONT_LEFT,
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wayland_buffers_swap(surface->buffer, WL_BUFFER_FRONT, WL_BUFFER_BACK);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (surface->buffer[WL_BUFFER_FRONT] == NULL)
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         surface->buffer[WL_BUFFER_FRONT] =
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            display->create_buffer(display, surface,
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   NATIVE_ATTACHMENT_FRONT_LEFT);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wl_surface_attach(surface->win->surface, surface->buffer[WL_BUFFER_FRONT],
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        surface->dx, surface->dy);
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      resource_surface_get_size(surface->rsurf,
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                (uint *) &surface->win->attached_width,
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                (uint *) &surface->win->attached_height);
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface->dx = 0;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface->dy = 0;
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->sequence_number++;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wayland_event_handler->invalid_surface(&display->base,
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          &surface->base,
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          surface->sequence_number);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_surface_present(struct native_surface *nsurf,
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const struct native_present_control *ctrl)
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_surface *surface = wayland_surface(nsurf);
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint width, height;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean ret;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctrl->preserve || ctrl->swap_interval)
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* force buffers to be re-created if they will be presented differently */
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surface->premultiplied_alpha != ctrl->premultiplied_alpha) {
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enum wayland_buffer_type buffer;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (buffer = 0; buffer < WL_BUFFER_COUNT; ++buffer) {
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (surface->buffer[buffer]) {
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            wl_buffer_destroy(surface->buffer[buffer]);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            surface->buffer[buffer] = NULL;
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface->premultiplied_alpha = ctrl->premultiplied_alpha;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (ctrl->natt) {
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NATIVE_ATTACHMENT_FRONT_LEFT:
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = TRUE;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NATIVE_ATTACHMENT_BACK_LEFT:
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = wayland_surface_swap_buffers(nsurf);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = FALSE;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surface->type == WL_WINDOW_SURFACE) {
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      resource_surface_get_size(surface->rsurf, &width, &height);
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wl_surface_damage(surface->win->surface, 0, 0, width, height);
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wl_surface_commit(surface->win->surface);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ret;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_surface_wait(struct native_surface *nsurf)
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* no-op */
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_surface_destroy(struct native_surface *nsurf)
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_surface *surface = wayland_surface(nsurf);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum wayland_buffer_type buffer;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (buffer = 0; buffer < WL_BUFFER_COUNT; ++buffer) {
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (surface->buffer[buffer])
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         wl_buffer_destroy(surface->buffer[buffer]);
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surface->frame_callback)
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wl_callback_destroy(surface->frame_callback);
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   resource_surface_destroy(surface->rsurf);
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(surface);
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct native_surface *
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwayland_create_window_surface(struct native_display *ndpy,
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              EGLNativeWindowType win,
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              const struct native_config *nconf)
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_display *display = wayland_display(ndpy);
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_config *config = wayland_config(nconf);
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_surface *surface;
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW |
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface = CALLOC_STRUCT(wayland_surface);
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!surface)
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->display = display;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->color_format = config->base.color_format;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->win = (struct wl_egl_window *) win;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->pending_resource = NULL;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->frame_callback = NULL;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->type = WL_WINDOW_SURFACE;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->buffer[WL_BUFFER_FRONT] = NULL;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->buffer[WL_BUFFER_BACK] = NULL;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->attachment_mask = (1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (1 << NATIVE_ATTACHMENT_BACK_LEFT);
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->rsurf = resource_surface_create(display->base.screen,
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            surface->color_format, bind);
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!surface->rsurf) {
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(surface);
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->base.destroy = wayland_surface_destroy;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->base.present = wayland_surface_present;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->base.validate = wayland_surface_validate;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surface->base.wait = wayland_surface_wait;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &surface->base;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct native_display *
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnative_create_display(void *dpy, boolean use_sw)
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wayland_display *display = NULL;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean own_dpy = FALSE;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   use_sw = use_sw || debug_get_bool_option("EGL_SOFTWARE", FALSE);
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dpy == NULL) {
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dpy = wl_display_connect(NULL);
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dpy == NULL)
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      own_dpy = TRUE;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (use_sw) {
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_INFO, "use software fallback");
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      display = wayland_create_shm_display((struct wl_display *) dpy,
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           wayland_event_handler);
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      display = wayland_create_drm_display((struct wl_display *) dpy,
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           wayland_event_handler);
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!display)
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   display->base.get_param = wayland_display_get_param;
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   display->base.get_configs = wayland_display_get_configs;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   display->base.create_window_surface = wayland_create_window_surface;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   display->own_dpy = own_dpy;
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &display->base;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct native_platform wayland_platform = {
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "wayland", /* name */
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   native_create_display
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct native_platform *
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnative_get_wayland_platform(const struct native_event_handler *event_handler)
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wayland_event_handler = event_handler;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &wayland_platform;
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vim: set sw=3 ts=8 sts=3 expandtab: */
463