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 /* assume premultiplied */
98 format
= WL_SHM_FORMAT_PREMULTIPLIED_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_ARGB32
;
122 case WL_SHM_FORMAT_PREMULTIPLIED_ARGB32
:
123 shmdpy
->base
.formats
|= HAS_PREMUL_ARGB32
;
125 case WL_SHM_FORMAT_XRGB32
:
126 shmdpy
->base
.formats
|= HAS_XRGB32
;
131 static const struct wl_shm_listener shm_listener
= {
136 wayland_shm_display_init_screen(struct native_display
*ndpy
)
138 struct wayland_shm_display
*shmdpy
= wayland_shm_display(ndpy
);
139 struct sw_winsys
*winsys
= NULL
;
142 id
= wl_display_get_global(shmdpy
->base
.dpy
, "wl_shm", 1);
144 wl_display_iterate(shmdpy
->base
.dpy
, WL_DISPLAY_READABLE
);
145 id
= wl_display_get_global(shmdpy
->base
.dpy
, "wl_shm", 1);
149 shmdpy
->wl_shm
= wl_display_bind(shmdpy
->base
.dpy
, id
, &wl_shm_interface
);
153 wl_shm_add_listener(shmdpy
->wl_shm
, &shm_listener
, shmdpy
);
155 if (shmdpy
->base
.formats
== 0)
156 wl_display_roundtrip(shmdpy
->base
.dpy
);
157 if (shmdpy
->base
.formats
== 0)
160 winsys
= wayland_create_sw_winsys(shmdpy
->base
.dpy
);
164 shmdpy
->base
.base
.screen
=
165 shmdpy
->event_handler
->new_sw_screen(&shmdpy
->base
.base
, winsys
);
167 if (!shmdpy
->base
.base
.screen
) {
168 _eglLog(_EGL_WARNING
, "failed to create shm screen");
175 struct wayland_display
*
176 wayland_create_shm_display(struct wl_display
*dpy
,
177 const struct native_event_handler
*event_handler
)
179 struct wayland_shm_display
*shmdpy
;
181 shmdpy
= CALLOC_STRUCT(wayland_shm_display
);
185 shmdpy
->event_handler
= event_handler
;
187 shmdpy
->base
.dpy
= dpy
;
188 if (!shmdpy
->base
.dpy
) {
189 wayland_shm_display_destroy(&shmdpy
->base
.base
);
193 shmdpy
->base
.base
.init_screen
= wayland_shm_display_init_screen
;
194 shmdpy
->base
.base
.destroy
= wayland_shm_display_destroy
;
195 shmdpy
->base
.create_buffer
= wayland_create_shm_buffer
;
197 return &shmdpy
->base
;
200 /* vim: set sw=3 ts=8 sts=3 expandtab: */