native.h revision fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6
1/*
2 * Mesa 3-D graphics library
3 * Version:  7.8
4 *
5 * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org>
6 *
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:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25#ifndef _NATIVE_H_
26#define _NATIVE_H_
27
28#include "EGL/egl.h"  /* for EGL native types */
29#include "GL/gl.h" /* for GL types needed by __GLcontextModes */
30#include "GL/internal/glcore.h"  /* for __GLcontextModes */
31
32#include "pipe/p_compiler.h"
33#include "pipe/p_screen.h"
34#include "pipe/p_context.h"
35#include "pipe/p_state.h"
36
37#include "native_modeset.h"
38
39/**
40 * Only color buffers are listed.  The others are allocated privately through,
41 * for example, st_renderbuffer_alloc_storage().
42 */
43enum native_attachment {
44   NATIVE_ATTACHMENT_FRONT_LEFT,
45   NATIVE_ATTACHMENT_BACK_LEFT,
46   NATIVE_ATTACHMENT_FRONT_RIGHT,
47   NATIVE_ATTACHMENT_BACK_RIGHT,
48
49   NUM_NATIVE_ATTACHMENTS
50};
51
52enum native_param_type {
53   /*
54    * Return TRUE if window/pixmap surfaces use the buffers of the native
55    * types.
56    */
57   NATIVE_PARAM_USE_NATIVE_BUFFER
58};
59
60/**
61 * Enumerations for probe results.
62 */
63enum native_probe_result {
64   NATIVE_PROBE_UNKNOWN,
65   NATIVE_PROBE_FALLBACK,
66   NATIVE_PROBE_SUPPORTED,
67   NATIVE_PROBE_EXACT,
68};
69
70/**
71 * A probe object for display probe.
72 */
73struct native_probe {
74   int magic;
75   EGLNativeDisplayType display;
76   void *data;
77
78   void (*destroy)(struct native_probe *nprobe);
79};
80
81struct native_surface {
82   /**
83    * Available for caller's use.
84    */
85   void *user_data;
86
87   void (*destroy)(struct native_surface *nsurf);
88
89   /**
90    * Swap the front and back buffers so that the back buffer is visible.  It
91    * is no-op if the surface is single-buffered.  The contents of the back
92    * buffer after swapping may or may not be preserved.
93    */
94   boolean (*swap_buffers)(struct native_surface *nsurf);
95
96   /**
97    * Make the front buffer visible.  In some native displays, changes to the
98    * front buffer might not be visible immediately and require manual flush.
99    */
100   boolean (*flush_frontbuffer)(struct native_surface *nsurf);
101
102   /**
103    * Validate the buffers of the surface.  textures, if not NULL, points to an
104    * array of size NUM_NATIVE_ATTACHMENTS and the returned textures are owned
105    * by the caller.  A sequence number is also returned.  The caller can use
106    * it to check if anything has changed since the last call. Any of the
107    * pointers may be NULL and it indicates the caller has no interest in those
108    * values.
109    *
110    * If this function is called multiple times with different attachment
111    * masks, those not listed in the latest call might be destroyed.  This
112    * behavior might change in the future.
113    */
114   boolean (*validate)(struct native_surface *nsurf, uint attachment_mask,
115                       unsigned int *seq_num, struct pipe_texture **textures,
116                       int *width, int *height);
117
118   /**
119    * Wait until all native commands affecting the surface has been executed.
120    */
121   void (*wait)(struct native_surface *nsurf);
122};
123
124struct native_config {
125   /* __GLcontextModes should go away some day */
126   __GLcontextModes mode;
127   enum pipe_format color_format;
128   enum pipe_format depth_format;
129   enum pipe_format stencil_format;
130
131   /* treat it as an additional flag to mode.drawableType */
132   boolean scanout_bit;
133};
134
135/**
136 * A pipe winsys abstracts the OS.  A pipe screen abstracts the graphcis
137 * hardware.  A native display consists of a pipe winsys, a pipe screen, and
138 * the native display server.
139 */
140struct native_display {
141   /**
142    * The pipe screen of the native display.
143    *
144    * Note that the "flush_frontbuffer" and "update_buffer" callbacks will be
145    * overridden.
146    */
147   struct pipe_screen *screen;
148
149   /**
150    * Available for caller's use.
151    */
152   void *user_data;
153
154   void (*destroy)(struct native_display *ndpy);
155
156   /**
157    * Query the parameters of the native display.
158    *
159    * The return value is defined by the parameter.
160    */
161   int (*get_param)(struct native_display *ndpy,
162                    enum native_param_type param);
163
164   /**
165    * Get the supported configs.  The configs are owned by the display, but
166    * the returned array should be free()ed.
167    *
168    * The configs will be converted to EGL config by
169    * _eglConfigFromContextModesRec and validated by _eglValidateConfig.
170    * Those failing to pass the test will be skipped.
171    */
172   const struct native_config **(*get_configs)(struct native_display *ndpy,
173                                               int *num_configs);
174
175   /**
176    * Test if a pixmap is supported by the given config.  Required unless no
177    * config has GLX_PIXMAP_BIT set.
178    *
179    * This function is usually called to find a config that supports a given
180    * pixmap.  Thus, it is usually called with the same pixmap in a row.
181    */
182   boolean (*is_pixmap_supported)(struct native_display *ndpy,
183                                  EGLNativePixmapType pix,
184                                  const struct native_config *nconf);
185
186
187   /**
188    * Create a window surface.  Required unless no config has GLX_WINDOW_BIT
189    * set.
190    */
191   struct native_surface *(*create_window_surface)(struct native_display *ndpy,
192                                                   EGLNativeWindowType win,
193                                                   const struct native_config *nconf);
194
195   /**
196    * Create a pixmap surface.  Required unless no config has GLX_PIXMAP_BIT
197    * set.
198    */
199   struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy,
200                                                   EGLNativePixmapType pix,
201                                                   const struct native_config *nconf);
202
203   /**
204    * Create a pbuffer surface.  Required unless no config has GLX_PBUFFER_BIT
205    * set.
206    */
207   struct native_surface *(*create_pbuffer_surface)(struct native_display *ndpy,
208                                                    const struct native_config *nconf,
209                                                    uint width, uint height);
210
211   const struct native_display_modeset *modeset;
212};
213
214/**
215 * The handler for events that a native display may generate.  The events are
216 * generated asynchronously and the handler may be called by any thread at any
217 * time.
218 */
219struct native_event_handler {
220   /**
221    * This function is called when a surface needs to be validated.
222    */
223   void (*invalid_surface)(struct native_display *ndpy,
224                           struct native_surface *nsurf,
225                           unsigned int seq_num);
226};
227
228/**
229 * Test whether an attachment is set in the mask.
230 */
231static INLINE boolean
232native_attachment_mask_test(uint mask, enum native_attachment att)
233{
234   return !!(mask & (1 << att));
235}
236
237/**
238 * Return a probe object for the given display.
239 *
240 * Note that the returned object may be cached and used by different native
241 * display modules.  It allows fast probing when multiple modules probe the
242 * same display.
243 */
244struct native_probe *
245native_create_probe(EGLNativeDisplayType dpy);
246
247/**
248 * Probe the probe object.
249 */
250enum native_probe_result
251native_get_probe_result(struct native_probe *nprobe);
252
253const char *
254native_get_name(void);
255
256struct native_display *
257native_create_display(EGLNativeDisplayType dpy,
258                      struct native_event_handler *handler);
259
260#endif /* _NATIVE_H_ */
261