1 /*
2  * Cogl
3  *
4  * A Low Level GPU Graphics and Utilities API
5  *
6  * Copyright (C) 2012 Intel Corporation.
7  *
8  * Permission is hereby granted, free of charge, to any person
9  * obtaining a copy of this software and associated documentation
10  * files (the "Software"), to deal in the Software without
11  * restriction, including without limitation the rights to use, copy,
12  * modify, merge, publish, distribute, sublicense, and/or sell copies
13  * of the Software, and to permit persons to whom the Software is
14  * furnished to do so, subject to the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be
17  * included in all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
23  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
24  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26  * SOFTWARE.
27  *
28  */
29 
30 #ifndef __COGL_WAYLAND_SERVER_H
31 #define __COGL_WAYLAND_SERVER_H
32 
33 #include <wayland-server.h>
34 
35 /* NB: this is a top-level header that can be included directly but we
36  * want to be careful not to define __COGL_H_INSIDE__ when this is
37  * included internally while building Cogl itself since
38  * __COGL_H_INSIDE__ is used in headers to guard public vs private api
39  * definitions
40  */
41 #ifndef COGL_COMPILATION
42 
43 /* Note: When building Cogl .gir we explicitly define
44  * __COGL_H_INSIDE__ */
45 #ifndef __COGL_H_INSIDE__
46 #define __COGL_H_INSIDE__
47 #define __COGL_MUST_UNDEF_COGL_H_INSIDE_COGL_WAYLAND_SERVER_
48 #endif
49 
50 #endif /* COGL_COMPILATION */
51 
52 #include <cogl/cogl-context.h>
53 #include <cogl/cogl-texture-2d.h>
54 
55 COGL_BEGIN_DECLS
56 
57 /**
58  * cogl_wayland_display_set_compositor_display:
59  * @display: a #CoglDisplay
60  * @wayland_display: A compositor's Wayland display pointer
61  *
62  * Informs Cogl of a compositor's Wayland display pointer. This
63  * enables Cogl to register private wayland extensions required to
64  * pass buffers between the clients and compositor.
65  *
66  * Since: 1.10
67  * Stability: unstable
68  */
69 void
70 cogl_wayland_display_set_compositor_display (CoglDisplay *display,
71                                           struct wl_display *wayland_display);
72 
73 /**
74  * cogl_wayland_texture_2d_new_from_buffer:
75  * @ctx: A #CoglContext
76  * @buffer: A Wayland resource for a buffer
77  * @error: A #CoglError for exceptions
78  *
79  * Uploads the @buffer referenced by the given Wayland resource to a
80  * #CoglTexture2D. The buffer resource may refer to a wl_buffer or a
81  * wl_shm_buffer.
82  *
83  * <note>The results are undefined for passing an invalid @buffer
84  * pointer</note>
85  * <note>It is undefined if future updates to @buffer outside the
86  * control of Cogl will affect the allocated #CoglTexture2D. In some
87  * cases the contents of the buffer are copied (such as shm buffers),
88  * and in other cases the underlying storage is re-used directly (such
89  * as drm buffers)</note>
90  *
91  * Returns: A newly allocated #CoglTexture2D, or if Cogl could not
92  *          validate the @buffer in some way (perhaps because of
93  *          an unsupported format) it will return %NULL and set
94  *          @error.
95  *
96  * Since: 1.10
97  * Stability: unstable
98  */
99 CoglTexture2D *
100 cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx,
101                                          struct wl_resource *buffer,
102                                          CoglError **error);
103 
104 /**
105  * cogl_wayland_texture_set_region_from_shm_buffer:
106  * @texture: a #CoglTexture
107  * @width: The width of the region to copy
108  * @height: The height of the region to copy
109  * @shm_buffer: The source buffer
110  * @src_x: The X offset within the source bufer to copy from
111  * @src_y: The Y offset within the source bufer to copy from
112  * @dst_x: The X offset within the texture to copy to
113  * @dst_y: The Y offset within the texture to copy to
114  * @level: The mipmap level of the texture to copy to
115  * @error: A #CoglError to return exceptional errors
116  *
117  * Sets the pixels in a rectangular subregion of @texture from a
118  * Wayland SHM buffer. Generally this would be used in response to
119  * wl_surface.damage event in a compositor in order to update the
120  * texture with the damaged region. This is just a convenience wrapper
121  * around getting the SHM buffer pointer and calling
122  * cogl_texture_set_region(). See that function for a description of
123  * the level parameter.
124  *
125  * <note>Since the storage for a #CoglTexture is allocated lazily then
126  * if the given @texture has not previously been allocated then this
127  * api can return %FALSE and throw an exceptional @error if there is
128  * not enough memory to allocate storage for @texture.</note>
129  *
130  * Return value: %TRUE if the subregion upload was successful, and
131  *   %FALSE otherwise
132  * Since: 1.18
133  * Stability: unstable
134  */
135 CoglBool
136 cogl_wayland_texture_set_region_from_shm_buffer (CoglTexture *texture,
137                                                  int src_x,
138                                                  int src_y,
139                                                  int width,
140                                                  int height,
141                                                  struct wl_shm_buffer *
142                                                    shm_buffer,
143                                                  int dst_x,
144                                                  int dst_y,
145                                                  int level,
146                                                  CoglError **error);
147 
148 COGL_END_DECLS
149 
150 /* The gobject introspection scanner seems to parse public headers in
151  * isolation which means we need to be extra careful about how we
152  * define and undefine __COGL_H_INSIDE__ used to detect when internal
153  * headers are incorrectly included by developers. In the gobject
154  * introspection case we have to manually define __COGL_H_INSIDE__ as
155  * a commandline argument for the scanner which means we must be
156  * careful not to undefine it in a header...
157  */
158 #ifdef __COGL_MUST_UNDEF_COGL_H_INSIDE_COGL_WAYLAND_SERVER_
159 #undef __COGL_H_INSIDE__
160 #undef __COGL_MUST_UNDEF_COGL_H_INSIDE_COGL_WAYLAND_SERVER_
161 #endif
162 
163 #endif /* __COGL_WAYLAND_SERVER_H */
164