dri_util.h revision 8d12a6d537ca346291bc3e3bc90cc73509f4b419
1680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/* $XFree86: xc/lib/GL/dri/dri_util.h,v 1.1 2002/02/22 21:32:52 dawes Exp $ */
2680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
3680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \file dri_util.h
4680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * DRI utility functions definitions.
5680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
6680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This module acts as glue between GLX and the actual hardware driver.  A DRI
7680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * driver doesn't really \e have to use any of this - it's optional.  But, some
8680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * useful stuff is done here that otherwise would have to be duplicated in most
9680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * drivers.
10680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
11680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Basically, these utility functions take care of some of the dirty details of
12680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * screen initialization, context creation, context binding, DRM setup, etc.
13680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
14680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * These functions are compiled into each DRI driver so libGL.so knows nothing
15680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * about them.
16680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
17680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \sa dri_util.c.
18680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
19680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \author Kevin E. Martin <kevin@precisioninsight.com>
20680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \author Brian Paul <brian@precisioninsight.com>
21680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
22680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
23680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*
24680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
25680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * All Rights Reserved.
26680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
27680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
28680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * copy of this software and associated documentation files (the
29680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * "Software"), to deal in the Software without restriction, including
30680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
31680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
32680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
33680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * the following conditions:
34680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
35680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * The above copyright notice and this permission notice (including the
36680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
37680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * of the Software.
38680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
39680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
40680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
41680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
42680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
43680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
44680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
45680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
46680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
47680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
48680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
49680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#ifndef _DRI_UTIL_H_
50680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define _DRI_UTIL_H_
51680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
52680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define CAPI  /* XXX this should be globally defined somewhere */
53680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
54e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#ifdef DRI_NEW_INTERFACE_ONLY
55e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick# include <GL/gl.h>
56e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#else
57e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick# include "glxclient.h"
58e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#endif /* DRI_NEW_INTERFACE_ONLY */
59e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#include "drm.h"
60e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#include "drm_sarea.h"
61e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#include "GL/internal/glcore.h"
62e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#include "GL/internal/dri_interface.h"
63e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick
64e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#define GLX_BAD_CONTEXT                    5
65680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
665c113461df885d2de7eae405e058fb97cf4028dcIan Romanick/* This is a temporary relic.  Once all drivers are converted to support
675c113461df885d2de7eae405e058fb97cf4028dcIan Romanick * the new interface, it can go away.
685c113461df885d2de7eae405e058fb97cf4028dcIan Romanick */
695c113461df885d2de7eae405e058fb97cf4028dcIan Romanick#ifdef DRI_NEW_INTERFACE_ONLY
705c113461df885d2de7eae405e058fb97cf4028dcIan Romanick#define USE_NEW_INTERFACE
715c113461df885d2de7eae405e058fb97cf4028dcIan Romanick#endif
72680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
73680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIdisplayPrivateRec  __DRIdisplayPrivate;
74680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIscreenPrivateRec   __DRIscreenPrivate;
75680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIcontextPrivateRec  __DRIcontextPrivate;
76680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIdrawablePrivateRec __DRIdrawablePrivate;
77680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIswapInfoRec        __DRIswapInfo;
787104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheideggertypedef struct __DRIutilversionRec2    __DRIutilversion2;
79680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
80680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
81680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
82680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Used by DRI_VALIDATE_DRAWABLE_INFO
83680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
84680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define DRI_VALIDATE_DRAWABLE_INFO_ONCE(pDrawPriv)              \
85680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    do {                                                        \
86680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	if (*(pDrawPriv->pStamp) != pDrawPriv->lastStamp) {     \
87680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	    __driUtilUpdateDrawableInfo(pDrawPriv);             \
88680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	}                                                       \
89680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    } while (0)
90680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
91680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
92680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
93680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Utility macro to validate the drawable information.
94680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
95680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * See __DRIdrawablePrivate::pStamp and __DRIdrawablePrivate::lastStamp.
96680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
97680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define DRI_VALIDATE_DRAWABLE_INFO(psp, pdp)                            \
98680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelldo {                                                                    \
99680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    while (*(pdp->pStamp) != pdp->lastStamp) {                          \
100680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRM_UNLOCK(psp->fd, &psp->pSAREA->lock,                         \
101680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		   pdp->driContextPriv->hHWContext);                    \
102680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                                                                        \
103680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);     \
104680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRI_VALIDATE_DRAWABLE_INFO_ONCE(pdp);                           \
105680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);   \
106680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                                                                        \
107680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRM_LIGHT_LOCK(psp->fd, &psp->pSAREA->lock,                     \
108680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       pdp->driContextPriv->hHWContext);                \
109680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }                                                                   \
110680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} while (0)
111680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
112680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
113680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
114680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Driver callback functions.
115680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
116680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Each DRI driver must have one of these structures with all the pointers set
117680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * to appropriate functions within the driver.
118680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
119680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * When glXCreateContext() is called, for example, it'll call a helper function
120680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * dri_util.c which in turn will jump through the \a CreateContext pointer in
121680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * this structure.
122680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
123680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DriverAPIRec {
124680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
125680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Driver initialization callback
126680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
127680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*InitDriver)(__DRIscreenPrivate *driScrnPriv);
128680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
129680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
130680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Screen destruction callback
131680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
132680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyScreen)(__DRIscreenPrivate *driScrnPriv);
133680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
134680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
135680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context creation callback
136680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
137680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*CreateContext)(const __GLcontextModes *glVis,
138680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                               __DRIcontextPrivate *driContextPriv,
139680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                               void *sharedContextPrivate);
140680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
141680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
142680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context destruction callback
143680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
144680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyContext)(__DRIcontextPrivate *driContextPriv);
145680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
146680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
147680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer (drawable) creation callback
148680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
149680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*CreateBuffer)(__DRIscreenPrivate *driScrnPriv,
150680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              __DRIdrawablePrivate *driDrawPriv,
151680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              const __GLcontextModes *glVis,
152680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              GLboolean pixmapBuffer);
153680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
154680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
155680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer (drawable) destruction callback
156680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
157680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyBuffer)(__DRIdrawablePrivate *driDrawPriv);
158680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
159680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
160680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer swapping callback
161680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
162680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*SwapBuffers)(__DRIdrawablePrivate *driDrawPriv);
163680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
164680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
165680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context activation callback
166680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
167680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*MakeCurrent)(__DRIcontextPrivate *driContextPriv,
168680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                             __DRIdrawablePrivate *driDrawPriv,
169680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                             __DRIdrawablePrivate *driReadPriv);
170680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
171680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
172680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context unbinding callback
173680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
174680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*UnbindContext)(__DRIcontextPrivate *driContextPriv);
175680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
176680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
177680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Retrieves statistics about buffer swap operations.  Required if
178680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * GLX_OML_sync_control or GLX_MESA_swap_frame_usage is supported.
179680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
180680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*GetSwapInfo)( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo );
181680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
182680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
183680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
184680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Required if GLX_SGI_video_sync or GLX_OML_sync_control is
185680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * supported.
186680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
187680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*GetMSC)( __DRIscreenPrivate * priv, int64_t * count );
188680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
189680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
190680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * These are required if GLX_OML_sync_control is supported.
191680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
192680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
193680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*WaitForMSC)( __DRIdrawablePrivate *priv, int64_t target_msc,
194680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t divisor, int64_t remainder,
195680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t * msc );
196680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*WaitForSBC)( __DRIdrawablePrivate *priv, int64_t target_sbc,
197680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t * msc, int64_t * sbc );
198680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
199680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int64_t (*SwapBuffersMSC)( __DRIdrawablePrivate *priv, int64_t target_msc,
200680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell			       int64_t divisor, int64_t remainder );
201680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
202680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
203680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
204680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
205680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIswapInfoRec {
206680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
207680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Number of swapBuffers operations that have been *completed*.
208680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
20938b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane    u_int64_t swap_count;
210680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
211680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
212680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Unadjusted system time of the last buffer swap.  This is the time
213680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * when the swap completed, not the time when swapBuffers was called.
214680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
215680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int64_t   swap_ust;
216680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
217680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
218680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Number of swap operations that occurred after the swap deadline.  That
219680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * is if a swap happens more than swap_interval frames after the previous
220680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * swap, it has missed its deadline.  If swap_interval is 0, then the
221680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * swap deadline is 1 frame after the previous swap.
222680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
22338b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane    u_int64_t swap_missed_count;
224680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
225680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
226680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Amount of time used by the last swap that missed its deadline.  This
227680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * is calculated as (__glXGetUST() - swap_ust) / (swap_interval *
228680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * time_for_single_vrefresh)).  If the actual value of swap_interval is
229680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * 0, then 1 is used instead.  If swap_missed_count is non-zero, this
230680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * should be greater-than 1.0.
231680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
232680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    float     swap_missed_usage;
233680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
234680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
235680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
236680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
237680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-drawable private DRI driver information.
238680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
239680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIdrawablePrivateRec {
240680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
241680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Kernel drawable handle
242680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
243c06b25594e5effe34a90c067e1a3da0f61cf2b13Ian Romanick    drm_drawable_t hHWDrawable;
244680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
245680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
246680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Driver's private drawable information.
247680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
248680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This structure is opaque.
249680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
250680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *driverPrivate;
251680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
252680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
253680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * X's drawable ID associated with this private drawable.
254680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
2550521ab46c1340d785ecfe64f4041c86912bc86afIan Romanick    __DRIid draw;
256680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIdrawable *pdraw;
257680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
258680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
259680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Reference count for number of context's currently bound to this
260680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * drawable.
261680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
262680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Once it reaches zero, the drawable can be destroyed.
263680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
264680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \note This behavior will change with GLX 1.3.
265680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
266680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int refcount;
267680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
268680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
269680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Index of this drawable information in the SAREA.
270680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
271680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int index;
272680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
273680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
274680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to the "drawable has changed ID" stamp in the SAREA.
275680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
276680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int *pStamp;
277680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
278680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
279680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Last value of the stamp.
280680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
281680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * If this differs from the value stored at __DRIdrawablePrivate::pStamp,
282680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * then the drawable information has been modified by the X server, and the
283680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * drawable information (below) should be retrieved from the X server.
284680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
285680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int lastStamp;
286680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
287680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
288680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Drawable
289680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
290680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Drawable information used in software fallbacks.
291680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
292680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
293680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int x;
294680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int y;
295680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int w;
296680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int h;
297680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int numClipRects;
298f7423f462882ce96725e84cf7f28cee2c45f801bDave Airlie    drm_clip_rect_t *pClipRects;
299680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
300680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
301680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
302680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Back and depthbuffer
303680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
304680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Information about the back and depthbuffer where different from above.
305680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
306680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
307680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backX;
308680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backY;
309680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backClipRectType;
310680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int numBackClipRects;
311f7423f462882ce96725e84cf7f28cee2c45f801bDave Airlie    drm_clip_rect_t *pBackClipRects;
312680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
313680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
314680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
315680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to context to which this drawable is currently bound.
316680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
317680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIcontextPrivate *driContextPriv;
318680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
319680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
320680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to screen on which this drawable was created.
321680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
322680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreenPrivate *driScreenPriv;
323680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
324680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
325680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Display and screen information.
326680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
327680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Basically just need these for when the locking code needs to call
328680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * __driUtilUpdateDrawableInfo() which calls XF86DRIGetDrawableInfo().
329680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
330680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
33160b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    __DRInativeDisplay *display;
332680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int screen;
333680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
334680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
335680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
336680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Called via glXSwapBuffers().
337680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
338680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*swapBuffers)( __DRIdrawablePrivate *dPriv );
339680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
340680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
341680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Get information about the location, size, and clip rects of the
342680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * drawable within the display.
343680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
34460b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    PFNGLXGETDRAWABLEINFOPROC getInfo;
345680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
346680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
347680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
348680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-context private driver information.
349680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
350680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIcontextPrivateRec {
351680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
352680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Kernel context handle used to access the device lock.
353680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
3546632a751be851699eebc85082ebb83a2c3a9da79Ian Romanick    __DRIid contextID;
355680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
356680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
357680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Kernel context handle used to access the device lock.
358680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
359c06b25594e5effe34a90c067e1a3da0f61cf2b13Ian Romanick    drm_context_t hHWContext;
360680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
361680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
362680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Device driver's private context data.  This structure is opaque.
363680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
364680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *driverPrivate;
365680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
366680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
367680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This context's display pointer.
368680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
36960b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    __DRInativeDisplay *display;
370680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
371680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
372680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to drawable currently bound to this context.
373680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
374680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIdrawablePrivate *driDrawablePriv;
375680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
376680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
377680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to screen on which this context was created.
378680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
379680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreenPrivate *driScreenPriv;
380680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
381680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
382680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
383680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-screen private driver information.
384680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
385680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIscreenPrivateRec {
386680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
387680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Display for this screen
388680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
38960b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    __DRInativeDisplay *display;
390680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
391680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
392680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Current screen's number
393680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
394680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int myNum;
395680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
396680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
397680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Callback functions into the hardware-specific DRI driver code.
398680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
399680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    struct __DriverAPIRec DriverAPI;
400680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
401680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
402680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name DDX version
403680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DDX / 2D driver version information.
404680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \todo Replace these fields with a \c __DRIversionRec.
405680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
406680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
407680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int ddxMajor;
408680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int ddxMinor;
409680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int ddxPatch;
410680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
411680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
412680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
413680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name DRI version
414680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DRI X extension version information.
415680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \todo Replace these fields with a \c __DRIversionRec.
416680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
417680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
418680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int driMajor;
419680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int driMinor;
420680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int driPatch;
421680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
422680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
423680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
424680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name DRM version
425680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DRM (kernel module) version information.
426680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \todo Replace these fields with a \c __DRIversionRec.
427680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
428680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
429680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drmMajor;
430680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drmMinor;
431680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drmPatch;
432680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
433680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
434680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
435680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * ID used when the client sets the drawable lock.
436680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
437680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * The X server uses this value to detect if the client has died while
438680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * holding the drawable lock.
439680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
440680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drawLockID;
441680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
442680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
443680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * File descriptor returned when the kernel device driver is opened.
444680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
445680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used to:
446680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - authenticate client to kernel
447680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - map the frame buffer, SAREA, etc.
448680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - close the kernel device driver
449680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
450680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fd;
451680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
452680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
453680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * SAREA pointer
454680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
455680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used to access:
456680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - the device lock
457680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - the device-independent per-drawable and per-context(?) information
458680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
459ffb36d57a5f6359b5b91b73af60482a0016dd431Jon Smirl    drm_sarea_t *pSAREA;
460680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
461680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
462680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Direct frame buffer access information
463680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used for software fallbacks.
464680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
465680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
466680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned char *pFB;
467680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbSize;
468680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbOrigin;
469680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbStride;
470680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbWidth;
471680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbHeight;
472680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbBPP;
473680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
474680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
475680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
476680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Device-dependent private information (stored in the SAREA).
477680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
478680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This data is accessed by the client driver only.
479680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
480680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
481680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *pDevPriv;
482680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int devPrivSize;
483680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
484680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
485680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
486680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Dummy context to which drawables are bound when not bound to any
487680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * other context.
488680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
489680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * A dummy hHWContext is created for this context, and is used by the GL
490680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * core when a hardware lock is required but the drawable is not currently
491680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * bound (e.g., potentially during a SwapBuffers request).  The dummy
492680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * context is created when the first "real" context is created on this
493680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * screen.
494680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
495680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIcontextPrivate dummyContextPriv;
496680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
497680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
498680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Hash table to hold the drawable information for this screen.
499680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
500680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *drawHash;
501680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
502680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
503680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Device-dependent private information (not stored in the SAREA).
504680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
505680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This pointer is never touched by the DRI layer.
506680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
507680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *private;
508680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
509680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
510680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * GLX visuals / FBConfigs for this screen.  These are stored as a
511680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * linked list.
512680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
513680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \note
514680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This field is \b only used in conjunction with the old interfaces.  If
515680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * the new interfaces are used, this field will be set to \c NULL and will
516680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * not be dereferenced.
517680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
518680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __GLcontextModes *modes;
519680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
520680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
521680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer back to the \c __DRIscreen that contains this structure.
522680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
523680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
524680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreen *psc;
525680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
526680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
527680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
5287104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger/**
5297104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger * Used to store a version which includes a major range instead of a single
5307104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger * major version number.
5317104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger */
5327104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheideggerstruct __DRIutilversionRec2 {
5337104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    major_min;    /** min allowed Major version number. */
5347104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    major_max;    /** max allowed Major version number. */
5357104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    minor;        /**< Minor version number. */
5367104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    patch;        /**< Patch-level. */
5377104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger};
5387104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger
539680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
540680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern void
541680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell__driUtilMessage(const char *f, ...);
542680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
543680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
544680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern void
545680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell__driUtilUpdateDrawableInfo(__DRIdrawablePrivate *pdp);
546680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
547680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
54860b0e12830310e7c05b4043857ed277b28b1c781Ian Romanickextern __DRIscreenPrivate * __driUtilCreateNewScreen( __DRInativeDisplay *dpy,
549680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int scrn, __DRIscreen *psc, __GLcontextModes * modes,
550680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const __DRIversion * ddx_version, const __DRIversion * dri_version,
551680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const __DRIversion * drm_version, const __DRIframebuffer * frame_buffer,
552ffb36d57a5f6359b5b91b73af60482a0016dd431Jon Smirl    drm_sarea_t *pSAREA, int fd, int internal_api_version,
553680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const struct __DriverAPIRec *driverAPI );
554680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
55560b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick#ifndef DRI_NEW_INTERFACE_ONLY
556680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern __DRIscreenPrivate *
557680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell__driUtilCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
558680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                      int numConfigs, __GLXvisualConfig *config,
559680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                      const struct __DriverAPIRec *driverAPI);
56060b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick#endif /* DRI_NEW_INTERFACE_ONLY */
561680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
562680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/* Test the version of the internal GLX API.  Returns a value like strcmp. */
563680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern int
5648d12a6d537ca346291bc3e3bc90cc73509f4b419Dave AirliedriCompareGLXAPIVersion( GLint required_version );
565680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
566680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern float
567680ec7f85158eae58fd5ab56da8c66a645883cb0Keith WhitwelldriCalculateSwapUsage( __DRIdrawablePrivate *dPriv,
568680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t last_swap_ust, int64_t current_ust );
569680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
57086356155018fce96ba3367fd1a48a18cd6db3c40Alan Hourihane/* Test for the GLX header glx.h */
57186356155018fce96ba3367fd1a48a18cd6db3c40Alan Hourihane#ifndef GLX
572c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirlextern void
573c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl(*glXGetProcAddress(const GLubyte *procname))( void );
57486356155018fce96ba3367fd1a48a18cd6db3c40Alan Hourihane#endif
575c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl
576680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#endif /* _DRI_UTIL_H_ */
577