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