Home | History | Annotate | Download | only in common
      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 (at) precisioninsight.com>
     44  * \author Brian Paul <brian (at) 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