Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

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