• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
3  * All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sub license, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the
14  * next paragraph) shall be included in all copies or substantial portions
15  * 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
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 
26 /**
27  * \file dri_util.h
28  * DRI utility functions definitions.
29  *
30  * This module acts as glue between GLX and the actual hardware driver.  A DRI
31  * driver doesn't really \e have to use any of this - it's optional.  But, some
32  * useful stuff is done here that otherwise would have to be duplicated in most
33  * drivers.
34  *
35  * Basically, these utility functions take care of some of the dirty details of
36  * screen initialization, context creation, context binding, DRM setup, etc.
37  *
38  * These functions are compiled into each DRI driver so libGL.so knows nothing
39  * about them.
40  *
41  * \sa dri_util.c.
42  *
43  * \author Kevin E. Martin <kevin@precisioninsight.com>
44  * \author Brian Paul <brian@precisioninsight.com>
45  */
46 
47 /**
48  * The following structs are shared between DRISW and DRI2, the DRISW structs
49  * are essentially base classes of the DRI2 structs. DRISW needs to compile on
50  * platforms without DRM, so keep the structs opaque to DRM.
51  */
52 
53 #ifndef _DRI_UTIL_H_
54 #define _DRI_UTIL_H_
55 
56 #include <GL/gl.h>
57 #include <GL/internal/dri_interface.h>
58 #include "main/mtypes.h"
59 #include "xmlconfig.h"
60 #include <stdbool.h>
61 
62 /**
63  * Extensions.
64  */
65 extern const __DRIcoreExtension driCoreExtension;
66 extern const __DRIswrastExtension driSWRastExtension;
67 extern const __DRIdri2Extension driDRI2Extension;
68 extern const __DRI2configQueryExtension dri2ConfigQueryExtension;
69 extern const __DRIcopySubBufferExtension driCopySubBufferExtension;
70 /**
71  * Driver callback functions.
72  *
73  * Each DRI driver must have one of these structures with all the pointers set
74  * to appropriate functions within the driver.
75  *
76  * When glXCreateContext() is called, for example, it'll call a helper function
77  * dri_util.c which in turn will jump through the \a CreateContext pointer in
78  * this structure.
79  */
80 struct __DriverAPIRec {
81     const __DRIconfig **(*InitScreen) (__DRIscreen * priv);
82 
83     void (*DestroyScreen)(__DRIscreen *driScrnPriv);
84 
85     GLboolean (*CreateContext)(gl_api api,
86                                const struct gl_config *glVis,
87                                __DRIcontext *driContextPriv,
88 			       unsigned major_version,
89 			       unsigned minor_version,
90 			       uint32_t flags,
91                                bool notify_reset,
92 			       unsigned *error,
93                                void *sharedContextPrivate);
94 
95     void (*DestroyContext)(__DRIcontext *driContextPriv);
96 
97     GLboolean (*CreateBuffer)(__DRIscreen *driScrnPriv,
98                               __DRIdrawable *driDrawPriv,
99                               const struct gl_config *glVis,
100                               GLboolean pixmapBuffer);
101 
102     void (*DestroyBuffer)(__DRIdrawable *driDrawPriv);
103 
104     void (*SwapBuffers)(__DRIdrawable *driDrawPriv);
105 
106     GLboolean (*MakeCurrent)(__DRIcontext *driContextPriv,
107                              __DRIdrawable *driDrawPriv,
108                              __DRIdrawable *driReadPriv);
109 
110     GLboolean (*UnbindContext)(__DRIcontext *driContextPriv);
111 
112     __DRIbuffer *(*AllocateBuffer) (__DRIscreen *screenPrivate,
113                                     unsigned int attachment,
114                                     unsigned int format,
115                                     int width, int height);
116 
117     void (*ReleaseBuffer) (__DRIscreen *screenPrivate, __DRIbuffer *buffer);
118 
119     void (*CopySubBuffer)(__DRIdrawable *driDrawPriv, int x, int y,
120                           int w, int h);
121 };
122 
123 extern const struct __DriverAPIRec driDriverAPI;
124 extern const struct __DriverAPIRec *globalDriverAPI;
125 
126 /**
127  * Per-screen private driver information.
128  */
129 struct __DRIscreenRec {
130     /**
131      * Driver-specific entrypoints provided by the driver's
132      * __DRIDriverVtableExtensionRec.
133      */
134     const struct __DriverAPIRec *driver;
135 
136     /**
137      * Current screen's number
138      */
139     int myNum;
140 
141     /**
142      * File descriptor returned when the kernel device driver is opened.
143      *
144      * Used to:
145      *   - authenticate client to kernel
146      *   - map the frame buffer, SAREA, etc.
147      *   - close the kernel device driver
148      */
149     int fd;
150 
151     /**
152      * Device-dependent private information (not stored in the SAREA).
153      *
154      * This pointer is never touched by the DRI layer.
155      */
156     void *driverPrivate;
157 
158     void *loaderPrivate;
159 
160     int max_gl_core_version;
161     int max_gl_compat_version;
162     int max_gl_es1_version;
163     int max_gl_es2_version;
164 
165     const __DRIextension **extensions;
166 
167     const __DRIswrastLoaderExtension *swrast_loader;
168 
169     struct {
170 	/* Flag to indicate that this is a DRI2 screen.  Many of the above
171 	 * fields will not be valid or initializaed in that case. */
172 	const __DRIdri2LoaderExtension *loader;
173 	const __DRIimageLookupExtension *image;
174 	const __DRIuseInvalidateExtension *useInvalidate;
175     } dri2;
176 
177     struct {
178         const __DRIimageLoaderExtension *loader;
179     } image;
180 
181     driOptionCache optionInfo;
182     driOptionCache optionCache;
183 
184     unsigned int api_mask;
185 };
186 
187 /**
188  * Per-context private driver information.
189  */
190 struct __DRIcontextRec {
191     /**
192      * Device driver's private context data.  This structure is opaque.
193      */
194     void *driverPrivate;
195 
196     /**
197      * The loaders's private context data.  This structure is opaque.
198      */
199     void *loaderPrivate;
200 
201     /**
202      * Pointer to drawable currently bound to this context for drawing.
203      */
204     __DRIdrawable *driDrawablePriv;
205 
206     /**
207      * Pointer to drawable currently bound to this context for reading.
208      */
209     __DRIdrawable *driReadablePriv;
210 
211     /**
212      * Pointer to screen on which this context was created.
213      */
214     __DRIscreen *driScreenPriv;
215 
216     struct {
217 	int draw_stamp;
218 	int read_stamp;
219     } dri2;
220 };
221 
222 /**
223  * Per-drawable private DRI driver information.
224  */
225 struct __DRIdrawableRec {
226     /**
227      * Driver's private drawable information.
228      *
229      * This structure is opaque.
230      */
231     void *driverPrivate;
232 
233     /**
234      * Private data from the loader.  We just hold on to it and pass
235      * it back when calling into loader provided functions.
236      */
237     void *loaderPrivate;
238 
239     /**
240      * Pointer to context to which this drawable is currently bound.
241      */
242     __DRIcontext *driContextPriv;
243 
244     /**
245      * Pointer to screen on which this drawable was created.
246      */
247     __DRIscreen *driScreenPriv;
248 
249     /**
250      * Reference count for number of context's currently bound to this
251      * drawable.
252      *
253      * Once it reaches zero, the drawable can be destroyed.
254      *
255      * \note This behavior will change with GLX 1.3.
256      */
257     int refcount;
258 
259     /**
260      * Last value of the stamp.
261      *
262      * If this differs from the value stored at __DRIdrawable::dri2.stamp,
263      * then the drawable information has been modified by the X server, and the
264      * drawable information (below) should be retrieved from the X server.
265      */
266     unsigned int lastStamp;
267 
268     int w, h;
269 
270     /**
271      * Drawable timestamp.  Increased when the loader calls invalidate.
272      */
273     struct {
274 	unsigned int stamp;
275     } dri2;
276 };
277 
278 extern uint32_t
279 driGLFormatToImageFormat(mesa_format format);
280 
281 extern mesa_format
282 driImageFormatToGLFormat(uint32_t image_format);
283 
284 extern void
285 dri2InvalidateDrawable(__DRIdrawable *drawable);
286 
287 extern void
288 driUpdateFramebufferSize(struct gl_context *ctx, const __DRIdrawable *dPriv);
289 
290 extern void
291 driContextSetFlags(struct gl_context *ctx, uint32_t flags);
292 
293 extern const __DRIimageDriverExtension driImageDriverExtension;
294 
295 #endif /* _DRI_UTIL_H_ */
296