dri_util.h revision 64106d0d9aeefa6974317042b6bc3e5eaabac5a2
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/**
7064106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * Driver specific entry point.  Implemented by the driver.  Called
7164106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * from the top level createNewScreen entry point to initialize the
7264106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * __DRIscreenPrivate struct.
7364106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg */
7464106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsbergextern __GLcontextModes *__driDriverInitScreen(__DRIscreenPrivate *psp);
7564106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg
7664106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg/**
77680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Used by DRI_VALIDATE_DRAWABLE_INFO
78680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
79680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define DRI_VALIDATE_DRAWABLE_INFO_ONCE(pDrawPriv)              \
80680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    do {                                                        \
81680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	if (*(pDrawPriv->pStamp) != pDrawPriv->lastStamp) {     \
82680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	    __driUtilUpdateDrawableInfo(pDrawPriv);             \
83680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	}                                                       \
84680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    } while (0)
85680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
86680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
87680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
88680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Utility macro to validate the drawable information.
89680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
90680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * See __DRIdrawablePrivate::pStamp and __DRIdrawablePrivate::lastStamp.
91680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
92680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define DRI_VALIDATE_DRAWABLE_INFO(psp, pdp)                            \
93680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwelldo {                                                                    \
94680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    while (*(pdp->pStamp) != pdp->lastStamp) {                          \
955ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell        register unsigned int hwContext = psp->pSAREA->lock.lock &      \
965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell		     ~(DRM_LOCK_HELD | DRM_LOCK_CONT);                  \
975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	DRM_UNLOCK(psp->fd, &psp->pSAREA->lock, hwContext);             \
98680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                                                                        \
99680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);     \
100680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRI_VALIDATE_DRAWABLE_INFO_ONCE(pdp);                           \
101680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);   \
102680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                                                                        \
1035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell	DRM_LIGHT_LOCK(psp->fd, &psp->pSAREA->lock, hwContext);         \
104680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }                                                                   \
105680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} while (0)
106680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
107680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
108680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
109680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Driver callback functions.
110680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
111680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Each DRI driver must have one of these structures with all the pointers set
112680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * to appropriate functions within the driver.
113680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
114680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * When glXCreateContext() is called, for example, it'll call a helper function
115680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * dri_util.c which in turn will jump through the \a CreateContext pointer in
116680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * this structure.
117680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
118680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DriverAPIRec {
119680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
120680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Screen destruction callback
121680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
122680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyScreen)(__DRIscreenPrivate *driScrnPriv);
123680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
124680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
125680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context creation callback
126680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
127680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*CreateContext)(const __GLcontextModes *glVis,
128680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                               __DRIcontextPrivate *driContextPriv,
129680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                               void *sharedContextPrivate);
130680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
131680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
132680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context destruction callback
133680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
134680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyContext)(__DRIcontextPrivate *driContextPriv);
135680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
136680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
137680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer (drawable) creation callback
138680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
139680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*CreateBuffer)(__DRIscreenPrivate *driScrnPriv,
140680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              __DRIdrawablePrivate *driDrawPriv,
141680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              const __GLcontextModes *glVis,
142680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                              GLboolean pixmapBuffer);
143680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
144680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
145680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer (drawable) destruction callback
146680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
147680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*DestroyBuffer)(__DRIdrawablePrivate *driDrawPriv);
148680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
149680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
150680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Buffer swapping callback
151680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
152680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*SwapBuffers)(__DRIdrawablePrivate *driDrawPriv);
153680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
154680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
155680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context activation callback
156680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
157680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*MakeCurrent)(__DRIcontextPrivate *driContextPriv,
158680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                             __DRIdrawablePrivate *driDrawPriv,
159680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell                             __DRIdrawablePrivate *driReadPriv);
160680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
161680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
162680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Context unbinding callback
163680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
164680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    GLboolean (*UnbindContext)(__DRIcontextPrivate *driContextPriv);
165680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
166680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
167680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Retrieves statistics about buffer swap operations.  Required if
168680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * GLX_OML_sync_control or GLX_MESA_swap_frame_usage is supported.
169680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
170680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*GetSwapInfo)( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo );
171680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
172680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
173680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
174680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Required if GLX_SGI_video_sync or GLX_OML_sync_control is
175680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * supported.
176680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
177680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*GetMSC)( __DRIscreenPrivate * priv, int64_t * count );
178680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
179680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
180680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * These are required if GLX_OML_sync_control is supported.
181680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
182680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
183680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*WaitForMSC)( __DRIdrawablePrivate *priv, int64_t target_msc,
184680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t divisor, int64_t remainder,
185680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t * msc );
186680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int (*WaitForSBC)( __DRIdrawablePrivate *priv, int64_t target_sbc,
187680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t * msc, int64_t * sbc );
188680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
189680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int64_t (*SwapBuffersMSC)( __DRIdrawablePrivate *priv, int64_t target_msc,
190680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell			       int64_t divisor, int64_t remainder );
191680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
192f2ad1b60c0da11283b399008f491792790cea294Brian Paul    void (*CopySubBuffer)(__DRIdrawablePrivate *driDrawPriv,
193f2ad1b60c0da11283b399008f491792790cea294Brian Paul			  int x, int y, int w, int h);
194043d219b6da0636886f739613380cf44e334f268Michel Dänzer
195043d219b6da0636886f739613380cf44e334f268Michel Dänzer    /**
196043d219b6da0636886f739613380cf44e334f268Michel Dänzer     * See corresponding field in \c __DRIscreenRec.
197043d219b6da0636886f739613380cf44e334f268Michel Dänzer     */
198043d219b6da0636886f739613380cf44e334f268Michel Dänzer    void (*setTexOffset)(__DRIcontext *pDRICtx, GLint texname,
199043d219b6da0636886f739613380cf44e334f268Michel Dänzer			 unsigned long long offset, GLint depth, GLuint pitch);
200680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
201680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
202680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
203680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIswapInfoRec {
204680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
205680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Number of swapBuffers operations that have been *completed*.
206680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
20738b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane    u_int64_t swap_count;
208680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
209680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
210680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Unadjusted system time of the last buffer swap.  This is the time
211680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * when the swap completed, not the time when swapBuffers was called.
212680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
213680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int64_t   swap_ust;
214680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
215680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
216680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Number of swap operations that occurred after the swap deadline.  That
217680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * is if a swap happens more than swap_interval frames after the previous
218680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * swap, it has missed its deadline.  If swap_interval is 0, then the
219680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * swap deadline is 1 frame after the previous swap.
220680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
22138b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane    u_int64_t swap_missed_count;
222680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
223680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
224680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Amount of time used by the last swap that missed its deadline.  This
225680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * is calculated as (__glXGetUST() - swap_ust) / (swap_interval *
226680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * time_for_single_vrefresh)).  If the actual value of swap_interval is
227680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * 0, then 1 is used instead.  If swap_missed_count is non-zero, this
228680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * should be greater-than 1.0.
229680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
230680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    float     swap_missed_usage;
231680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
232680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
233680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
234680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
235680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-drawable private DRI driver information.
236680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
237680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIdrawablePrivateRec {
238680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
239680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Kernel drawable handle
240680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
241c06b25594e5effe34a90c067e1a3da0f61cf2b13Ian Romanick    drm_drawable_t hHWDrawable;
242680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
243680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
244680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Driver's private drawable information.
245680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
246680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This structure is opaque.
247680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
248680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *driverPrivate;
249680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
250680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
251680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * X's drawable ID associated with this private drawable.
252680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
253680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIdrawable *pdraw;
254680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
255680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
256680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Reference count for number of context's currently bound to this
257680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * drawable.
258680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
259680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Once it reaches zero, the drawable can be destroyed.
260680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
261680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \note This behavior will change with GLX 1.3.
262680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
263680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int refcount;
264680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
265680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
266680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Index of this drawable information in the SAREA.
267680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
268680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int index;
269680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
270680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
271680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to the "drawable has changed ID" stamp in the SAREA.
272680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
273680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int *pStamp;
274680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
275680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
276680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Last value of the stamp.
277680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
278680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * If this differs from the value stored at __DRIdrawablePrivate::pStamp,
279680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * then the drawable information has been modified by the X server, and the
280680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * drawable information (below) should be retrieved from the X server.
281680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
282680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned int lastStamp;
283680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
284680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
285680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Drawable
286680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
287680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Drawable information used in software fallbacks.
288680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
289680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
290680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int x;
291680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int y;
292680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int w;
293680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int h;
294680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int numClipRects;
295f7423f462882ce96725e84cf7f28cee2c45f801bDave Airlie    drm_clip_rect_t *pClipRects;
296680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
297680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
298680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
299680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Back and depthbuffer
300680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
301680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Information about the back and depthbuffer where different from above.
302680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
303680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
304680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backX;
305680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backY;
306680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int backClipRectType;
307680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int numBackClipRects;
308f7423f462882ce96725e84cf7f28cee2c45f801bDave Airlie    drm_clip_rect_t *pBackClipRects;
309680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
310680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
311680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
312680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to context to which this drawable is currently bound.
313680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
314680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIcontextPrivate *driContextPriv;
315680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
316680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
317680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to screen on which this drawable was created.
318680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
319680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreenPrivate *driScreenPriv;
320680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
321680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
322680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Called via glXSwapBuffers().
323680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
324680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void (*swapBuffers)( __DRIdrawablePrivate *dPriv );
325680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
326680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
327680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
328680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-context private driver information.
329680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
330680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIcontextPrivateRec {
331680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
332680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Kernel context handle used to access the device lock.
333680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
334c06b25594e5effe34a90c067e1a3da0f61cf2b13Ian Romanick    drm_context_t hHWContext;
335680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
336680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
337680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Device driver's private context data.  This structure is opaque.
338680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
339680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *driverPrivate;
340680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
341680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
342aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg     * Pointer back to the \c __DRIcontext that contains this structure.
343680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
344aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg    __DRIcontext *pctx;
345680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
346680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
3477b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick     * Pointer to drawable currently bound to this context for drawing.
348680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
349680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIdrawablePrivate *driDrawablePriv;
350680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
351680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
3527b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick     * Pointer to drawable currently bound to this context for reading.
3537b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick     */
3547b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick    __DRIdrawablePrivate *driReadablePriv;
3557b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick
3567b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick    /**
357680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer to screen on which this context was created.
358680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
359680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreenPrivate *driScreenPriv;
360680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
361680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
362680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
363680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Per-screen private driver information.
364680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
365680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstruct __DRIscreenPrivateRec {
366680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
367680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Current screen's number
368680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
369680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int myNum;
370680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
371680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
372680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Callback functions into the hardware-specific DRI driver code.
373680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
374680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    struct __DriverAPIRec DriverAPI;
375680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
376680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
377680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DDX / 2D driver version information.
378680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
379efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg    __DRIversion ddx_version;
380680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
381680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
382680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DRI X extension version information.
383680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
384efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg    __DRIversion dri_version;
385680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
386680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
387680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * DRM (kernel module) version information.
388680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
389efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg    __DRIversion drm_version;
390680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
391680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
392680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * ID used when the client sets the drawable lock.
393680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
394680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * The X server uses this value to detect if the client has died while
395680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * holding the drawable lock.
396680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
397680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int drawLockID;
398680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
399680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
400680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * File descriptor returned when the kernel device driver is opened.
401680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
402680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used to:
403680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - authenticate client to kernel
404680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - map the frame buffer, SAREA, etc.
405680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - close the kernel device driver
406680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
407680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fd;
408680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
409680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
410680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * SAREA pointer
411680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
412680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used to access:
413680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - the device lock
414680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *   - the device-independent per-drawable and per-context(?) information
415680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
416ffb36d57a5f6359b5b91b73af60482a0016dd431Jon Smirl    drm_sarea_t *pSAREA;
417680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
418680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
419680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Direct frame buffer access information
420680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Used for software fallbacks.
421680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
422680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
423680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    unsigned char *pFB;
424680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbSize;
425680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbOrigin;
426680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbStride;
427680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbWidth;
428680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbHeight;
429680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int fbBPP;
430680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
431680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
432680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
433680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \name Device-dependent private information (stored in the SAREA).
434680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
435680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This data is accessed by the client driver only.
436680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
437680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@{*/
438680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *pDevPriv;
439680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    int devPrivSize;
440680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*@}*/
441680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
442680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
443680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Dummy context to which drawables are bound when not bound to any
444680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * other context.
445680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
446680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * A dummy hHWContext is created for this context, and is used by the GL
447680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * core when a hardware lock is required but the drawable is not currently
448680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * bound (e.g., potentially during a SwapBuffers request).  The dummy
449680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * context is created when the first "real" context is created on this
450680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * screen.
451680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
452680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIcontextPrivate dummyContextPriv;
453680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
454680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
455680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Device-dependent private information (not stored in the SAREA).
456680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
457680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This pointer is never touched by the DRI layer.
458680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
459680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    void *private;
460680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
461680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
462680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * GLX visuals / FBConfigs for this screen.  These are stored as a
463680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * linked list.
464680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     *
465680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * \note
466680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * This field is \b only used in conjunction with the old interfaces.  If
467680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * the new interfaces are used, this field will be set to \c NULL and will
468680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * not be dereferenced.
469680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
470680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __GLcontextModes *modes;
471680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
472680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /**
473680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     * Pointer back to the \c __DRIscreen that contains this structure.
474680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell     */
475680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
476680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    __DRIscreen *psc;
477680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell};
478680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
479680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
4807104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger/**
4817104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger * Used to store a version which includes a major range instead of a single
4827104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger * major version number.
4837104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger */
4847104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheideggerstruct __DRIutilversionRec2 {
4857104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    major_min;    /** min allowed Major version number. */
4867104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    major_max;    /** max allowed Major version number. */
4877104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    minor;        /**< Minor version number. */
4887104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger    int    patch;        /**< Patch-level. */
4897104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger};
4907104ce0a0e8f25bf097ad695d007b1a4b3e5d051Roland Scheidegger
491680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
492680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern void
493680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell__driUtilMessage(const char *f, ...);
494680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
495680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
496680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern void
497680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell__driUtilUpdateDrawableInfo(__DRIdrawablePrivate *pdp);
498680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
499680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
500aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsbergextern __DRIscreenPrivate * __driUtilCreateNewScreen( int scr, __DRIscreen *psc,
501aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg    __GLcontextModes * modes,
502680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const __DRIversion * ddx_version, const __DRIversion * dri_version,
503680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const __DRIversion * drm_version, const __DRIframebuffer * frame_buffer,
504ffb36d57a5f6359b5b91b73af60482a0016dd431Jon Smirl    drm_sarea_t *pSAREA, int fd, int internal_api_version,
505680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    const struct __DriverAPIRec *driverAPI );
506680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
507680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/* Test the version of the internal GLX API.  Returns a value like strcmp. */
508680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern int
5098d12a6d537ca346291bc3e3bc90cc73509f4b419Dave AirliedriCompareGLXAPIVersion( GLint required_version );
510680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
511680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellextern float
512680ec7f85158eae58fd5ab56da8c66a645883cb0Keith WhitwelldriCalculateSwapUsage( __DRIdrawablePrivate *dPriv,
513680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell		       int64_t last_swap_ust, int64_t current_ust );
514680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
5155f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick/**
5165f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick * Pointer to the \c __DRIinterfaceMethods passed to the driver by the loader.
5175f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick *
5185f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick * This pointer is set in the driver's \c __driCreateNewScreen function and
5195f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick * is defined in dri_util.c.
5205f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick */
5215f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanickextern const __DRIinterfaceMethods * dri_interface;
522c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl
523680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#endif /* _DRI_UTIL_H_ */
524