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