2 * Mesa 3-D graphics library
5 * Copyright (C) 2011 Benjamin Franzke <benjaminfranzke@googlemail.com>
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
26 #include "util/u_memory.h"
27 #include "util/u_inlines.h"
29 #include "pipe/p_compiler.h"
30 #include "pipe/p_screen.h"
31 #include "pipe/p_context.h"
32 #include "pipe/p_state.h"
34 #include "sw/wayland/wayland_sw_winsys.h"
38 #include "native_wayland.h"
40 #include <wayland-client.h>
41 #include "wayland-egl-priv.h"
43 #include <sys/types.h>
47 struct wayland_shm_display
{
48 struct wayland_display base
;
50 const struct native_event_handler
*event_handler
;
51 struct wl_shm
*wl_shm
;
54 static INLINE
struct wayland_shm_display
*
55 wayland_shm_display(const struct native_display
*ndpy
)
57 return (struct wayland_shm_display
*) ndpy
;
62 wayland_shm_display_destroy(struct native_display
*ndpy
)
64 struct wayland_shm_display
*shmdpy
= wayland_shm_display(ndpy
);
66 if (shmdpy
->base
.configs
)
67 FREE(shmdpy
->base
.configs
);
68 if (shmdpy
->base
.own_dpy
)
69 wl_display_destroy(shmdpy
->base
.dpy
);
76 static struct wl_buffer
*
77 wayland_create_shm_buffer(struct wayland_display
*display
,
78 struct wayland_surface
*surface
,
79 enum native_attachment attachment
)
81 struct wayland_shm_display
*shmdpy
= (struct wayland_shm_display
*) display
;
82 struct pipe_screen
*screen
= shmdpy
->base
.base
.screen
;
83 struct pipe_resource
*resource
;
84 struct winsys_handle wsh
;
86 enum wl_shm_format format
;
88 resource
= resource_surface_get_single_resource(surface
->rsurf
, attachment
);
89 resource_surface_get_size(surface
->rsurf
, &width
, &height
);
91 screen
->resource_get_handle(screen
, resource
, &wsh
);
93 pipe_resource_reference(&resource
, NULL
);
95 switch (surface
->color_format
) {
96 case PIPE_FORMAT_B8G8R8A8_UNORM
:
97 format
= (surface
->premultiplied_alpha
) ?
98 WL_SHM_FORMAT_PREMULTIPLIED_ARGB32
: WL_SHM_FORMAT_ARGB32
;
100 case PIPE_FORMAT_B8G8R8X8_UNORM
:
101 format
= WL_SHM_FORMAT_XRGB32
;
108 return wl_shm_create_buffer(shmdpy
->wl_shm
, wsh
.fd
,
114 shm_handle_format(void *data
, struct wl_shm
*shm
, uint32_t format
)
116 struct wayland_shm_display
*shmdpy
= data
;
119 case WL_SHM_FORMAT_ARGB32
:
120 shmdpy
->base
.formats
|= HAS_ARGB8888
;
122 case WL_SHM_FORMAT_XRGB8888
:
123 shmdpy
->base
.formats
|= HAS_XRGB8888
;
128 static const struct wl_shm_listener shm_listener
= {
133 wayland_shm_display_init_screen(struct native_display
*ndpy
)
135 struct wayland_shm_display
*shmdpy
= wayland_shm_display(ndpy
);
136 struct sw_winsys
*winsys
= NULL
;
139 id
= wl_display_get_global(shmdpy
->base
.dpy
, "wl_shm", 1);
141 wl_display_iterate(shmdpy
->base
.dpy
, WL_DISPLAY_READABLE
);
142 id
= wl_display_get_global(shmdpy
->base
.dpy
, "wl_shm", 1);
146 shmdpy
->wl_shm
= wl_display_bind(shmdpy
->base
.dpy
, id
, &wl_shm_interface
);
150 wl_shm_add_listener(shmdpy
->wl_shm
, &shm_listener
, shmdpy
);
152 if (shmdpy
->base
.formats
== 0)
153 wl_display_roundtrip(shmdpy
->base
.dpy
);
154 if (shmdpy
->base
.formats
== 0)
157 winsys
= wayland_create_sw_winsys(shmdpy
->base
.dpy
);
161 shmdpy
->base
.base
.screen
=
162 shmdpy
->event_handler
->new_sw_screen(&shmdpy
->base
.base
, winsys
);
164 if (!shmdpy
->base
.base
.screen
) {
165 _eglLog(_EGL_WARNING
, "failed to create shm screen");
172 struct wayland_display
*
173 wayland_create_shm_display(struct wl_display
*dpy
,
174 const struct native_event_handler
*event_handler
)
176 struct wayland_shm_display
*shmdpy
;
178 shmdpy
= CALLOC_STRUCT(wayland_shm_display
);
182 shmdpy
->event_handler
= event_handler
;
184 shmdpy
->base
.dpy
= dpy
;
185 if (!shmdpy
->base
.dpy
) {
186 wayland_shm_display_destroy(&shmdpy
->base
.base
);
190 shmdpy
->base
.base
.init_screen
= wayland_shm_display_init_screen
;
191 shmdpy
->base
.base
.destroy
= wayland_shm_display_destroy
;
192 shmdpy
->base
.create_buffer
= wayland_create_shm_buffer
;
194 return &shmdpy
->base
;
197 /* vim: set sw=3 ts=8 sts=3 expandtab: */