dri_util.h revision aceccda56b08338e217991e54607f1c9f18fc3e6
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
52c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick#include <GL/gl.h>
53e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#include "drm.h"
54e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#include "drm_sarea.h"
5596f216565e09032021bafa7a805aa7707777fda1Brian Paul#include "xf86drm.h"
56e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#include "GL/internal/glcore.h"
57e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#include "GL/internal/dri_interface.h"
58e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick
59e1a7f31c2b47e053ad70f5c4c519e294c273724cIan Romanick#define GLX_BAD_CONTEXT                    5
60680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
61680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIdisplayPrivateRec  __DRIdisplayPrivate;
62680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIscreenPrivateRec   __DRIscreenPrivate;
63680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIcontextPrivateRec  __DRIcontextPrivate;
64680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIdrawablePrivateRec __DRIdrawablePrivate;
65680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelltypedef struct __DRIswapInfoRec        __DRIswapInfo;
667104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheideggertypedef struct __DRIutilversionRec2    __DRIutilversion2;
67680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
68680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
69680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
70680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Used by DRI_VALIDATE_DRAWABLE_INFO
71680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
72680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define DRI_VALIDATE_DRAWABLE_INFO_ONCE(pDrawPriv)              \
73680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    do {                                                        \
74680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	if (*(pDrawPriv->pStamp) != pDrawPriv->lastStamp) {     \
75680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	    __driUtilUpdateDrawableInfo(pDrawPriv);             \
76680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	}                                                       \
77680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    } while (0)
78680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
79680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
80680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
81680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Utility macro to validate the drawable information.
82680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
83680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * See __DRIdrawablePrivate::pStamp and __DRIdrawablePrivate::lastStamp.
84680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
85680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define DRI_VALIDATE_DRAWABLE_INFO(psp, pdp)                            \
86680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelldo {                                                                    \
87680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    while (*(pdp->pStamp) != pdp->lastStamp) {                          \
885ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell        register unsigned int hwContext = psp->pSAREA->lock.lock &      \
895ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell		     ~(DRM_LOCK_HELD | DRM_LOCK_CONT);                  \
905ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	DRM_UNLOCK(psp->fd, &psp->pSAREA->lock, hwContext);             \
91680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                                                                        \
92680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);     \
93680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRI_VALIDATE_DRAWABLE_INFO_ONCE(pdp);                           \
94680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);   \
95680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                                                                        \
965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	DRM_LIGHT_LOCK(psp->fd, &psp->pSAREA->lock, hwContext);         \
97680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }                                                                   \
98680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} while (0)
99680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
100680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
101680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
102680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Driver callback functions.
103680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
104680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Each DRI driver must have one of these structures with all the pointers set
105680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * to appropriate functions within the driver.
106680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
107680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * When glXCreateContext() is called, for example, it'll call a helper function
108680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * dri_util.c which in turn will jump through the \a CreateContext pointer in
109680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * this structure.
110680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
111680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DriverAPIRec {
112680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
113680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Driver initialization callback
114680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
115680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*InitDriver)(__DRIscreenPrivate *driScrnPriv);
116680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
117680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
118680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Screen destruction callback
119680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
120680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyScreen)(__DRIscreenPrivate *driScrnPriv);
121680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
122680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
123680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context creation callback
124680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
125680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*CreateContext)(const __GLcontextModes *glVis,
126680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                               __DRIcontextPrivate *driContextPriv,
127680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                               void *sharedContextPrivate);
128680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
129680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
130680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context destruction callback
131680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
132680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyContext)(__DRIcontextPrivate *driContextPriv);
133680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
134680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
135680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer (drawable) creation callback
136680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
137680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*CreateBuffer)(__DRIscreenPrivate *driScrnPriv,
138680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              __DRIdrawablePrivate *driDrawPriv,
139680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              const __GLcontextModes *glVis,
140680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              GLboolean pixmapBuffer);
141680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
142680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
143680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer (drawable) destruction callback
144680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
145680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyBuffer)(__DRIdrawablePrivate *driDrawPriv);
146680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
147680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
148680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer swapping callback
149680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
150680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*SwapBuffers)(__DRIdrawablePrivate *driDrawPriv);
151680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
152680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
153680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context activation callback
154680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
155680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*MakeCurrent)(__DRIcontextPrivate *driContextPriv,
156680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                             __DRIdrawablePrivate *driDrawPriv,
157680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                             __DRIdrawablePrivate *driReadPriv);
158680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
159680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
160680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context unbinding callback
161680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
162680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*UnbindContext)(__DRIcontextPrivate *driContextPriv);
163680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
164680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
165680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Retrieves statistics about buffer swap operations.  Required if
166680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * GLX_OML_sync_control or GLX_MESA_swap_frame_usage is supported.
167680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
168680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*GetSwapInfo)( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo );
169680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
170680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
171680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
172680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Required if GLX_SGI_video_sync or GLX_OML_sync_control is
173680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * supported.
174680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
175680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*GetMSC)( __DRIscreenPrivate * priv, int64_t * count );
176680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
177680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
178680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * These are required if GLX_OML_sync_control is supported.
179680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
180680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
181680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*WaitForMSC)( __DRIdrawablePrivate *priv, int64_t target_msc,
182680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t divisor, int64_t remainder,
183680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t * msc );
184680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*WaitForSBC)( __DRIdrawablePrivate *priv, int64_t target_sbc,
185680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t * msc, int64_t * sbc );
186680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
187680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int64_t (*SwapBuffersMSC)( __DRIdrawablePrivate *priv, int64_t target_msc,
188680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell			       int64_t divisor, int64_t remainder );
189680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
190f2ad1b60c0da11283b399008f491792790cea294Brian Paul    void (*CopySubBuffer)(__DRIdrawablePrivate *driDrawPriv,
191f2ad1b60c0da11283b399008f491792790cea294Brian Paul			  int x, int y, int w, int h);
192043d219b6da0636886f739613380cf44e334f268Michel Dänzer
193043d219b6da0636886f739613380cf44e334f268Michel Dänzer    /**
194043d219b6da0636886f739613380cf44e334f268Michel Dänzer     * See corresponding field in \c __DRIscreenRec.
195043d219b6da0636886f739613380cf44e334f268Michel Dänzer     */
196043d219b6da0636886f739613380cf44e334f268Michel Dänzer    void (*setTexOffset)(__DRIcontext *pDRICtx, GLint texname,
197043d219b6da0636886f739613380cf44e334f268Michel Dänzer			 unsigned long long offset, GLint depth, GLuint pitch);
198680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
199680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
200680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
201680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIswapInfoRec {
202680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
203680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Number of swapBuffers operations that have been *completed*.
204680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
20538b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane    u_int64_t swap_count;
206680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
207680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
208680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Unadjusted system time of the last buffer swap.  This is the time
209680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * when the swap completed, not the time when swapBuffers was called.
210680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
211680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int64_t   swap_ust;
212680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
213680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
214680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Number of swap operations that occurred after the swap deadline.  That
215680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * is if a swap happens more than swap_interval frames after the previous
216680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * swap, it has missed its deadline.  If swap_interval is 0, then the
217680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * swap deadline is 1 frame after the previous swap.
218680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
21938b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane    u_int64_t swap_missed_count;
220680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
221680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
222680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Amount of time used by the last swap that missed its deadline.  This
223680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * is calculated as (__glXGetUST() - swap_ust) / (swap_interval *
224680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * time_for_single_vrefresh)).  If the actual value of swap_interval is
225680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * 0, then 1 is used instead.  If swap_missed_count is non-zero, this
226680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * should be greater-than 1.0.
227680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
228680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    float     swap_missed_usage;
229680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
230680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
231680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
232680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
233680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-drawable private DRI driver information.
234680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
235680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIdrawablePrivateRec {
236680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
237680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Kernel drawable handle
238680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
239c06b25594e5effe34a90c067e1a3da0f61cf2b13Ian Romanick    drm_drawable_t hHWDrawable;
240680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
241680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
242680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Driver's private drawable information.
243680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
244680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This structure is opaque.
245680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
246680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *driverPrivate;
247680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
248680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
249680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * X's drawable ID associated with this private drawable.
250680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
2510521ab46c1340d785ecfe64f4041c86912bc86afIan Romanick    __DRIid draw;
252680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIdrawable *pdraw;
253680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
254680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
255680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Reference count for number of context's currently bound to this
256680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * drawable.
257680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
258680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Once it reaches zero, the drawable can be destroyed.
259680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
260680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \note This behavior will change with GLX 1.3.
261680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
262680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int refcount;
263680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
264680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
265680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Index of this drawable information in the SAREA.
266680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
267680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int index;
268680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
269680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
270680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to the "drawable has changed ID" stamp in the SAREA.
271680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
272680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int *pStamp;
273680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
274680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
275680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Last value of the stamp.
276680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
277680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * If this differs from the value stored at __DRIdrawablePrivate::pStamp,
278680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * then the drawable information has been modified by the X server, and the
279680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * drawable information (below) should be retrieved from the X server.
280680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
281680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int lastStamp;
282680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
283680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
284680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Drawable
285680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
286680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Drawable information used in software fallbacks.
287680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
288680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
289680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int x;
290680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int y;
291680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int w;
292680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int h;
293680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int numClipRects;
294f7423f462882ce96725e84cf7f28cee2c45f801bDave Airlie    drm_clip_rect_t *pClipRects;
295680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
296680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
297680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
298680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Back and depthbuffer
299680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
300680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Information about the back and depthbuffer where different from above.
301680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
302680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
303680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backX;
304680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backY;
305680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backClipRectType;
306680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int numBackClipRects;
307f7423f462882ce96725e84cf7f28cee2c45f801bDave Airlie    drm_clip_rect_t *pBackClipRects;
308680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
309680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
310680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
311680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to context to which this drawable is currently bound.
312680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
313680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIcontextPrivate *driContextPriv;
314680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
315680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
316680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to screen on which this drawable was created.
317680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
318680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreenPrivate *driScreenPriv;
319680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
320680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
321680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Called via glXSwapBuffers().
322680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
323680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*swapBuffers)( __DRIdrawablePrivate *dPriv );
324680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
325680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
326680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
327680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-context private driver information.
328680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
329680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIcontextPrivateRec {
330680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
331680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Kernel context handle used to access the device lock.
332680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
3336632a751be851699eebc85082ebb83a2c3a9da79Ian Romanick    __DRIid contextID;
334680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
335680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
336680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Kernel context handle used to access the device lock.
337680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
338c06b25594e5effe34a90c067e1a3da0f61cf2b13Ian Romanick    drm_context_t hHWContext;
339680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
340680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
341680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Device driver's private context data.  This structure is opaque.
342680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
343680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *driverPrivate;
344680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
345680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
346aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg     * Pointer back to the \c __DRIcontext that contains this structure.
347680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
348aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg    __DRIcontext *pctx;
349680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
350680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
3517b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick     * Pointer to drawable currently bound to this context for drawing.
352680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
353680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIdrawablePrivate *driDrawablePriv;
354680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
355680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
3567b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick     * Pointer to drawable currently bound to this context for reading.
3577b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick     */
3587b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick    __DRIdrawablePrivate *driReadablePriv;
3597b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick
3607b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick    /**
361680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to screen on which this context was created.
362680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
363680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreenPrivate *driScreenPriv;
364680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
365680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
366680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
367680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-screen private driver information.
368680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
369680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIscreenPrivateRec {
370680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
371680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Current screen's number
372680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
373680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int myNum;
374680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
375680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
376680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Callback functions into the hardware-specific DRI driver code.
377680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
378680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    struct __DriverAPIRec DriverAPI;
379680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
380680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
381680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name DDX version
382680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DDX / 2D driver version information.
383680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \todo Replace these fields with a \c __DRIversionRec.
384680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
385680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
386680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int ddxMajor;
387680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int ddxMinor;
388680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int ddxPatch;
389680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
390680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
391680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
392680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name DRI version
393680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DRI X extension version information.
394680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \todo Replace these fields with a \c __DRIversionRec.
395680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
396680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
397680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int driMajor;
398680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int driMinor;
399680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int driPatch;
400680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
401680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
402680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
403680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name DRM version
404680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DRM (kernel module) version information.
405680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \todo Replace these fields with a \c __DRIversionRec.
406680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
407680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
408680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drmMajor;
409680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drmMinor;
410680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drmPatch;
411680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
412680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
413680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
414680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * ID used when the client sets the drawable lock.
415680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
416680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * The X server uses this value to detect if the client has died while
417680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * holding the drawable lock.
418680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
419680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drawLockID;
420680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
421680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
422680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * File descriptor returned when the kernel device driver is opened.
423680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
424680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used to:
425680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - authenticate client to kernel
426680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - map the frame buffer, SAREA, etc.
427680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - close the kernel device driver
428680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
429680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fd;
430680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
431680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
432680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * SAREA pointer
433680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
434680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used to access:
435680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - the device lock
436680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - the device-independent per-drawable and per-context(?) information
437680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
438ffb36d57a5f6359b5b91b73af60482a0016dd431Jon Smirl    drm_sarea_t *pSAREA;
439680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
440680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
441680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Direct frame buffer access information
442680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used for software fallbacks.
443680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
444680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
445680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned char *pFB;
446680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbSize;
447680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbOrigin;
448680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbStride;
449680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbWidth;
450680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbHeight;
451680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbBPP;
452680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
453680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
454680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
455680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Device-dependent private information (stored in the SAREA).
456680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
457680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This data is accessed by the client driver only.
458680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
459680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
460680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *pDevPriv;
461680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int devPrivSize;
462680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
463680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
464680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
465680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Dummy context to which drawables are bound when not bound to any
466680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * other context.
467680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
468680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * A dummy hHWContext is created for this context, and is used by the GL
469680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * core when a hardware lock is required but the drawable is not currently
470680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * bound (e.g., potentially during a SwapBuffers request).  The dummy
471680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * context is created when the first "real" context is created on this
472680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * screen.
473680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
474680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIcontextPrivate dummyContextPriv;
475680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
476680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
477680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Device-dependent private information (not stored in the SAREA).
478680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
479680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This pointer is never touched by the DRI layer.
480680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
481680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *private;
482680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
483680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
484680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * GLX visuals / FBConfigs for this screen.  These are stored as a
485680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * linked list.
486680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
487680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \note
488680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This field is \b only used in conjunction with the old interfaces.  If
489680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * the new interfaces are used, this field will be set to \c NULL and will
490680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * not be dereferenced.
491680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
492680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __GLcontextModes *modes;
493680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
494680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
495680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer back to the \c __DRIscreen that contains this structure.
496680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
497680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
498680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreen *psc;
499680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
500680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
501680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
5027104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger/**
5037104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger * Used to store a version which includes a major range instead of a single
5047104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger * major version number.
5057104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger */
5067104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheideggerstruct __DRIutilversionRec2 {
5077104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    major_min;    /** min allowed Major version number. */
5087104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    major_max;    /** max allowed Major version number. */
5097104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    minor;        /**< Minor version number. */
5107104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    patch;        /**< Patch-level. */
5117104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger};
5127104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger
513680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
514680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern void
515680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell__driUtilMessage(const char *f, ...);
516680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
517680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
518680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern void
519680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell__driUtilUpdateDrawableInfo(__DRIdrawablePrivate *pdp);
520680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
521680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
522aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsbergextern __DRIscreenPrivate * __driUtilCreateNewScreen( int scr, __DRIscreen *psc,
523aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg    __GLcontextModes * modes,
524680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const __DRIversion * ddx_version, const __DRIversion * dri_version,
525680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const __DRIversion * drm_version, const __DRIframebuffer * frame_buffer,
526ffb36d57a5f6359b5b91b73af60482a0016dd431Jon Smirl    drm_sarea_t *pSAREA, int fd, int internal_api_version,
527680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const struct __DriverAPIRec *driverAPI );
528680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
529680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/* Test the version of the internal GLX API.  Returns a value like strcmp. */
530680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern int
5318d12a6d537ca346291bc3e3bc90cc73509f4b419Dave AirliedriCompareGLXAPIVersion( GLint required_version );
532680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
533680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern float
534680ec7f85158eae58fd5ab56da8c66a645883cb0Keith WhitwelldriCalculateSwapUsage( __DRIdrawablePrivate *dPriv,
535680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t last_swap_ust, int64_t current_ust );
536680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
5375f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick/**
5385f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick * Pointer to the \c __DRIinterfaceMethods passed to the driver by the loader.
5395f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick *
5405f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick * This pointer is set in the driver's \c __driCreateNewScreen function and
5415f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick * is defined in dri_util.c.
5425f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick */
5435f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanickextern const __DRIinterfaceMethods * dri_interface;
544c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl
545680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#endif /* _DRI_UTIL_H_ */
546