dri_interface.h revision 01e04c3f
1/*
2 * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
3 * Copyright 2007-2008 Red Hat, Inc.
4 * (C) Copyright IBM Corporation 2004
5 * All Rights Reserved.
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 * on the rights to use, copy, modify, merge, publish, distribute, sub
11 * license, and/or sell copies of the Software, and to permit persons to whom
12 * the Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
16 * Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27/**
28 * \file dri_interface.h
29 *
30 * This file contains all the types and functions that define the interface
31 * between a DRI driver and driver loader.  Currently, the most common driver
32 * loader is the XFree86 libGL.so.  However, other loaders do exist, and in
33 * the future the server-side libglx.a will also be a loader.
34 *
35 * \author Kevin E. Martin <kevin@precisioninsight.com>
36 * \author Ian Romanick <idr@us.ibm.com>
37 * \author Kristian Høgsberg <krh@redhat.com>
38 */
39
40#ifndef DRI_INTERFACE_H
41#define DRI_INTERFACE_H
42
43#ifdef HAVE_LIBDRM
44#include <drm.h>
45#else
46typedef unsigned int drm_context_t;
47typedef unsigned int drm_drawable_t;
48typedef struct drm_clip_rect drm_clip_rect_t;
49#endif
50
51#include <stdint.h>
52
53/**
54 * \name DRI interface structures
55 *
56 * The following structures define the interface between the GLX client
57 * side library and the DRI (direct rendering infrastructure).
58 */
59/*@{*/
60typedef struct __DRIdisplayRec		__DRIdisplay;
61typedef struct __DRIscreenRec		__DRIscreen;
62typedef struct __DRIcontextRec		__DRIcontext;
63typedef struct __DRIdrawableRec		__DRIdrawable;
64typedef struct __DRIconfigRec		__DRIconfig;
65typedef struct __DRIframebufferRec	__DRIframebuffer;
66typedef struct __DRIversionRec		__DRIversion;
67
68typedef struct __DRIcoreExtensionRec		__DRIcoreExtension;
69typedef struct __DRIextensionRec		__DRIextension;
70typedef struct __DRIcopySubBufferExtensionRec	__DRIcopySubBufferExtension;
71typedef struct __DRIswapControlExtensionRec	__DRIswapControlExtension;
72typedef struct __DRIframeTrackingExtensionRec	__DRIframeTrackingExtension;
73typedef struct __DRImediaStreamCounterExtensionRec	__DRImediaStreamCounterExtension;
74typedef struct __DRItexOffsetExtensionRec	__DRItexOffsetExtension;
75typedef struct __DRItexBufferExtensionRec	__DRItexBufferExtension;
76typedef struct __DRIlegacyExtensionRec		__DRIlegacyExtension;
77typedef struct __DRIswrastExtensionRec		__DRIswrastExtension;
78typedef struct __DRIbufferRec			__DRIbuffer;
79typedef struct __DRIdri2ExtensionRec		__DRIdri2Extension;
80typedef struct __DRIdri2LoaderExtensionRec	__DRIdri2LoaderExtension;
81typedef struct __DRI2flushExtensionRec	__DRI2flushExtension;
82typedef struct __DRI2throttleExtensionRec	__DRI2throttleExtension;
83typedef struct __DRI2fenceExtensionRec          __DRI2fenceExtension;
84typedef struct __DRI2interopExtensionRec	__DRI2interopExtension;
85typedef struct __DRI2blobExtensionRec           __DRI2blobExtension;
86
87typedef struct __DRIimageLoaderExtensionRec     __DRIimageLoaderExtension;
88typedef struct __DRIimageDriverExtensionRec     __DRIimageDriverExtension;
89
90/*@}*/
91
92
93/**
94 * Extension struct.  Drivers 'inherit' from this struct by embedding
95 * it as the first element in the extension struct.
96 *
97 * We never break API in for a DRI extension.  If we need to change
98 * the way things work in a non-backwards compatible manner, we
99 * introduce a new extension.  During a transition period, we can
100 * leave both the old and the new extension in the driver, which
101 * allows us to move to the new interface without having to update the
102 * loader(s) in lock step.
103 *
104 * However, we can add entry points to an extension over time as long
105 * as we don't break the old ones.  As we add entry points to an
106 * extension, we increase the version number.  The corresponding
107 * #define can be used to guard code that accesses the new entry
108 * points at compile time and the version field in the extension
109 * struct can be used at run-time to determine how to use the
110 * extension.
111 */
112struct __DRIextensionRec {
113    const char *name;
114    int version;
115};
116
117/**
118 * The first set of extension are the screen extensions, returned by
119 * __DRIcore::getExtensions().  This entry point will return a list of
120 * extensions and the loader can use the ones it knows about by
121 * casting them to more specific extensions and advertising any GLX
122 * extensions the DRI extensions enables.
123 */
124
125/**
126 * Used by drivers to indicate support for setting the read drawable.
127 */
128#define __DRI_READ_DRAWABLE "DRI_ReadDrawable"
129#define __DRI_READ_DRAWABLE_VERSION 1
130
131/**
132 * Used by drivers that implement the GLX_MESA_copy_sub_buffer extension.
133 */
134#define __DRI_COPY_SUB_BUFFER "DRI_CopySubBuffer"
135#define __DRI_COPY_SUB_BUFFER_VERSION 1
136struct __DRIcopySubBufferExtensionRec {
137    __DRIextension base;
138    void (*copySubBuffer)(__DRIdrawable *drawable, int x, int y, int w, int h);
139};
140
141/**
142 * Used by drivers that implement the GLX_SGI_swap_control or
143 * GLX_MESA_swap_control extension.
144 */
145#define __DRI_SWAP_CONTROL "DRI_SwapControl"
146#define __DRI_SWAP_CONTROL_VERSION 1
147struct __DRIswapControlExtensionRec {
148    __DRIextension base;
149    void (*setSwapInterval)(__DRIdrawable *drawable, unsigned int inteval);
150    unsigned int (*getSwapInterval)(__DRIdrawable *drawable);
151};
152
153/**
154 * Used by drivers that implement the GLX_MESA_swap_frame_usage extension.
155 */
156#define __DRI_FRAME_TRACKING "DRI_FrameTracking"
157#define __DRI_FRAME_TRACKING_VERSION 1
158struct __DRIframeTrackingExtensionRec {
159    __DRIextension base;
160
161    /**
162     * Enable or disable frame usage tracking.
163     *
164     * \since Internal API version 20030317.
165     */
166    int (*frameTracking)(__DRIdrawable *drawable, GLboolean enable);
167
168    /**
169     * Retrieve frame usage information.
170     *
171     * \since Internal API version 20030317.
172     */
173    int (*queryFrameTracking)(__DRIdrawable *drawable,
174			      int64_t * sbc, int64_t * missedFrames,
175			      float * lastMissedUsage, float * usage);
176};
177
178
179/**
180 * Used by drivers that implement the GLX_SGI_video_sync extension.
181 */
182#define __DRI_MEDIA_STREAM_COUNTER "DRI_MediaStreamCounter"
183#define __DRI_MEDIA_STREAM_COUNTER_VERSION 1
184struct __DRImediaStreamCounterExtensionRec {
185    __DRIextension base;
186
187    /**
188     * Wait for the MSC to equal target_msc, or, if that has already passed,
189     * the next time (MSC % divisor) is equal to remainder.  If divisor is
190     * zero, the function will return as soon as MSC is greater than or equal
191     * to target_msc.
192     */
193    int (*waitForMSC)(__DRIdrawable *drawable,
194		      int64_t target_msc, int64_t divisor, int64_t remainder,
195		      int64_t * msc, int64_t * sbc);
196
197    /**
198     * Get the number of vertical refreshes since some point in time before
199     * this function was first called (i.e., system start up).
200     */
201    int (*getDrawableMSC)(__DRIscreen *screen, __DRIdrawable *drawable,
202			  int64_t *msc);
203};
204
205
206#define __DRI_TEX_OFFSET "DRI_TexOffset"
207#define __DRI_TEX_OFFSET_VERSION 1
208struct __DRItexOffsetExtensionRec {
209    __DRIextension base;
210
211    /**
212     * Method to override base texture image with a driver specific 'offset'.
213     * The depth passed in allows e.g. to ignore the alpha channel of texture
214     * images where the non-alpha components don't occupy a whole texel.
215     *
216     * For GLX_EXT_texture_from_pixmap with AIGLX.
217     */
218    void (*setTexOffset)(__DRIcontext *pDRICtx, GLint texname,
219			 unsigned long long offset, GLint depth, GLuint pitch);
220};
221
222
223/* Valid values for format in the setTexBuffer2 function below.  These
224 * values match the GLX tokens for compatibility reasons, but we
225 * define them here since the DRI interface can't depend on GLX. */
226#define __DRI_TEXTURE_FORMAT_NONE        0x20D8
227#define __DRI_TEXTURE_FORMAT_RGB         0x20D9
228#define __DRI_TEXTURE_FORMAT_RGBA        0x20DA
229
230#define __DRI_TEX_BUFFER "DRI_TexBuffer"
231#define __DRI_TEX_BUFFER_VERSION 3
232struct __DRItexBufferExtensionRec {
233    __DRIextension base;
234
235    /**
236     * Method to override base texture image with the contents of a
237     * __DRIdrawable.
238     *
239     * For GLX_EXT_texture_from_pixmap with AIGLX.  Deprecated in favor of
240     * setTexBuffer2 in version 2 of this interface
241     */
242    void (*setTexBuffer)(__DRIcontext *pDRICtx,
243			 GLint target,
244			 __DRIdrawable *pDraw);
245
246    /**
247     * Method to override base texture image with the contents of a
248     * __DRIdrawable, including the required texture format attribute.
249     *
250     * For GLX_EXT_texture_from_pixmap with AIGLX.
251     *
252     * \since 2
253     */
254    void (*setTexBuffer2)(__DRIcontext *pDRICtx,
255			  GLint target,
256			  GLint format,
257			  __DRIdrawable *pDraw);
258    /**
259     * Method to release texture buffer in case some special platform
260     * need this.
261     *
262     * For GLX_EXT_texture_from_pixmap with AIGLX.
263     *
264     * \since 3
265     */
266    void (*releaseTexBuffer)(__DRIcontext *pDRICtx,
267			GLint target,
268			__DRIdrawable *pDraw);
269};
270
271/**
272 * Used by drivers that implement DRI2
273 */
274#define __DRI2_FLUSH "DRI2_Flush"
275#define __DRI2_FLUSH_VERSION 4
276
277#define __DRI2_FLUSH_DRAWABLE (1 << 0) /* the drawable should be flushed. */
278#define __DRI2_FLUSH_CONTEXT  (1 << 1) /* glFlush should be called */
279#define __DRI2_FLUSH_INVALIDATE_ANCILLARY (1 << 2)
280
281enum __DRI2throttleReason {
282   __DRI2_THROTTLE_SWAPBUFFER,
283   __DRI2_THROTTLE_COPYSUBBUFFER,
284   __DRI2_THROTTLE_FLUSHFRONT
285};
286
287struct __DRI2flushExtensionRec {
288    __DRIextension base;
289    void (*flush)(__DRIdrawable *drawable);
290
291    /**
292     * Ask the driver to call getBuffers/getBuffersWithFormat before
293     * it starts rendering again.
294     *
295     * \param drawable the drawable to invalidate
296     *
297     * \since 3
298     */
299    void (*invalidate)(__DRIdrawable *drawable);
300
301    /**
302     * This function reduces the number of flushes in the driver by combining
303     * several operations into one call.
304     *
305     * It can:
306     * - throttle
307     * - flush a drawable
308     * - flush a context
309     *
310     * \param context           the context
311     * \param drawable          the drawable to flush
312     * \param flags             a combination of _DRI2_FLUSH_xxx flags
313     * \param throttle_reason   the reason for throttling, 0 = no throttling
314     *
315     * \since 4
316     */
317    void (*flush_with_flags)(__DRIcontext *ctx,
318                             __DRIdrawable *drawable,
319                             unsigned flags,
320                             enum __DRI2throttleReason throttle_reason);
321};
322
323
324/**
325 * Extension that the driver uses to request
326 * throttle callbacks.
327 */
328
329#define __DRI2_THROTTLE "DRI2_Throttle"
330#define __DRI2_THROTTLE_VERSION 1
331
332struct __DRI2throttleExtensionRec {
333   __DRIextension base;
334   void (*throttle)(__DRIcontext *ctx,
335		    __DRIdrawable *drawable,
336		    enum __DRI2throttleReason reason);
337};
338
339/**
340 * Extension for EGL_ANDROID_blob_cache
341 */
342
343#define __DRI2_BLOB "DRI2_Blob"
344#define __DRI2_BLOB_VERSION 1
345
346typedef void
347(*__DRIblobCacheSet) (const void *key, signed long keySize,
348                      const void *value, signed long valueSize);
349
350typedef signed long
351(*__DRIblobCacheGet) (const void *key, signed long keySize,
352                      void *value, signed long valueSize);
353
354struct __DRI2blobExtensionRec {
355   __DRIextension base;
356
357   /**
358    * Set cache functions for setting and getting cache entries.
359    */
360   void (*set_cache_funcs) (__DRIscreen *screen,
361                            __DRIblobCacheSet set, __DRIblobCacheGet get);
362};
363
364/**
365 * Extension for fences / synchronization objects.
366 */
367
368#define __DRI2_FENCE "DRI2_Fence"
369#define __DRI2_FENCE_VERSION 2
370
371#define __DRI2_FENCE_TIMEOUT_INFINITE     0xffffffffffffffffull
372
373#define __DRI2_FENCE_FLAG_FLUSH_COMMANDS  (1 << 0)
374
375/**
376 * \name Capabilities that might be returned by __DRI2fenceExtensionRec::get_capabilities
377 */
378/*@{*/
379#define __DRI_FENCE_CAP_NATIVE_FD 1
380/*@}*/
381
382struct __DRI2fenceExtensionRec {
383   __DRIextension base;
384
385   /**
386    * Create and insert a fence into the command stream of the context.
387    */
388   void *(*create_fence)(__DRIcontext *ctx);
389
390   /**
391    * Get a fence associated with the OpenCL event object.
392    * This can be NULL, meaning that OpenCL interoperability is not supported.
393    */
394   void *(*get_fence_from_cl_event)(__DRIscreen *screen, intptr_t cl_event);
395
396   /**
397    * Destroy a fence.
398    */
399   void (*destroy_fence)(__DRIscreen *screen, void *fence);
400
401   /**
402    * This function waits and doesn't return until the fence is signalled
403    * or the timeout expires. It returns true if the fence has been signaled.
404    *
405    * \param ctx     the context where commands are flushed
406    * \param fence   the fence
407    * \param flags   a combination of __DRI2_FENCE_FLAG_xxx flags
408    * \param timeout the timeout in ns or __DRI2_FENCE_TIMEOUT_INFINITE
409    */
410   GLboolean (*client_wait_sync)(__DRIcontext *ctx, void *fence,
411                                 unsigned flags, uint64_t timeout);
412
413   /**
414    * This function enqueues a wait command into the command stream of
415    * the context and then returns. When the execution reaches the wait
416    * command, no further execution will be done in the context until
417    * the fence is signaled. This is a no-op if the device doesn't support
418    * parallel execution of contexts.
419    *
420    * \param ctx     the context where the waiting is done
421    * \param fence   the fence
422    * \param flags   a combination of __DRI2_FENCE_FLAG_xxx flags that make
423    *                sense with this function (right now there are none)
424    */
425   void (*server_wait_sync)(__DRIcontext *ctx, void *fence, unsigned flags);
426
427   /**
428    * Query for general capabilities of the driver that concern fences.
429    * Returns a bitmask of __DRI_FENCE_CAP_x
430    *
431    * \since 2
432    */
433   unsigned (*get_capabilities)(__DRIscreen *screen);
434
435   /**
436    * Create an fd (file descriptor) associated fence.  If the fence fd
437    * is -1, this behaves similarly to create_fence() except that when
438    * rendering is flushed the driver creates a fence fd.  Otherwise,
439    * the driver wraps an existing fence fd.
440    *
441    * This is used to implement the EGL_ANDROID_native_fence_sync extension.
442    *
443    * \since 2
444    *
445    * \param ctx     the context associated with the fence
446    * \param fd      the fence fd or -1
447    */
448   void *(*create_fence_fd)(__DRIcontext *ctx, int fd);
449
450   /**
451    * For fences created with create_fence_fd(), after rendering is flushed,
452    * this retrieves the native fence fd.  Caller takes ownership of the
453    * fd and will close() it when it is no longer needed.
454    *
455    * \since 2
456    *
457    * \param screen  the screen associated with the fence
458    * \param fence   the fence
459    */
460   int (*get_fence_fd)(__DRIscreen *screen, void *fence);
461};
462
463
464/**
465 * Extension for API interop.
466 * See GL/mesa_glinterop.h.
467 */
468
469#define __DRI2_INTEROP "DRI2_Interop"
470#define __DRI2_INTEROP_VERSION 1
471
472struct mesa_glinterop_device_info;
473struct mesa_glinterop_export_in;
474struct mesa_glinterop_export_out;
475
476struct __DRI2interopExtensionRec {
477   __DRIextension base;
478
479   /** Same as MesaGLInterop*QueryDeviceInfo. */
480   int (*query_device_info)(__DRIcontext *ctx,
481                            struct mesa_glinterop_device_info *out);
482
483   /** Same as MesaGLInterop*ExportObject. */
484   int (*export_object)(__DRIcontext *ctx,
485                        struct mesa_glinterop_export_in *in,
486                        struct mesa_glinterop_export_out *out);
487};
488
489/*@}*/
490
491/**
492 * The following extensions describe loader features that the DRI
493 * driver can make use of.  Some of these are mandatory, such as the
494 * getDrawableInfo extension for DRI and the DRI Loader extensions for
495 * DRI2, while others are optional, and if present allow the driver to
496 * expose certain features.  The loader pass in a NULL terminated
497 * array of these extensions to the driver in the createNewScreen
498 * constructor.
499 */
500
501typedef struct __DRIgetDrawableInfoExtensionRec __DRIgetDrawableInfoExtension;
502typedef struct __DRIsystemTimeExtensionRec __DRIsystemTimeExtension;
503typedef struct __DRIdamageExtensionRec __DRIdamageExtension;
504typedef struct __DRIloaderExtensionRec __DRIloaderExtension;
505typedef struct __DRIswrastLoaderExtensionRec __DRIswrastLoaderExtension;
506
507
508/**
509 * Callback to getDrawableInfo protocol
510 */
511#define __DRI_GET_DRAWABLE_INFO "DRI_GetDrawableInfo"
512#define __DRI_GET_DRAWABLE_INFO_VERSION 1
513struct __DRIgetDrawableInfoExtensionRec {
514    __DRIextension base;
515
516    /**
517     * This function is used to get information about the position, size, and
518     * clip rects of a drawable.
519     */
520    GLboolean (* getDrawableInfo) ( __DRIdrawable *drawable,
521	unsigned int * index, unsigned int * stamp,
522        int * x, int * y, int * width, int * height,
523        int * numClipRects, drm_clip_rect_t ** pClipRects,
524        int * backX, int * backY,
525	int * numBackClipRects, drm_clip_rect_t ** pBackClipRects,
526	void *loaderPrivate);
527};
528
529/**
530 * Callback to get system time for media stream counter extensions.
531 */
532#define __DRI_SYSTEM_TIME "DRI_SystemTime"
533#define __DRI_SYSTEM_TIME_VERSION 1
534struct __DRIsystemTimeExtensionRec {
535    __DRIextension base;
536
537    /**
538     * Get the 64-bit unadjusted system time (UST).
539     */
540    int (*getUST)(int64_t * ust);
541
542    /**
543     * Get the media stream counter (MSC) rate.
544     *
545     * Matching the definition in GLX_OML_sync_control, this function returns
546     * the rate of the "media stream counter".  In practical terms, this is
547     * the frame refresh rate of the display.
548     */
549    GLboolean (*getMSCRate)(__DRIdrawable *draw,
550			    int32_t * numerator, int32_t * denominator,
551			    void *loaderPrivate);
552};
553
554/**
555 * Damage reporting
556 */
557#define __DRI_DAMAGE "DRI_Damage"
558#define __DRI_DAMAGE_VERSION 1
559struct __DRIdamageExtensionRec {
560    __DRIextension base;
561
562    /**
563     * Reports areas of the given drawable which have been modified by the
564     * driver.
565     *
566     * \param drawable which the drawing was done to.
567     * \param rects rectangles affected, with the drawable origin as the
568     *	      origin.
569     * \param x X offset of the drawable within the screen (used in the
570     *	      front_buffer case)
571     * \param y Y offset of the drawable within the screen.
572     * \param front_buffer boolean flag for whether the drawing to the
573     * 	      drawable was actually done directly to the front buffer (instead
574     *	      of backing storage, for example)
575     * \param loaderPrivate the data passed in at createNewDrawable time
576     */
577    void (*reportDamage)(__DRIdrawable *draw,
578			 int x, int y,
579			 drm_clip_rect_t *rects, int num_rects,
580			 GLboolean front_buffer,
581			 void *loaderPrivate);
582};
583
584#define __DRI_SWRAST_IMAGE_OP_DRAW	1
585#define __DRI_SWRAST_IMAGE_OP_CLEAR	2
586#define __DRI_SWRAST_IMAGE_OP_SWAP	3
587
588/**
589 * SWRast Loader extension.
590 */
591#define __DRI_SWRAST_LOADER "DRI_SWRastLoader"
592#define __DRI_SWRAST_LOADER_VERSION 5
593struct __DRIswrastLoaderExtensionRec {
594    __DRIextension base;
595
596    /*
597     * Drawable position and size
598     */
599    void (*getDrawableInfo)(__DRIdrawable *drawable,
600			    int *x, int *y, int *width, int *height,
601			    void *loaderPrivate);
602
603    /**
604     * Put image to drawable
605     */
606    void (*putImage)(__DRIdrawable *drawable, int op,
607		     int x, int y, int width, int height,
608		     char *data, void *loaderPrivate);
609
610    /**
611     * Get image from readable
612     */
613    void (*getImage)(__DRIdrawable *readable,
614		     int x, int y, int width, int height,
615		     char *data, void *loaderPrivate);
616
617    /**
618     * Put image to drawable
619     *
620     * \since 2
621     */
622    void (*putImage2)(__DRIdrawable *drawable, int op,
623                      int x, int y, int width, int height, int stride,
624                      char *data, void *loaderPrivate);
625
626   /**
627     * Put image to drawable
628     *
629     * \since 3
630     */
631   void (*getImage2)(__DRIdrawable *readable,
632		     int x, int y, int width, int height, int stride,
633		     char *data, void *loaderPrivate);
634
635    /**
636     * Put shm image to drawable
637     *
638     * \since 4
639     */
640    void (*putImageShm)(__DRIdrawable *drawable, int op,
641                        int x, int y, int width, int height, int stride,
642                        int shmid, char *shmaddr, unsigned offset,
643                        void *loaderPrivate);
644    /**
645     * Get shm image from readable
646     *
647     * \since 4
648     */
649    void (*getImageShm)(__DRIdrawable *readable,
650                        int x, int y, int width, int height,
651                        int shmid, void *loaderPrivate);
652
653   /**
654     * Put shm image to drawable (v2)
655     *
656     * The original version fixes srcx/y to 0, and expected
657     * the offset to be adjusted. This version allows src x,y
658     * to not be included in the offset. This is needed to
659     * avoid certain overflow checks in the X server, that
660     * result in lost rendering.
661     *
662     * \since 5
663     */
664    void (*putImageShm2)(__DRIdrawable *drawable, int op,
665                         int x, int y,
666                         int width, int height, int stride,
667                         int shmid, char *shmaddr, unsigned offset,
668                         void *loaderPrivate);
669};
670
671/**
672 * Invalidate loader extension.  The presence of this extension
673 * indicates to the DRI driver that the loader will call invalidate in
674 * the __DRI2_FLUSH extension, whenever the needs to query for new
675 * buffers.  This means that the DRI driver can drop the polling in
676 * glViewport().
677 *
678 * The extension doesn't provide any functionality, it's only use to
679 * indicate to the driver that it can use the new semantics.  A DRI
680 * driver can use this to switch between the different semantics or
681 * just refuse to initialize if this extension isn't present.
682 */
683#define __DRI_USE_INVALIDATE "DRI_UseInvalidate"
684#define __DRI_USE_INVALIDATE_VERSION 1
685
686typedef struct __DRIuseInvalidateExtensionRec __DRIuseInvalidateExtension;
687struct __DRIuseInvalidateExtensionRec {
688   __DRIextension base;
689};
690
691/**
692 * The remaining extensions describe driver extensions, immediately
693 * available interfaces provided by the driver.  To start using the
694 * driver, dlsym() for the __DRI_DRIVER_EXTENSIONS symbol and look for
695 * the extension you need in the array.
696 */
697#define __DRI_DRIVER_EXTENSIONS "__driDriverExtensions"
698
699/**
700 * This symbol replaces the __DRI_DRIVER_EXTENSIONS symbol, and will be
701 * suffixed by "_drivername", allowing multiple drivers to be built into one
702 * library, and also giving the driver the chance to return a variable driver
703 * extensions struct depending on the driver name being loaded or any other
704 * system state.
705 *
706 * The function prototype is:
707 *
708 * const __DRIextension **__driDriverGetExtensions_drivername(void);
709 */
710#define __DRI_DRIVER_GET_EXTENSIONS "__driDriverGetExtensions"
711
712/**
713 * Tokens for __DRIconfig attribs.  A number of attributes defined by
714 * GLX or EGL standards are not in the table, as they must be provided
715 * by the loader.  For example, FBConfig ID or visual ID, drawable type.
716 */
717
718#define __DRI_ATTRIB_BUFFER_SIZE		 1
719#define __DRI_ATTRIB_LEVEL			 2
720#define __DRI_ATTRIB_RED_SIZE			 3
721#define __DRI_ATTRIB_GREEN_SIZE			 4
722#define __DRI_ATTRIB_BLUE_SIZE			 5
723#define __DRI_ATTRIB_LUMINANCE_SIZE		 6
724#define __DRI_ATTRIB_ALPHA_SIZE			 7
725#define __DRI_ATTRIB_ALPHA_MASK_SIZE		 8
726#define __DRI_ATTRIB_DEPTH_SIZE			 9
727#define __DRI_ATTRIB_STENCIL_SIZE		10
728#define __DRI_ATTRIB_ACCUM_RED_SIZE		11
729#define __DRI_ATTRIB_ACCUM_GREEN_SIZE		12
730#define __DRI_ATTRIB_ACCUM_BLUE_SIZE		13
731#define __DRI_ATTRIB_ACCUM_ALPHA_SIZE		14
732#define __DRI_ATTRIB_SAMPLE_BUFFERS		15
733#define __DRI_ATTRIB_SAMPLES			16
734#define __DRI_ATTRIB_RENDER_TYPE		17
735#define __DRI_ATTRIB_CONFIG_CAVEAT		18
736#define __DRI_ATTRIB_CONFORMANT			19
737#define __DRI_ATTRIB_DOUBLE_BUFFER		20
738#define __DRI_ATTRIB_STEREO			21
739#define __DRI_ATTRIB_AUX_BUFFERS		22
740#define __DRI_ATTRIB_TRANSPARENT_TYPE		23
741#define __DRI_ATTRIB_TRANSPARENT_INDEX_VALUE	24
742#define __DRI_ATTRIB_TRANSPARENT_RED_VALUE	25
743#define __DRI_ATTRIB_TRANSPARENT_GREEN_VALUE	26
744#define __DRI_ATTRIB_TRANSPARENT_BLUE_VALUE	27
745#define __DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE	28
746#define __DRI_ATTRIB_FLOAT_MODE			29
747#define __DRI_ATTRIB_RED_MASK			30
748#define __DRI_ATTRIB_GREEN_MASK			31
749#define __DRI_ATTRIB_BLUE_MASK			32
750#define __DRI_ATTRIB_ALPHA_MASK			33
751#define __DRI_ATTRIB_MAX_PBUFFER_WIDTH		34
752#define __DRI_ATTRIB_MAX_PBUFFER_HEIGHT		35
753#define __DRI_ATTRIB_MAX_PBUFFER_PIXELS		36
754#define __DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH	37
755#define __DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT	38
756#define __DRI_ATTRIB_VISUAL_SELECT_GROUP	39
757#define __DRI_ATTRIB_SWAP_METHOD		40
758#define __DRI_ATTRIB_MAX_SWAP_INTERVAL		41
759#define __DRI_ATTRIB_MIN_SWAP_INTERVAL		42
760#define __DRI_ATTRIB_BIND_TO_TEXTURE_RGB	43
761#define __DRI_ATTRIB_BIND_TO_TEXTURE_RGBA	44
762#define __DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE	45
763#define __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS	46
764#define __DRI_ATTRIB_YINVERTED			47
765#define __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE	48
766#define __DRI_ATTRIB_MUTABLE_RENDER_BUFFER	49 /* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR */
767#define __DRI_ATTRIB_MAX			50
768
769/* __DRI_ATTRIB_RENDER_TYPE */
770#define __DRI_ATTRIB_RGBA_BIT			0x01
771#define __DRI_ATTRIB_COLOR_INDEX_BIT		0x02
772#define __DRI_ATTRIB_LUMINANCE_BIT		0x04
773#define __DRI_ATTRIB_FLOAT_BIT			0x08
774#define __DRI_ATTRIB_UNSIGNED_FLOAT_BIT		0x10
775
776/* __DRI_ATTRIB_CONFIG_CAVEAT */
777#define __DRI_ATTRIB_SLOW_BIT			0x01
778#define __DRI_ATTRIB_NON_CONFORMANT_CONFIG	0x02
779
780/* __DRI_ATTRIB_TRANSPARENT_TYPE */
781#define __DRI_ATTRIB_TRANSPARENT_RGB		0x00
782#define __DRI_ATTRIB_TRANSPARENT_INDEX		0x01
783
784/* __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS	 */
785#define __DRI_ATTRIB_TEXTURE_1D_BIT		0x01
786#define __DRI_ATTRIB_TEXTURE_2D_BIT		0x02
787#define __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT	0x04
788
789/* __DRI_ATTRIB_SWAP_METHOD */
790/* Note that with the exception of __DRI_ATTRIB_SWAP_NONE, we need to define
791 * the same tokens as GLX. This is because old and current X servers will
792 * transmit the driconf value grabbed from the AIGLX driver untranslated as
793 * the GLX fbconfig value. __DRI_ATTRIB_SWAP_NONE is only used by dri drivers
794 * to signal to the dri core that the driconfig is single-buffer.
795 */
796#define __DRI_ATTRIB_SWAP_NONE                  0x0000
797#define __DRI_ATTRIB_SWAP_EXCHANGE              0x8061
798#define __DRI_ATTRIB_SWAP_COPY                  0x8062
799#define __DRI_ATTRIB_SWAP_UNDEFINED             0x8063
800
801/**
802 * This extension defines the core DRI functionality.
803 *
804 * Version >= 2 indicates that getConfigAttrib with __DRI_ATTRIB_SWAP_METHOD
805 * returns a reliable value.
806 */
807#define __DRI_CORE "DRI_Core"
808#define __DRI_CORE_VERSION 2
809
810struct __DRIcoreExtensionRec {
811    __DRIextension base;
812
813    __DRIscreen *(*createNewScreen)(int screen, int fd,
814				    unsigned int sarea_handle,
815				    const __DRIextension **extensions,
816				    const __DRIconfig ***driverConfigs,
817				    void *loaderPrivate);
818
819    void (*destroyScreen)(__DRIscreen *screen);
820
821    const __DRIextension **(*getExtensions)(__DRIscreen *screen);
822
823    int (*getConfigAttrib)(const __DRIconfig *config,
824			   unsigned int attrib,
825			   unsigned int *value);
826
827    int (*indexConfigAttrib)(const __DRIconfig *config, int index,
828			     unsigned int *attrib, unsigned int *value);
829
830    __DRIdrawable *(*createNewDrawable)(__DRIscreen *screen,
831					const __DRIconfig *config,
832					unsigned int drawable_id,
833					unsigned int head,
834					void *loaderPrivate);
835
836    void (*destroyDrawable)(__DRIdrawable *drawable);
837
838    void (*swapBuffers)(__DRIdrawable *drawable);
839
840    __DRIcontext *(*createNewContext)(__DRIscreen *screen,
841				      const __DRIconfig *config,
842				      __DRIcontext *shared,
843				      void *loaderPrivate);
844
845    int (*copyContext)(__DRIcontext *dest,
846		       __DRIcontext *src,
847		       unsigned long mask);
848
849    void (*destroyContext)(__DRIcontext *context);
850
851    int (*bindContext)(__DRIcontext *ctx,
852		       __DRIdrawable *pdraw,
853		       __DRIdrawable *pread);
854
855    int (*unbindContext)(__DRIcontext *ctx);
856};
857
858/**
859 * Stored version of some component (i.e., server-side DRI module, kernel-side
860 * DRM, etc.).
861 *
862 * \todo
863 * There are several data structures that explicitly store a major version,
864 * minor version, and patch level.  These structures should be modified to
865 * have a \c __DRIversionRec instead.
866 */
867struct __DRIversionRec {
868    int    major;        /**< Major version number. */
869    int    minor;        /**< Minor version number. */
870    int    patch;        /**< Patch-level. */
871};
872
873/**
874 * Framebuffer information record.  Used by libGL to communicate information
875 * about the framebuffer to the driver's \c __driCreateNewScreen function.
876 *
877 * In XFree86, most of this information is derrived from data returned by
878 * calling \c XF86DRIGetDeviceInfo.
879 *
880 * \sa XF86DRIGetDeviceInfo __DRIdisplayRec::createNewScreen
881 *     __driUtilCreateNewScreen CallCreateNewScreen
882 *
883 * \bug This structure could be better named.
884 */
885struct __DRIframebufferRec {
886    unsigned char *base;    /**< Framebuffer base address in the CPU's
887			     * address space.  This value is calculated by
888			     * calling \c drmMap on the framebuffer handle
889			     * returned by \c XF86DRIGetDeviceInfo (or a
890			     * similar function).
891			     */
892    int size;               /**< Framebuffer size, in bytes. */
893    int stride;             /**< Number of bytes from one line to the next. */
894    int width;              /**< Pixel width of the framebuffer. */
895    int height;             /**< Pixel height of the framebuffer. */
896    int dev_priv_size;      /**< Size of the driver's dev-priv structure. */
897    void *dev_priv;         /**< Pointer to the driver's dev-priv structure. */
898};
899
900
901/**
902 * This extension provides alternative screen, drawable and context
903 * constructors for legacy DRI functionality.  This is used in
904 * conjunction with the core extension.
905 */
906#define __DRI_LEGACY "DRI_Legacy"
907#define __DRI_LEGACY_VERSION 1
908
909struct __DRIlegacyExtensionRec {
910    __DRIextension base;
911
912    __DRIscreen *(*createNewScreen)(int screen,
913				    const __DRIversion *ddx_version,
914				    const __DRIversion *dri_version,
915				    const __DRIversion *drm_version,
916				    const __DRIframebuffer *frame_buffer,
917				    void *pSAREA, int fd,
918				    const __DRIextension **extensions,
919				    const __DRIconfig ***driver_configs,
920				    void *loaderPrivate);
921
922    __DRIdrawable *(*createNewDrawable)(__DRIscreen *screen,
923					const __DRIconfig *config,
924					drm_drawable_t hwDrawable,
925					int renderType, const int *attrs,
926					void *loaderPrivate);
927
928    __DRIcontext *(*createNewContext)(__DRIscreen *screen,
929				      const __DRIconfig *config,
930				      int render_type,
931				      __DRIcontext *shared,
932				      drm_context_t hwContext,
933				      void *loaderPrivate);
934};
935
936/**
937 * This extension provides alternative screen, drawable and context
938 * constructors for swrast DRI functionality.  This is used in
939 * conjunction with the core extension.
940 */
941#define __DRI_SWRAST "DRI_SWRast"
942#define __DRI_SWRAST_VERSION 4
943
944struct __DRIswrastExtensionRec {
945    __DRIextension base;
946
947    __DRIscreen *(*createNewScreen)(int screen,
948				    const __DRIextension **extensions,
949				    const __DRIconfig ***driver_configs,
950				    void *loaderPrivate);
951
952    __DRIdrawable *(*createNewDrawable)(__DRIscreen *screen,
953					const __DRIconfig *config,
954					void *loaderPrivate);
955
956   /* Since version 2 */
957   __DRIcontext *(*createNewContextForAPI)(__DRIscreen *screen,
958                                           int api,
959                                           const __DRIconfig *config,
960                                           __DRIcontext *shared,
961                                           void *data);
962
963   /**
964    * Create a context for a particular API with a set of attributes
965    *
966    * \since version 3
967    *
968    * \sa __DRIdri2ExtensionRec::createContextAttribs
969    */
970   __DRIcontext *(*createContextAttribs)(__DRIscreen *screen,
971					 int api,
972					 const __DRIconfig *config,
973					 __DRIcontext *shared,
974					 unsigned num_attribs,
975					 const uint32_t *attribs,
976					 unsigned *error,
977					 void *loaderPrivate);
978
979   /**
980    * createNewScreen() with the driver extensions passed in.
981    *
982    * \since version 4
983    */
984   __DRIscreen *(*createNewScreen2)(int screen,
985                                    const __DRIextension **loader_extensions,
986                                    const __DRIextension **driver_extensions,
987                                    const __DRIconfig ***driver_configs,
988                                    void *loaderPrivate);
989
990};
991
992/** Common DRI function definitions, shared among DRI2 and Image extensions
993 */
994
995typedef __DRIscreen *
996(*__DRIcreateNewScreen2Func)(int screen, int fd,
997                             const __DRIextension **extensions,
998                             const __DRIextension **driver_extensions,
999                             const __DRIconfig ***driver_configs,
1000                             void *loaderPrivate);
1001
1002typedef __DRIdrawable *
1003(*__DRIcreateNewDrawableFunc)(__DRIscreen *screen,
1004                              const __DRIconfig *config,
1005                              void *loaderPrivate);
1006
1007typedef __DRIcontext *
1008(*__DRIcreateContextAttribsFunc)(__DRIscreen *screen,
1009                                 int api,
1010                                 const __DRIconfig *config,
1011                                 __DRIcontext *shared,
1012                                 unsigned num_attribs,
1013                                 const uint32_t *attribs,
1014                                 unsigned *error,
1015                                 void *loaderPrivate);
1016
1017typedef unsigned int
1018(*__DRIgetAPIMaskFunc)(__DRIscreen *screen);
1019
1020/**
1021 * DRI2 Loader extension.
1022 */
1023#define __DRI_BUFFER_FRONT_LEFT		0
1024#define __DRI_BUFFER_BACK_LEFT		1
1025#define __DRI_BUFFER_FRONT_RIGHT	2
1026#define __DRI_BUFFER_BACK_RIGHT		3
1027#define __DRI_BUFFER_DEPTH		4
1028#define __DRI_BUFFER_STENCIL		5
1029#define __DRI_BUFFER_ACCUM		6
1030#define __DRI_BUFFER_FAKE_FRONT_LEFT	7
1031#define __DRI_BUFFER_FAKE_FRONT_RIGHT	8
1032#define __DRI_BUFFER_DEPTH_STENCIL	9  /**< Only available with DRI2 1.1 */
1033#define __DRI_BUFFER_HIZ		10
1034
1035/* Inofficial and for internal use. Increase when adding a new buffer token. */
1036#define __DRI_BUFFER_COUNT		11
1037
1038struct __DRIbufferRec {
1039    unsigned int attachment;
1040    unsigned int name;
1041    unsigned int pitch;
1042    unsigned int cpp;
1043    unsigned int flags;
1044};
1045
1046#define __DRI_DRI2_LOADER "DRI_DRI2Loader"
1047#define __DRI_DRI2_LOADER_VERSION 4
1048
1049enum dri_loader_cap {
1050   /* Whether the loader handles RGBA channel ordering correctly. If not,
1051    * only BGRA ordering can be exposed.
1052    */
1053   DRI_LOADER_CAP_RGBA_ORDERING,
1054};
1055
1056struct __DRIdri2LoaderExtensionRec {
1057    __DRIextension base;
1058
1059    __DRIbuffer *(*getBuffers)(__DRIdrawable *driDrawable,
1060			       int *width, int *height,
1061			       unsigned int *attachments, int count,
1062			       int *out_count, void *loaderPrivate);
1063
1064    /**
1065     * Flush pending front-buffer rendering
1066     *
1067     * Any rendering that has been performed to the
1068     * \c __DRI_BUFFER_FAKE_FRONT_LEFT will be flushed to the
1069     * \c __DRI_BUFFER_FRONT_LEFT.
1070     *
1071     * \param driDrawable    Drawable whose front-buffer is to be flushed
1072     * \param loaderPrivate  Loader's private data that was previously passed
1073     *                       into __DRIdri2ExtensionRec::createNewDrawable
1074     *
1075     * \since 2
1076     */
1077    void (*flushFrontBuffer)(__DRIdrawable *driDrawable, void *loaderPrivate);
1078
1079
1080    /**
1081     * Get list of buffers from the server
1082     *
1083     * Gets a list of buffer for the specified set of attachments.  Unlike
1084     * \c ::getBuffers, this function takes a list of attachments paired with
1085     * opaque \c unsigned \c int value describing the format of the buffer.
1086     * It is the responsibility of the caller to know what the service that
1087     * allocates the buffers will expect to receive for the format.
1088     *
1089     * \param driDrawable    Drawable whose buffers are being queried.
1090     * \param width          Output where the width of the buffers is stored.
1091     * \param height         Output where the height of the buffers is stored.
1092     * \param attachments    List of pairs of attachment ID and opaque format
1093     *                       requested for the drawable.
1094     * \param count          Number of attachment / format pairs stored in
1095     *                       \c attachments.
1096     * \param loaderPrivate  Loader's private data that was previously passed
1097     *                       into __DRIdri2ExtensionRec::createNewDrawable.
1098     *
1099     * \since 3
1100     */
1101    __DRIbuffer *(*getBuffersWithFormat)(__DRIdrawable *driDrawable,
1102					 int *width, int *height,
1103					 unsigned int *attachments, int count,
1104					 int *out_count, void *loaderPrivate);
1105
1106    /**
1107     * Return a loader capability value. If the loader doesn't know the enum,
1108     * it will return 0.
1109     *
1110     * \param loaderPrivate The last parameter of createNewScreen or
1111     *                      createNewScreen2.
1112     * \param cap           See the enum.
1113     *
1114     * \since 4
1115     */
1116    unsigned (*getCapability)(void *loaderPrivate, enum dri_loader_cap cap);
1117};
1118
1119/**
1120 * This extension provides alternative screen, drawable and context
1121 * constructors for DRI2.
1122 */
1123#define __DRI_DRI2 "DRI_DRI2"
1124#define __DRI_DRI2_VERSION 4
1125
1126#define __DRI_API_OPENGL	0	/**< OpenGL compatibility profile */
1127#define __DRI_API_GLES		1	/**< OpenGL ES 1.x */
1128#define __DRI_API_GLES2		2	/**< OpenGL ES 2.x */
1129#define __DRI_API_OPENGL_CORE	3	/**< OpenGL 3.2+ core profile */
1130#define __DRI_API_GLES3		4	/**< OpenGL ES 3.x */
1131
1132#define __DRI_CTX_ATTRIB_MAJOR_VERSION		0
1133#define __DRI_CTX_ATTRIB_MINOR_VERSION		1
1134#define __DRI_CTX_ATTRIB_FLAGS			2
1135
1136/**
1137 * \requires __DRI2_ROBUSTNESS.
1138 */
1139#define __DRI_CTX_ATTRIB_RESET_STRATEGY		3
1140
1141#define __DRI_CTX_FLAG_DEBUG			0x00000001
1142#define __DRI_CTX_FLAG_FORWARD_COMPATIBLE	0x00000002
1143
1144/**
1145 * \requires __DRI2_ROBUSTNESS.
1146 */
1147#define __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS	0x00000004
1148
1149/**
1150 * \requires __DRI2_NO_ERROR.
1151 *
1152 */
1153#define __DRI_CTX_FLAG_NO_ERROR			0x00000008
1154
1155/**
1156 * \name Context reset strategies.
1157 */
1158/*@{*/
1159#define __DRI_CTX_RESET_NO_NOTIFICATION		0
1160#define __DRI_CTX_RESET_LOSE_CONTEXT		1
1161/*@}*/
1162
1163#define __DRI_CTX_ATTRIB_PRIORITY		4
1164
1165#define __DRI_CTX_PRIORITY_LOW			0
1166#define __DRI_CTX_PRIORITY_MEDIUM		1
1167#define __DRI_CTX_PRIORITY_HIGH			2
1168
1169/**
1170 * \name Context release behaviors.
1171 */
1172/*@{*/
1173#define __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR	5
1174
1175#define __DRI_CTX_RELEASE_BEHAVIOR_NONE         0
1176#define __DRI_CTX_RELEASE_BEHAVIOR_FLUSH        1
1177/*@}*/
1178
1179/**
1180 * \name Reasons that __DRIdri2Extension::createContextAttribs might fail
1181 */
1182/*@{*/
1183/** Success! */
1184#define __DRI_CTX_ERROR_SUCCESS			0
1185
1186/** Memory allocation failure */
1187#define __DRI_CTX_ERROR_NO_MEMORY		1
1188
1189/** Client requested an API (e.g., OpenGL ES 2.0) that the driver can't do. */
1190#define __DRI_CTX_ERROR_BAD_API			2
1191
1192/** Client requested an API version that the driver can't do. */
1193#define __DRI_CTX_ERROR_BAD_VERSION		3
1194
1195/** Client requested a flag or combination of flags the driver can't do. */
1196#define __DRI_CTX_ERROR_BAD_FLAG		4
1197
1198/** Client requested an attribute the driver doesn't understand. */
1199#define __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE	5
1200
1201/** Client requested a flag the driver doesn't understand. */
1202#define __DRI_CTX_ERROR_UNKNOWN_FLAG		6
1203/*@}*/
1204
1205struct __DRIdri2ExtensionRec {
1206    __DRIextension base;
1207
1208    __DRIscreen *(*createNewScreen)(int screen, int fd,
1209				    const __DRIextension **extensions,
1210				    const __DRIconfig ***driver_configs,
1211				    void *loaderPrivate);
1212
1213   __DRIcreateNewDrawableFunc   createNewDrawable;
1214   __DRIcontext *(*createNewContext)(__DRIscreen *screen,
1215                                     const __DRIconfig *config,
1216                                     __DRIcontext *shared,
1217                                     void *loaderPrivate);
1218
1219   /* Since version 2 */
1220   __DRIgetAPIMaskFunc          getAPIMask;
1221
1222   __DRIcontext *(*createNewContextForAPI)(__DRIscreen *screen,
1223					   int api,
1224					   const __DRIconfig *config,
1225					   __DRIcontext *shared,
1226					   void *data);
1227
1228   __DRIbuffer *(*allocateBuffer)(__DRIscreen *screen,
1229				  unsigned int attachment,
1230				  unsigned int format,
1231				  int width,
1232				  int height);
1233   void (*releaseBuffer)(__DRIscreen *screen,
1234			 __DRIbuffer *buffer);
1235
1236   /**
1237    * Create a context for a particular API with a set of attributes
1238    *
1239    * \since version 3
1240    *
1241    * \sa __DRIswrastExtensionRec::createContextAttribs
1242    */
1243   __DRIcreateContextAttribsFunc        createContextAttribs;
1244
1245   /**
1246    * createNewScreen with the driver's extension list passed in.
1247    *
1248    * \since version 4
1249    */
1250   __DRIcreateNewScreen2Func            createNewScreen2;
1251};
1252
1253
1254/**
1255 * This extension provides functionality to enable various EGLImage
1256 * extensions.
1257 */
1258#define __DRI_IMAGE "DRI_IMAGE"
1259#define __DRI_IMAGE_VERSION 17
1260
1261/**
1262 * These formats correspond to the similarly named MESA_FORMAT_*
1263 * tokens, except in the native endian of the CPU.  For example, on
1264 * little endian __DRI_IMAGE_FORMAT_XRGB8888 corresponds to
1265 * MESA_FORMAT_XRGB8888, but MESA_FORMAT_XRGB8888_REV on big endian.
1266 *
1267 * __DRI_IMAGE_FORMAT_NONE is for images that aren't directly usable
1268 * by the driver (YUV planar formats) but serve as a base image for
1269 * creating sub-images for the different planes within the image.
1270 *
1271 * R8, GR88 and NONE should not be used with createImageFromName or
1272 * createImage, and are returned by query from sub images created with
1273 * createImageFromNames (NONE, see above) and fromPlane (R8 & GR88).
1274 */
1275#define __DRI_IMAGE_FORMAT_RGB565       0x1001
1276#define __DRI_IMAGE_FORMAT_XRGB8888     0x1002
1277#define __DRI_IMAGE_FORMAT_ARGB8888     0x1003
1278#define __DRI_IMAGE_FORMAT_ABGR8888     0x1004
1279#define __DRI_IMAGE_FORMAT_XBGR8888     0x1005
1280#define __DRI_IMAGE_FORMAT_R8           0x1006 /* Since version 5 */
1281#define __DRI_IMAGE_FORMAT_GR88         0x1007
1282#define __DRI_IMAGE_FORMAT_NONE         0x1008
1283#define __DRI_IMAGE_FORMAT_XRGB2101010  0x1009
1284#define __DRI_IMAGE_FORMAT_ARGB2101010  0x100a
1285#define __DRI_IMAGE_FORMAT_SARGB8       0x100b
1286#define __DRI_IMAGE_FORMAT_ARGB1555     0x100c
1287#define __DRI_IMAGE_FORMAT_R16          0x100d
1288#define __DRI_IMAGE_FORMAT_GR1616       0x100e
1289#define __DRI_IMAGE_FORMAT_YUYV         0x100f
1290#define __DRI_IMAGE_FORMAT_XBGR2101010  0x1010
1291#define __DRI_IMAGE_FORMAT_ABGR2101010  0x1011
1292#define __DRI_IMAGE_FORMAT_SABGR8       0x1012
1293
1294#define __DRI_IMAGE_USE_SHARE		0x0001
1295#define __DRI_IMAGE_USE_SCANOUT		0x0002
1296#define __DRI_IMAGE_USE_CURSOR		0x0004 /* Deprecated */
1297#define __DRI_IMAGE_USE_LINEAR		0x0008
1298/* The buffer will only be read by an external process after SwapBuffers,
1299 * in contrary to gbm buffers, front buffers and fake front buffers, which
1300 * could be read after a flush."
1301 */
1302#define __DRI_IMAGE_USE_BACKBUFFER      0x0010
1303
1304
1305#define __DRI_IMAGE_TRANSFER_READ            0x1
1306#define __DRI_IMAGE_TRANSFER_WRITE           0x2
1307#define __DRI_IMAGE_TRANSFER_READ_WRITE      \
1308        (__DRI_IMAGE_TRANSFER_READ | __DRI_IMAGE_TRANSFER_WRITE)
1309
1310/**
1311 * Four CC formats that matches with WL_DRM_FORMAT_* from wayland_drm.h,
1312 * GBM_FORMAT_* from gbm.h, and DRM_FORMAT_* from drm_fourcc.h. Used with
1313 * createImageFromNames.
1314 *
1315 * \since 5
1316 */
1317
1318#define __DRI_IMAGE_FOURCC_R8		0x20203852
1319#define __DRI_IMAGE_FOURCC_GR88		0x38385247
1320#define __DRI_IMAGE_FOURCC_ARGB1555	0x35315241
1321#define __DRI_IMAGE_FOURCC_R16		0x20363152
1322#define __DRI_IMAGE_FOURCC_GR1616	0x32335247
1323#define __DRI_IMAGE_FOURCC_RGB565	0x36314752
1324#define __DRI_IMAGE_FOURCC_ARGB8888	0x34325241
1325#define __DRI_IMAGE_FOURCC_XRGB8888	0x34325258
1326#define __DRI_IMAGE_FOURCC_ABGR8888	0x34324241
1327#define __DRI_IMAGE_FOURCC_XBGR8888	0x34324258
1328#define __DRI_IMAGE_FOURCC_SARGB8888	0x83324258
1329#define __DRI_IMAGE_FOURCC_SABGR8888	0x84324258
1330#define __DRI_IMAGE_FOURCC_ARGB2101010	0x30335241
1331#define __DRI_IMAGE_FOURCC_XRGB2101010	0x30335258
1332#define __DRI_IMAGE_FOURCC_ABGR2101010	0x30334241
1333#define __DRI_IMAGE_FOURCC_XBGR2101010	0x30334258
1334#define __DRI_IMAGE_FOURCC_RGBA1010102	0x30334152
1335#define __DRI_IMAGE_FOURCC_RGBX1010102	0x30335852
1336#define __DRI_IMAGE_FOURCC_BGRA1010102	0x30334142
1337#define __DRI_IMAGE_FOURCC_BGRX1010102	0x30335842
1338#define __DRI_IMAGE_FOURCC_YUV410	0x39565559
1339#define __DRI_IMAGE_FOURCC_YUV411	0x31315559
1340#define __DRI_IMAGE_FOURCC_YUV420	0x32315559
1341#define __DRI_IMAGE_FOURCC_YUV422	0x36315559
1342#define __DRI_IMAGE_FOURCC_YUV444	0x34325559
1343#define __DRI_IMAGE_FOURCC_NV12		0x3231564e
1344#define __DRI_IMAGE_FOURCC_NV16		0x3631564e
1345#define __DRI_IMAGE_FOURCC_YUYV		0x56595559
1346#define __DRI_IMAGE_FOURCC_UYVY		0x59565955
1347
1348#define __DRI_IMAGE_FOURCC_YVU410	0x39555659
1349#define __DRI_IMAGE_FOURCC_YVU411	0x31315659
1350#define __DRI_IMAGE_FOURCC_YVU420	0x32315659
1351#define __DRI_IMAGE_FOURCC_YVU422	0x36315659
1352#define __DRI_IMAGE_FOURCC_YVU444	0x34325659
1353
1354/**
1355 * Queryable on images created by createImageFromNames.
1356 *
1357 * RGB and RGBA are may be usable directly as images but its still
1358 * recommended to call fromPlanar with plane == 0.
1359 *
1360 * Y_U_V, Y_UV,Y_XUXV and Y_UXVX all requires call to fromPlanar to create
1361 * usable sub-images, sampling from images return raw YUV data and
1362 * color conversion needs to be done in the shader.
1363 *
1364 * \since 5
1365 */
1366
1367#define __DRI_IMAGE_COMPONENTS_RGB	0x3001
1368#define __DRI_IMAGE_COMPONENTS_RGBA	0x3002
1369#define __DRI_IMAGE_COMPONENTS_Y_U_V	0x3003
1370#define __DRI_IMAGE_COMPONENTS_Y_UV	0x3004
1371#define __DRI_IMAGE_COMPONENTS_Y_XUXV	0x3005
1372#define __DRI_IMAGE_COMPONENTS_Y_UXVX	0x3008
1373#define __DRI_IMAGE_COMPONENTS_R	0x3006
1374#define __DRI_IMAGE_COMPONENTS_RG	0x3007
1375
1376
1377/**
1378 * queryImage attributes
1379 */
1380
1381#define __DRI_IMAGE_ATTRIB_STRIDE	0x2000
1382#define __DRI_IMAGE_ATTRIB_HANDLE	0x2001
1383#define __DRI_IMAGE_ATTRIB_NAME		0x2002
1384#define __DRI_IMAGE_ATTRIB_FORMAT	0x2003 /* available in versions 3+ */
1385#define __DRI_IMAGE_ATTRIB_WIDTH	0x2004 /* available in versions 4+ */
1386#define __DRI_IMAGE_ATTRIB_HEIGHT	0x2005
1387#define __DRI_IMAGE_ATTRIB_COMPONENTS	0x2006 /* available in versions 5+ */
1388#define __DRI_IMAGE_ATTRIB_FD           0x2007 /* available in versions
1389                                                * 7+. Each query will return a
1390                                                * new fd. */
1391#define __DRI_IMAGE_ATTRIB_FOURCC       0x2008 /* available in versions 11 */
1392#define __DRI_IMAGE_ATTRIB_NUM_PLANES   0x2009 /* available in versions 11 */
1393
1394#define __DRI_IMAGE_ATTRIB_OFFSET 0x200A /* available in versions 13 */
1395#define __DRI_IMAGE_ATTRIB_MODIFIER_LOWER 0x200B /* available in versions 14 */
1396#define __DRI_IMAGE_ATTRIB_MODIFIER_UPPER 0x200C /* available in versions 14 */
1397
1398enum __DRIYUVColorSpace {
1399   __DRI_YUV_COLOR_SPACE_UNDEFINED = 0,
1400   __DRI_YUV_COLOR_SPACE_ITU_REC601 = 0x327F,
1401   __DRI_YUV_COLOR_SPACE_ITU_REC709 = 0x3280,
1402   __DRI_YUV_COLOR_SPACE_ITU_REC2020 = 0x3281
1403};
1404
1405enum __DRISampleRange {
1406   __DRI_YUV_RANGE_UNDEFINED = 0,
1407   __DRI_YUV_FULL_RANGE = 0x3282,
1408   __DRI_YUV_NARROW_RANGE = 0x3283
1409};
1410
1411enum __DRIChromaSiting {
1412   __DRI_YUV_CHROMA_SITING_UNDEFINED = 0,
1413   __DRI_YUV_CHROMA_SITING_0 = 0x3284,
1414   __DRI_YUV_CHROMA_SITING_0_5 = 0x3285
1415};
1416
1417/**
1418 * \name Reasons that __DRIimageExtensionRec::createImageFromTexture or
1419 * __DRIimageExtensionRec::createImageFromDmaBufs might fail
1420 */
1421/*@{*/
1422/** Success! */
1423#define __DRI_IMAGE_ERROR_SUCCESS       0
1424
1425/** Memory allocation failure */
1426#define __DRI_IMAGE_ERROR_BAD_ALLOC     1
1427
1428/** Client requested an invalid attribute */
1429#define __DRI_IMAGE_ERROR_BAD_MATCH     2
1430
1431/** Client requested an invalid texture object */
1432#define __DRI_IMAGE_ERROR_BAD_PARAMETER 3
1433
1434/** Client requested an invalid pitch and/or offset */
1435#define __DRI_IMAGE_ERROR_BAD_ACCESS    4
1436/*@}*/
1437
1438/**
1439 * \name Capabilities that might be returned by __DRIimageExtensionRec::getCapabilities
1440 */
1441/*@{*/
1442#define __DRI_IMAGE_CAP_GLOBAL_NAMES 1
1443/*@}*/
1444
1445/**
1446 * blitImage flags
1447 */
1448
1449#define __BLIT_FLAG_FLUSH		0x0001
1450#define __BLIT_FLAG_FINISH		0x0002
1451
1452/**
1453 * queryDmaBufFormatModifierAttribs attributes
1454 */
1455
1456/* Available in version 16 */
1457#define __DRI_IMAGE_FORMAT_MODIFIER_ATTRIB_PLANE_COUNT   0x0001
1458
1459typedef struct __DRIimageRec          __DRIimage;
1460typedef struct __DRIimageExtensionRec __DRIimageExtension;
1461struct __DRIimageExtensionRec {
1462    __DRIextension base;
1463
1464    __DRIimage *(*createImageFromName)(__DRIscreen *screen,
1465				       int width, int height, int format,
1466				       int name, int pitch,
1467				       void *loaderPrivate);
1468
1469    /* Deprecated since version 17; see createImageFromRenderbuffer2 */
1470    __DRIimage *(*createImageFromRenderbuffer)(__DRIcontext *context,
1471					       int renderbuffer,
1472					       void *loaderPrivate);
1473
1474    void (*destroyImage)(__DRIimage *image);
1475
1476    __DRIimage *(*createImage)(__DRIscreen *screen,
1477			       int width, int height, int format,
1478			       unsigned int use,
1479			       void *loaderPrivate);
1480
1481   GLboolean (*queryImage)(__DRIimage *image, int attrib, int *value);
1482
1483   /**
1484    * The new __DRIimage will share the content with the old one, see dup(2).
1485    */
1486   __DRIimage *(*dupImage)(__DRIimage *image, void *loaderPrivate);
1487
1488   /**
1489    * Validate that a __DRIimage can be used a certain way.
1490    *
1491    * \since 2
1492    */
1493   GLboolean (*validateUsage)(__DRIimage *image, unsigned int use);
1494
1495   /**
1496    * Unlike createImageFromName __DRI_IMAGE_FORMAT is not but instead
1497    * __DRI_IMAGE_FOURCC and strides are in bytes not pixels. Stride is
1498    * also per block and not per pixel (for non-RGB, see gallium blocks).
1499    *
1500    * \since 5
1501    */
1502   __DRIimage *(*createImageFromNames)(__DRIscreen *screen,
1503                                       int width, int height, int fourcc,
1504                                       int *names, int num_names,
1505                                       int *strides, int *offsets,
1506                                       void *loaderPrivate);
1507
1508   /**
1509    * Create an image out of a sub-region of a parent image.  This
1510    * entry point lets us create individual __DRIimages for different
1511    * planes in a planar buffer (typically yuv), for example.  While a
1512    * sub-image shares the underlying buffer object with the parent
1513    * image and other sibling sub-images, the life times of parent and
1514    * sub-images are not dependent.  Destroying the parent or a
1515    * sub-image doesn't affect other images.  The underlying buffer
1516    * object is free when no __DRIimage remains that references it.
1517    *
1518    * Sub-images may overlap, but rendering to overlapping sub-images
1519    * is undefined.
1520    *
1521    * \since 5
1522    */
1523    __DRIimage *(*fromPlanar)(__DRIimage *image, int plane,
1524                              void *loaderPrivate);
1525
1526    /**
1527     * Create image from texture.
1528     *
1529     * \since 6
1530     */
1531   __DRIimage *(*createImageFromTexture)(__DRIcontext *context,
1532                                         int target,
1533                                         unsigned texture,
1534                                         int depth,
1535                                         int level,
1536                                         unsigned *error,
1537                                         void *loaderPrivate);
1538   /**
1539    * Like createImageFromNames, but takes a prime fd instead.
1540    *
1541    * \since 7
1542    */
1543   __DRIimage *(*createImageFromFds)(__DRIscreen *screen,
1544                                     int width, int height, int fourcc,
1545                                     int *fds, int num_fds,
1546                                     int *strides, int *offsets,
1547                                     void *loaderPrivate);
1548
1549   /**
1550    * Like createImageFromFds, but takes additional attributes.
1551    *
1552    * For EGL_EXT_image_dma_buf_import.
1553    *
1554    * \since 8
1555    */
1556   __DRIimage *(*createImageFromDmaBufs)(__DRIscreen *screen,
1557                                         int width, int height, int fourcc,
1558                                         int *fds, int num_fds,
1559                                         int *strides, int *offsets,
1560                                         enum __DRIYUVColorSpace color_space,
1561                                         enum __DRISampleRange sample_range,
1562                                         enum __DRIChromaSiting horiz_siting,
1563                                         enum __DRIChromaSiting vert_siting,
1564                                         unsigned *error,
1565                                         void *loaderPrivate);
1566
1567   /**
1568    * Blit a part of a __DRIimage to another and flushes
1569    *
1570    * flush_flag:
1571    *    0:                  no flush
1572    *    __BLIT_FLAG_FLUSH:  flush after the blit operation
1573    *    __BLIT_FLAG_FINISH: flush and wait the blit finished
1574    *
1575    * \since 9
1576    */
1577   void (*blitImage)(__DRIcontext *context, __DRIimage *dst, __DRIimage *src,
1578                     int dstx0, int dsty0, int dstwidth, int dstheight,
1579                     int srcx0, int srcy0, int srcwidth, int srcheight,
1580                     int flush_flag);
1581
1582   /**
1583    * Query for general capabilities of the driver that concern
1584    * buffer sharing and image importing.
1585    *
1586    * \since 10
1587    */
1588   int (*getCapabilities)(__DRIscreen *screen);
1589
1590   /**
1591    * Returns a map of the specified region of a __DRIimage for the specified usage.
1592    *
1593    * flags may include __DRI_IMAGE_TRANSFER_READ, which will populate the
1594    * mapping with the current buffer content. If __DRI_IMAGE_TRANSFER_READ
1595    * is not included in the flags, the buffer content at map time is
1596    * undefined. Users wanting to modify the mapping must include
1597    * __DRI_IMAGE_TRANSFER_WRITE; if __DRI_IMAGE_TRANSFER_WRITE is not
1598    * included, behaviour when writing the mapping is undefined.
1599    *
1600    * Returns the byte stride in *stride, and an opaque pointer to data
1601    * tracking the mapping in **data, which must be passed to unmapImage().
1602    *
1603    * \since 12
1604    */
1605   void *(*mapImage)(__DRIcontext *context, __DRIimage *image,
1606                     int x0, int y0, int width, int height,
1607                     unsigned int flags, int *stride, void **data);
1608
1609   /**
1610    * Unmap a previously mapped __DRIimage
1611    *
1612    * \since 12
1613    */
1614   void (*unmapImage)(__DRIcontext *context, __DRIimage *image, void *data);
1615
1616
1617   /**
1618    * Creates an image with implementation's favorite modifiers.
1619    *
1620    * This acts like createImage except there is a list of modifiers passed in
1621    * which the implementation may selectively use to create the DRIimage. The
1622    * result should be the implementation selects one modifier (perhaps it would
1623    * hold on to a few and later pick).
1624    *
1625    * The created image should be destroyed with destroyImage().
1626    *
1627    * Returns the new DRIimage. The chosen modifier can be obtained later on
1628    * and passed back to things like the kernel's AddFB2 interface.
1629    *
1630    * \sa __DRIimageRec::createImage
1631    *
1632    * \since 14
1633    */
1634   __DRIimage *(*createImageWithModifiers)(__DRIscreen *screen,
1635                                           int width, int height, int format,
1636                                           const uint64_t *modifiers,
1637                                           const unsigned int modifier_count,
1638                                           void *loaderPrivate);
1639
1640   /*
1641    * Like createImageFromDmaBufs, but takes also format modifiers.
1642    *
1643    * For EGL_EXT_image_dma_buf_import_modifiers.
1644    *
1645    * \since 15
1646    */
1647   __DRIimage *(*createImageFromDmaBufs2)(__DRIscreen *screen,
1648                                          int width, int height, int fourcc,
1649                                          uint64_t modifier,
1650                                          int *fds, int num_fds,
1651                                          int *strides, int *offsets,
1652                                          enum __DRIYUVColorSpace color_space,
1653                                          enum __DRISampleRange sample_range,
1654                                          enum __DRIChromaSiting horiz_siting,
1655                                          enum __DRIChromaSiting vert_siting,
1656                                          unsigned *error,
1657                                          void *loaderPrivate);
1658
1659   /*
1660    * dmabuf format query to support EGL_EXT_image_dma_buf_import_modifiers.
1661    *
1662    * \param max      Maximum number of formats that can be accomodated into
1663    *                 \param formats. If zero, no formats are returned -
1664    *                 instead, the driver returns the total number of
1665    *                 supported dmabuf formats in \param count.
1666    * \param formats  Buffer to fill formats into.
1667    * \param count    Count of formats returned, or, total number of
1668    *                 supported formats in case \param max is zero.
1669    *
1670    * Returns true on success.
1671    *
1672    * \since 15
1673    */
1674   GLboolean (*queryDmaBufFormats)(__DRIscreen *screen, int max,
1675                                   int *formats, int *count);
1676
1677   /*
1678    * dmabuf format modifier query for a given format to support
1679    * EGL_EXT_image_dma_buf_import_modifiers.
1680    *
1681    * \param fourcc    The format to query modifiers for. If this format
1682    *                  is not supported by the driver, return false.
1683    * \param max       Maximum number of modifiers that can be accomodated in
1684    *                  \param modifiers. If zero, no modifiers are returned -
1685    *                  instead, the driver returns the total number of
1686    *                  modifiers for \param format in \param count.
1687    * \param modifiers Buffer to fill modifiers into.
1688    * \param count     Count of the modifiers returned, or, total number of
1689    *                  supported modifiers for \param fourcc in case
1690    *                  \param max is zero.
1691    *
1692    * Returns true upon success.
1693    *
1694    * \since 15
1695    */
1696   GLboolean (*queryDmaBufModifiers)(__DRIscreen *screen, int fourcc,
1697                                     int max, uint64_t *modifiers,
1698                                     unsigned int *external_only,
1699                                     int *count);
1700
1701   /**
1702    * dmabuf format modifier attribute query for a given format and modifier.
1703    *
1704    * \param fourcc    The format to query. If this format is not supported by
1705    *                  the driver, return false.
1706    * \param modifier  The modifier to query. If this format+modifier is not
1707    *                  supported by the driver, return false.
1708    * \param attrib    The __DRI_IMAGE_FORMAT_MODIFIER_ATTRIB to query.
1709    * \param value     A pointer to where to store the result of the query.
1710    *
1711    * Returns true upon success.
1712    *
1713    * \since 16
1714    */
1715   GLboolean (*queryDmaBufFormatModifierAttribs)(__DRIscreen *screen,
1716                                                 uint32_t fourcc, uint64_t modifier,
1717                                                 int attrib, uint64_t *value);
1718
1719   /**
1720    * Create a DRI image from the given renderbuffer.
1721    *
1722    * \param context       the current DRI context
1723    * \param renderbuffer  the GL name of the renderbuffer
1724    * \param loaderPrivate for callbacks into the loader related to the image
1725    * \param error         will be set to one of __DRI_IMAGE_ERROR_xxx
1726    * \return the newly created image on success, or NULL otherwise
1727    *
1728    * \since 17
1729    */
1730    __DRIimage *(*createImageFromRenderbuffer2)(__DRIcontext *context,
1731                                                int renderbuffer,
1732                                                void *loaderPrivate,
1733                                                unsigned *error);
1734};
1735
1736
1737/**
1738 * This extension must be implemented by the loader and passed to the
1739 * driver at screen creation time.  The EGLImage entry points in the
1740 * various client APIs take opaque EGLImage handles and use this
1741 * extension to map them to a __DRIimage.  At version 1, this
1742 * extensions allows mapping EGLImage pointers to __DRIimage pointers,
1743 * but future versions could support other EGLImage-like, opaque types
1744 * with new lookup functions.
1745 */
1746#define __DRI_IMAGE_LOOKUP "DRI_IMAGE_LOOKUP"
1747#define __DRI_IMAGE_LOOKUP_VERSION 1
1748
1749typedef struct __DRIimageLookupExtensionRec __DRIimageLookupExtension;
1750struct __DRIimageLookupExtensionRec {
1751    __DRIextension base;
1752
1753    __DRIimage *(*lookupEGLImage)(__DRIscreen *screen, void *image,
1754				  void *loaderPrivate);
1755};
1756
1757/**
1758 * This extension allows for common DRI2 options
1759 */
1760#define __DRI2_CONFIG_QUERY "DRI_CONFIG_QUERY"
1761#define __DRI2_CONFIG_QUERY_VERSION 1
1762
1763typedef struct __DRI2configQueryExtensionRec __DRI2configQueryExtension;
1764struct __DRI2configQueryExtensionRec {
1765   __DRIextension base;
1766
1767   int (*configQueryb)(__DRIscreen *screen, const char *var, unsigned char *val);
1768   int (*configQueryi)(__DRIscreen *screen, const char *var, int *val);
1769   int (*configQueryf)(__DRIscreen *screen, const char *var, float *val);
1770};
1771
1772/**
1773 * Robust context driver extension.
1774 *
1775 * Existence of this extension means the driver can accept the
1776 * \c __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS flag and the
1777 * \c __DRI_CTX_ATTRIB_RESET_STRATEGY attribute in
1778 * \c __DRIdri2ExtensionRec::createContextAttribs.
1779 */
1780#define __DRI2_ROBUSTNESS "DRI_Robustness"
1781#define __DRI2_ROBUSTNESS_VERSION 1
1782
1783typedef struct __DRIrobustnessExtensionRec __DRIrobustnessExtension;
1784struct __DRIrobustnessExtensionRec {
1785   __DRIextension base;
1786};
1787
1788/**
1789 * No-error context driver extension.
1790 *
1791 * Existence of this extension means the driver can accept the
1792 * __DRI_CTX_FLAG_NO_ERROR flag.
1793 */
1794#define __DRI2_NO_ERROR "DRI_NoError"
1795#define __DRI2_NO_ERROR_VERSION 1
1796
1797typedef struct __DRInoErrorExtensionRec {
1798   __DRIextension base;
1799} __DRInoErrorExtension;
1800
1801/*
1802 * Flush control driver extension.
1803 *
1804 * Existence of this extension means the driver can accept the
1805 * \c __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR attribute in
1806 * \c __DRIdri2ExtensionRec::createContextAttribs.
1807 */
1808#define __DRI2_FLUSH_CONTROL "DRI_FlushControl"
1809#define __DRI2_FLUSH_CONTROL_VERSION 1
1810
1811typedef struct __DRI2flushControlExtensionRec __DRI2flushControlExtension;
1812struct __DRI2flushControlExtensionRec {
1813   __DRIextension base;
1814};
1815
1816/**
1817 * DRI config options extension.
1818 *
1819 * This extension provides the XML string containing driver options for use by
1820 * the loader in supporting the driconf application.
1821 *
1822 * v2:
1823 * - Add the getXml getter function which allows the driver more flexibility in
1824 *   how the XML is provided.
1825 * - Deprecate the direct xml pointer. It is only provided as a fallback for
1826 *   older versions of libGL and must not be used by clients that are aware of
1827 *   the newer version. Future driver versions may set it to NULL.
1828 */
1829#define __DRI_CONFIG_OPTIONS "DRI_ConfigOptions"
1830#define __DRI_CONFIG_OPTIONS_VERSION 2
1831
1832typedef struct __DRIconfigOptionsExtensionRec {
1833   __DRIextension base;
1834   const char *xml; /**< deprecated since v2, use getXml instead */
1835
1836   /**
1837    * Get an XML string that describes available driver options for use by a
1838    * config application.
1839    *
1840    * The returned string must be heap-allocated. The caller is responsible for
1841    * freeing it.
1842    */
1843   char *(*getXml)(const char *driver_name);
1844} __DRIconfigOptionsExtension;
1845
1846/**
1847 * This extension provides a driver vtable to a set of common driver helper
1848 * functions (driCoreExtension, driDRI2Extension) within the driver
1849 * implementation, as opposed to having to pass them through a global
1850 * variable.
1851 *
1852 * It is not intended to be public API to the actual loader, and the vtable
1853 * layout may change at any time.
1854 */
1855#define __DRI_DRIVER_VTABLE "DRI_DriverVtable"
1856#define __DRI_DRIVER_VTABLE_VERSION 1
1857
1858typedef struct __DRIDriverVtableExtensionRec {
1859    __DRIextension base;
1860    const struct __DriverAPIRec *vtable;
1861} __DRIDriverVtableExtension;
1862
1863/**
1864 * Query renderer driver extension
1865 *
1866 * This allows the window system layer (either EGL or GLX) to query aspects of
1867 * hardware and driver support without creating a context.
1868 */
1869#define __DRI2_RENDERER_QUERY "DRI_RENDERER_QUERY"
1870#define __DRI2_RENDERER_QUERY_VERSION 1
1871
1872#define __DRI2_RENDERER_VENDOR_ID                             0x0000
1873#define __DRI2_RENDERER_DEVICE_ID                             0x0001
1874#define __DRI2_RENDERER_VERSION                               0x0002
1875#define __DRI2_RENDERER_ACCELERATED                           0x0003
1876#define __DRI2_RENDERER_VIDEO_MEMORY                          0x0004
1877#define __DRI2_RENDERER_UNIFIED_MEMORY_ARCHITECTURE           0x0005
1878#define __DRI2_RENDERER_PREFERRED_PROFILE                     0x0006
1879#define __DRI2_RENDERER_OPENGL_CORE_PROFILE_VERSION           0x0007
1880#define __DRI2_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION  0x0008
1881#define __DRI2_RENDERER_OPENGL_ES_PROFILE_VERSION             0x0009
1882#define __DRI2_RENDERER_OPENGL_ES2_PROFILE_VERSION            0x000a
1883#define __DRI2_RENDERER_HAS_TEXTURE_3D                        0x000b
1884/* Whether there is an sRGB format support for every supported 32-bit UNORM
1885 * color format.
1886 */
1887#define __DRI2_RENDERER_HAS_FRAMEBUFFER_SRGB                  0x000c
1888
1889/* Bitmaks of supported/available context priorities - must match
1890 * __EGL_CONTEXT_PRIORITY_LOW_BIT et al
1891 */
1892#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY                  0x000d
1893#define   __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_LOW            (1 << 0)
1894#define   __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_MEDIUM         (1 << 1)
1895#define   __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_HIGH           (1 << 2)
1896
1897typedef struct __DRI2rendererQueryExtensionRec __DRI2rendererQueryExtension;
1898struct __DRI2rendererQueryExtensionRec {
1899   __DRIextension base;
1900
1901   int (*queryInteger)(__DRIscreen *screen, int attribute, unsigned int *val);
1902   int (*queryString)(__DRIscreen *screen, int attribute, const char **val);
1903};
1904
1905/**
1906 * Image Loader extension. Drivers use this to allocate color buffers
1907 */
1908
1909/**
1910 * See __DRIimageLoaderExtensionRec::getBuffers::buffer_mask.
1911 */
1912enum __DRIimageBufferMask {
1913   __DRI_IMAGE_BUFFER_BACK = (1 << 0),
1914   __DRI_IMAGE_BUFFER_FRONT = (1 << 1),
1915
1916   /**
1917    * A buffer shared between application and compositor. The buffer may be
1918    * simultaneously accessed by each.
1919    *
1920    * A shared buffer is equivalent to an EGLSurface whose EGLConfig contains
1921    * EGL_MUTABLE_RENDER_BUFFER_BIT_KHR and whose active EGL_RENDER_BUFFER (as
1922    * opposed to any pending, requested change to EGL_RENDER_BUFFER) is
1923    * EGL_SINGLE_BUFFER.
1924    *
1925    * If buffer_mask contains __DRI_IMAGE_BUFFER_SHARED, then must contains no
1926    * other bits. As a corollary, a __DRIdrawable that has a "shared" buffer
1927    * has no front nor back buffer.
1928    *
1929    * The loader returns __DRI_IMAGE_BUFFER_SHARED in buffer_mask if and only
1930    * if:
1931    *     - The loader supports __DRI_MUTABLE_RENDER_BUFFER_LOADER.
1932    *     - The driver supports __DRI_MUTABLE_RENDER_BUFFER_DRIVER.
1933    *     - The EGLConfig of the drawable EGLSurface contains
1934    *       EGL_MUTABLE_RENDER_BUFFER_BIT_KHR.
1935    *     - The EGLContext's EGL_RENDER_BUFFER is EGL_SINGLE_BUFFER.
1936    *       Equivalently, the EGLSurface's active EGL_RENDER_BUFFER (as
1937    *       opposed to any pending, requested change to EGL_RENDER_BUFFER) is
1938    *       EGL_SINGLE_BUFFER. (See the EGL 1.5 and
1939    *       EGL_KHR_mutable_render_buffer spec for details about "pending" vs
1940    *       "active" EGL_RENDER_BUFFER state).
1941    *
1942    * A shared buffer is similar to a front buffer in that all rendering to the
1943    * buffer should appear promptly on the screen. It is different from
1944    * a front buffer in that its behavior is independent from the
1945    * GL_DRAW_BUFFER state. Specifically, if GL_DRAW_FRAMEBUFFER is 0 and the
1946    * __DRIdrawable's buffer_mask is __DRI_IMAGE_BUFFER_SHARED, then all
1947    * rendering should appear promptly on the screen if GL_DRAW_BUFFER is not
1948    * GL_NONE.
1949    *
1950    * The difference between a shared buffer and a front buffer is motivated
1951    * by the constraints of Android and OpenGL ES. OpenGL ES does not support
1952    * front-buffer rendering. Android's SurfaceFlinger protocol provides the
1953    * EGL driver only a back buffer and no front buffer. The shared buffer
1954    * mode introduced by EGL_KHR_mutable_render_buffer is a backdoor though
1955    * EGL that allows Android OpenGL ES applications to render to what is
1956    * effectively the front buffer, a backdoor that required no change to the
1957    * OpenGL ES API and little change to the SurfaceFlinger API.
1958    */
1959   __DRI_IMAGE_BUFFER_SHARED = (1 << 2),
1960};
1961
1962struct __DRIimageList {
1963   uint32_t image_mask;
1964   __DRIimage *back;
1965   __DRIimage *front;
1966};
1967
1968#define __DRI_IMAGE_LOADER "DRI_IMAGE_LOADER"
1969#define __DRI_IMAGE_LOADER_VERSION 3
1970
1971struct __DRIimageLoaderExtensionRec {
1972    __DRIextension base;
1973
1974   /**
1975    * Allocate color buffers.
1976    *
1977    * \param driDrawable
1978    * \param width              Width of allocated buffers
1979    * \param height             Height of allocated buffers
1980    * \param format             one of __DRI_IMAGE_FORMAT_*
1981    * \param stamp              Address of variable to be updated when
1982    *                           getBuffers must be called again
1983    * \param loaderPrivate      The loaderPrivate for driDrawable
1984    * \param buffer_mask        Set of buffers to allocate. A bitmask of
1985    *                           __DRIimageBufferMask.
1986    * \param buffers            Returned buffers
1987    */
1988   int (*getBuffers)(__DRIdrawable *driDrawable,
1989                     unsigned int format,
1990                     uint32_t *stamp,
1991                     void *loaderPrivate,
1992                     uint32_t buffer_mask,
1993                     struct __DRIimageList *buffers);
1994
1995    /**
1996     * Flush pending front-buffer rendering
1997     *
1998     * Any rendering that has been performed to the
1999     * fake front will be flushed to the front
2000     *
2001     * \param driDrawable    Drawable whose front-buffer is to be flushed
2002     * \param loaderPrivate  Loader's private data that was previously passed
2003     *                       into __DRIdri2ExtensionRec::createNewDrawable
2004     */
2005    void (*flushFrontBuffer)(__DRIdrawable *driDrawable, void *loaderPrivate);
2006
2007    /**
2008     * Return a loader capability value. If the loader doesn't know the enum,
2009     * it will return 0.
2010     *
2011     * \since 2
2012     */
2013    unsigned (*getCapability)(void *loaderPrivate, enum dri_loader_cap cap);
2014
2015    /**
2016     * Flush swap buffers
2017     *
2018     * Make sure any outstanding swap buffers have been submitted to the
2019     * device.
2020     *
2021     * \param driDrawable    Drawable whose swaps need to be flushed
2022     * \param loaderPrivate  Loader's private data that was previously passed
2023     *                       into __DRIdri2ExtensionRec::createNewDrawable
2024     *
2025     * \since 3
2026     */
2027    void (*flushSwapBuffers)(__DRIdrawable *driDrawable, void *loaderPrivate);
2028};
2029
2030/**
2031 * DRI extension.
2032 */
2033
2034#define __DRI_IMAGE_DRIVER           "DRI_IMAGE_DRIVER"
2035#define __DRI_IMAGE_DRIVER_VERSION   1
2036
2037struct __DRIimageDriverExtensionRec {
2038   __DRIextension               base;
2039
2040   /* Common DRI functions, shared with DRI2 */
2041   __DRIcreateNewScreen2Func            createNewScreen2;
2042   __DRIcreateNewDrawableFunc           createNewDrawable;
2043   __DRIcreateContextAttribsFunc        createContextAttribs;
2044   __DRIgetAPIMaskFunc                  getAPIMask;
2045};
2046
2047/**
2048 * Background callable loader extension.
2049 *
2050 * Loaders expose this extension to indicate to drivers that they are capable
2051 * of handling callbacks from the driver's background drawing threads.
2052 */
2053#define __DRI_BACKGROUND_CALLABLE "DRI_BackgroundCallable"
2054#define __DRI_BACKGROUND_CALLABLE_VERSION 1
2055
2056typedef struct __DRIbackgroundCallableExtensionRec __DRIbackgroundCallableExtension;
2057struct __DRIbackgroundCallableExtensionRec {
2058   __DRIextension base;
2059
2060   /**
2061    * Indicate that this thread is being used by the driver as a background
2062    * drawing thread which may make callbacks to the loader.
2063    *
2064    * \param loaderPrivate is the value that was passed to to the driver when
2065    * the context was created.  This can be used by the loader to identify
2066    * which context any callbacks are associated with.
2067    *
2068    * If this function is called more than once from any given thread, each
2069    * subsequent call overrides the loaderPrivate data that was passed in the
2070    * previous call.  The driver can take advantage of this to re-use a
2071    * background thread to perform drawing on behalf of multiple contexts.
2072    *
2073    * It is permissible for the driver to call this function from a
2074    * non-background thread (i.e. a thread that has already been bound to a
2075    * context using __DRIcoreExtensionRec::bindContext()); when this happens,
2076    * the \c loaderPrivate pointer must be equal to the pointer that was
2077    * passed to the driver when the currently bound context was created.
2078    *
2079    * This call should execute quickly enough that the driver can call it with
2080    * impunity whenever a background thread starts performing drawing
2081    * operations (e.g. it should just set a thread-local variable).
2082    */
2083   void (*setBackgroundContext)(void *loaderPrivate);
2084
2085   /**
2086    * Indicate that it is multithread safe to use glthread.  For GLX/EGL
2087    * platforms using Xlib, that involves calling XInitThreads, before
2088    * opening an X display.
2089    *
2090    * Note: only supported if extension version is at least 2.
2091    *
2092    * \param loaderPrivate is the value that was passed to to the driver when
2093    * the context was created.  This can be used by the loader to identify
2094    * which context any callbacks are associated with.
2095    */
2096   GLboolean (*isThreadSafe)(void *loaderPrivate);
2097};
2098
2099/**
2100 * The driver portion of EGL_KHR_mutable_render_buffer.
2101 *
2102 * If the driver creates a __DRIconfig with
2103 * __DRI_ATTRIB_MUTABLE_RENDER_BUFFER, then it must support this extension.
2104 *
2105 * To support this extension:
2106 *
2107 *    - The driver should create at least one __DRIconfig with
2108 *      __DRI_ATTRIB_MUTABLE_RENDER_BUFFER. This is strongly recommended but
2109 *      not required.
2110 *
2111 *    - The driver must be able to handle __DRI_IMAGE_BUFFER_SHARED if
2112 *      returned by __DRIimageLoaderExtension:getBuffers().
2113 *
2114 *    - When rendering to __DRI_IMAGE_BUFFER_SHARED, it must call
2115 *      __DRImutableRenderBufferLoaderExtension::displaySharedBuffer() in
2116 *      response to glFlush and glFinish.  (This requirement is not documented
2117 *      in EGL_KHR_mutable_render_buffer, but is a de-facto requirement in the
2118 *      Android ecosystem. Android applications expect that glFlush will
2119 *      immediately display the buffer when in shared buffer mode, and Android
2120 *      drivers comply with this expectation).  It :may: call
2121 *      displaySharedBuffer() more often than required.
2122 *
2123 *    - When rendering to __DRI_IMAGE_BUFFER_SHARED, it must ensure that the
2124 *      buffer is always in a format compatible for display because the
2125 *      display engine (usually SurfaceFlinger or hwcomposer) may display the
2126 *      image at any time, even concurrently with 3D rendering. For example,
2127 *      display hardware and the GL hardware may be able to access the buffer
2128 *      simultaneously. In particular, if the buffer is compressed then take
2129 *      care that SurfaceFlinger and hwcomposer can consume the compression
2130 *      format.
2131 *
2132 * \see __DRI_IMAGE_BUFFER_SHARED
2133 * \see __DRI_ATTRIB_MUTABLE_RENDER_BUFFER
2134 * \see __DRI_MUTABLE_RENDER_BUFFER_LOADER
2135 */
2136#define __DRI_MUTABLE_RENDER_BUFFER_DRIVER "DRI_MutableRenderBufferDriver"
2137#define __DRI_MUTABLE_RENDER_BUFFER_DRIVER_VERSION 1
2138
2139typedef struct __DRImutableRenderBufferDriverExtensionRec __DRImutableRenderBufferDriverExtension;
2140struct __DRImutableRenderBufferDriverExtensionRec {
2141   __DRIextension base;
2142};
2143
2144/**
2145 * The loader portion of EGL_KHR_mutable_render_buffer.
2146 *
2147 * Requires loader extension DRI_IMAGE_LOADER, through which the loader sends
2148 * __DRI_IMAGE_BUFFER_SHARED to the driver.
2149 *
2150 * \see __DRI_MUTABLE_RENDER_BUFFER_DRIVER
2151 */
2152#define __DRI_MUTABLE_RENDER_BUFFER_LOADER "DRI_MutableRenderBufferLoader"
2153#define __DRI_MUTABLE_RENDER_BUFFER_LOADER_VERSION 1
2154
2155typedef struct __DRImutableRenderBufferLoaderExtensionRec __DRImutableRenderBufferLoaderExtension;
2156struct __DRImutableRenderBufferLoaderExtensionRec {
2157   __DRIextension base;
2158
2159   /**
2160    * Inform the display engine (that is, SurfaceFlinger and/or hwcomposer)
2161    * that the __DRIdrawable has new content.
2162    *
2163    * The display engine may ignore this call, for example, if it continually
2164    * refreshes and displays the buffer on every frame, as in
2165    * EGL_ANDROID_front_buffer_auto_refresh. On the other extreme, the display
2166    * engine may refresh and display the buffer only in frames in which the
2167    * driver calls this.
2168    *
2169    * If the fence_fd is not -1, then the display engine will display the
2170    * buffer only after the fence signals.
2171    *
2172    * The drawable's current __DRIimageBufferMask, as returned by
2173    * __DRIimageLoaderExtension::getBuffers(), must be
2174    * __DRI_IMAGE_BUFFER_SHARED.
2175    */
2176   void (*displaySharedBuffer)(__DRIdrawable *drawable, int fence_fd,
2177                               void *loaderPrivate);
2178};
2179
2180#endif
2181