dri_util.c revision 875a757ddd103722cfe9a2b21035024aa5a23d32
1680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
2680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \file dri_util.c
3680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * DRI utility functions.
4680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
5680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This module acts as glue between GLX and the actual hardware driver.  A DRI
6680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * driver doesn't really \e have to use any of this - it's optional.  But, some
7680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * useful stuff is done here that otherwise would have to be duplicated in most
8680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * drivers.
9680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
10680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Basically, these utility functions take care of some of the dirty details of
11680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * screen initialization, context creation, context binding, DRM setup, etc.
12680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
13680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * These functions are compiled into each DRI driver so libGL.so knows nothing
14680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * about them.
15680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
16680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
17680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
18680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#include <assert.h>
19680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#include <stdarg.h>
20680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#include <stdio.h>
217c46033130b1b4d6098647d85c2710367572e079Ian Romanick
22ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
237c46033130b1b4d6098647d85c2710367572e079Ian Romanick
247192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis#include <drm.h>
257192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis#include <xf86drm.h>
267c46033130b1b4d6098647d85c2710367572e079Ian Romanick#include "dri_util.h"
27c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis#include "utils.h"
2845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#include "xmlpool.h"
29ae6e112c69cf42fb81ef4ed5bdeb3b280647f141Eric Anholt#include "../glsl/glsl_parser_extras.h"
3045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes
3145e2b51c853471b79004a954ce3092a253b20b77Jesse BarnesPUBLIC const char __dri2ConfigOptions[] =
3245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes   DRI_CONF_BEGIN
3345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes      DRI_CONF_SECTION_PERFORMANCE
3445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes         DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_1)
3545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes      DRI_CONF_SECTION_END
3645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes   DRI_CONF_END;
3745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes
3845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnesstatic const uint __dri2NConfigOptions = 1;
39680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
40c604e457d1ebe9a884b0a1fb08af38a0ce486699Ian Romanick#ifndef GLX_OML_sync_control
41aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsbergtypedef GLboolean ( * PFNGLXGETMSCRATEOMLPROC) (__DRIdrawable *drawable, int32_t *numerator, int32_t *denominator);
428cdccc82d7948daee256e092a5253d49e277ef75Ian Romanick#endif
438cdccc82d7948daee256e092a5253d49e277ef75Ian Romanick
443264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_get_drawable(__DRIdrawable *pdp);
453264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_put_drawable(__DRIdrawable *pdp);
463264352c577ce1d6681e70abd76624ede906df71Dave Airlie
47680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
48680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Context (un)binding functions                          */
49680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
50680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/
51680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
52680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
53680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Unbind context.
54680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
55aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg * \param scrn the screen.
56680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param gc context.
57680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
58680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \return \c GL_TRUE on success, or \c GL_FALSE on failure.
59680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
60680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal
61680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::UnbindContext, and then decrements
62d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg * __DRIdrawableRec::refcount which must be non-zero for a successful
63680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * return.
64680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
65680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * While casting the opaque private pointers associated with the parameters
66680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * into their respective real types it also assures they are not \c NULL.
67680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
68e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int driUnbindContext(__DRIcontext *pcp)
69680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
70418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    __DRIdrawable *pdp;
71418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    __DRIdrawable *prp;
72680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
73680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*
74680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    ** Assume error checking is done properly in glXMakeCurrent before
75c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick    ** calling driUnbindContext.
76680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    */
77680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
78e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    if (pcp == NULL)
79aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg        return GL_FALSE;
80680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
81418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    pdp = pcp->driDrawablePriv;
82418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    prp = pcp->driReadablePriv;
83680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
84418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    /* already unbound */
85418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    if (!pdp && !prp)
86418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen      return GL_TRUE;
87418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    /* Let driver unbind drawable from context */
88875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis    driDriverAPI.UnbindContext(pcp);
89680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
90cab77711b3e8d398393677bcefcd413f50503a64Vinson Lee    assert(pdp);
91418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    if (pdp->refcount == 0) {
92418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	/* ERROR!!! */
93418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	return GL_FALSE;
94418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    }
95418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
96418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    dri_put_drawable(pdp);
97418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
98418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    if (prp != pdp) {
99418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen        if (prp->refcount == 0) {
100418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	    /* ERROR!!! */
101418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	    return GL_FALSE;
102418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	}
103418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
104418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    	dri_put_drawable(prp);
105418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    }
106418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
107418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
108418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    /* XXX this is disabled so that if we call SwapBuffers on an unbound
109418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen     * window we can determine the last context bound to the window and
110418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen     * use that context's lock. (BrianP, 2-Dec-2000)
111418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen     */
112418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    pcp->driDrawablePriv = pcp->driReadablePriv = NULL;
113418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
114680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    return GL_TRUE;
115680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
116680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
117680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
118680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function takes both a read buffer and a draw buffer.  This is needed
119680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * for \c glXMakeCurrentReadSGI or GLX 1.3's \c glXMakeContextCurrent
120680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * function.
121680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
122e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int driBindContext(__DRIcontext *pcp,
123e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg			  __DRIdrawable *pdp,
124e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg			  __DRIdrawable *prp)
125680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
12664fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    /*
12764fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    ** Assume error checking is done properly in glXMakeCurrent before
12864fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    ** calling driUnbindContext.
12964fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    */
1308e753d04045a82062ac34d3b2622eb9dba8af374Thomas Hellstrom
13164fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    if (!pcp)
13264fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz	return GL_FALSE;
13364fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz
13464fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    /* Bind the drawable to the context */
13564fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    pcp->driDrawablePriv = pdp;
13664fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    pcp->driReadablePriv = prp;
13764fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    if (pdp) {
13864fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz	pdp->driContextPriv = pcp;
13964fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz	dri_get_drawable(pdp);
14064fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    }
14164fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    if (prp && pdp != prp) {
14264fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz	dri_get_drawable(prp);
143418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    }
144680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
145680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /* Call device-specific MakeCurrent */
146875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis    return driDriverAPI.MakeCurrent(pcp, pdp, prp);
147680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
148680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
149e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIdrawable *
150f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsbergdri2CreateNewDrawable(__DRIscreen *screen,
151f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg		      const __DRIconfig *config,
152f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg		      void *loaderPrivate)
153680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
154f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    __DRIdrawable *pdraw;
155680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
156f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw = malloc(sizeof *pdraw);
157f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    if (!pdraw)
158680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	return NULL;
159680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
160f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->driContextPriv = NULL;
161f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->loaderPrivate = loaderPrivate;
162f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->refcount = 1;
163f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->lastStamp = 0;
164f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->w = 0;
165f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->h = 0;
166f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->driScreenPriv = screen;
167f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg
168875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis    if (!driDriverAPI.CreateBuffer(screen, pdraw, &config->modes, 0)) {
169f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg       free(pdraw);
170680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell       return NULL;
171680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }
172680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
173e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg    pdraw->dri2.stamp = pdraw->lastStamp + 1;
17461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez
175e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    return pdraw;
176680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
177680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
1781b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzkestatic __DRIbuffer *
1791b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzkedri2AllocateBuffer(__DRIscreen *screen,
1801b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke		   unsigned int attachment, unsigned int format,
1811b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke		   int width, int height)
1821b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke{
183875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis    return driDriverAPI.AllocateBuffer(screen, attachment, format,
184875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis				       width, height);
1851b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke}
1861b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke
1871b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzkestatic void
1881b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzkedri2ReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer)
1891b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke{
190875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   driDriverAPI.ReleaseBuffer(screen, buffer);
1911b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke}
1921b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke
1931b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke
194234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesstatic int
195234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesdri2ConfigQueryb(__DRIscreen *screen, const char *var, GLboolean *val)
196234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes{
197234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   if (!driCheckOption(&screen->optionCache, var, DRI_BOOL))
198234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes      return -1;
199234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
200234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   *val = driQueryOptionb(&screen->optionCache, var);
201234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
202234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   return 0;
203234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes}
204234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
205234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesstatic int
206234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesdri2ConfigQueryi(__DRIscreen *screen, const char *var, GLint *val)
207234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes{
208234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   if (!driCheckOption(&screen->optionCache, var, DRI_INT) &&
209234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes       !driCheckOption(&screen->optionCache, var, DRI_ENUM))
210234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes      return -1;
211234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
212234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    *val = driQueryOptioni(&screen->optionCache, var);
213234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
214234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    return 0;
215234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes}
216234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
217234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesstatic int
218234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesdri2ConfigQueryf(__DRIscreen *screen, const char *var, GLfloat *val)
219234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes{
220234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   if (!driCheckOption(&screen->optionCache, var, DRI_FLOAT))
221234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes      return -1;
222234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
223234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    *val = driQueryOptionf(&screen->optionCache, var);
224234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
225234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    return 0;
226234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes}
227234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
228234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
2293264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_get_drawable(__DRIdrawable *pdp)
2303264352c577ce1d6681e70abd76624ede906df71Dave Airlie{
2313264352c577ce1d6681e70abd76624ede906df71Dave Airlie    pdp->refcount++;
2323264352c577ce1d6681e70abd76624ede906df71Dave Airlie}
2333264352c577ce1d6681e70abd76624ede906df71Dave Airlie
2343264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_put_drawable(__DRIdrawable *pdp)
235680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
236d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg    __DRIscreen *psp;
237680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
238680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    if (pdp) {
239f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee	pdp->refcount--;
240f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee	if (pdp->refcount)
241f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee	    return;
242f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee
243eab896cc213157758d74a2f39b5e3b1e748c071fDave Airlie	psp = pdp->driScreenPriv;
244875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis        driDriverAPI.DestroyBuffer(pdp);
24532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg	free(pdp);
246680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }
247680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
248680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
2493264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void
2503264352c577ce1d6681e70abd76624ede906df71Dave AirliedriDestroyDrawable(__DRIdrawable *pdp)
2513264352c577ce1d6681e70abd76624ede906df71Dave Airlie{
2523264352c577ce1d6681e70abd76624ede906df71Dave Airlie    dri_put_drawable(pdp);
2533264352c577ce1d6681e70abd76624ede906df71Dave Airlie}
2543264352c577ce1d6681e70abd76624ede906df71Dave Airlie
255680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@}*/
256680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
257680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
258680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
259680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Context handling functions                             */
260680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
261680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/
262680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
263680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
264680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Destroy the per-context private information.
265680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
266680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal
267680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::DestroyContext on \p contextPrivate, calls
268680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * drmDestroyContext(), and finally frees \p contextPrivate.
269680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
270b4b040f7d83f5f4917c48bf5833394d550e30421Brian Paulstatic void
271e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriDestroyContext(__DRIcontext *pcp)
272680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
273680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    if (pcp) {
274875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis	driDriverAPI.DestroyContext(pcp);
27532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg	free(pcp);
276680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }
277680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
278680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
279a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergstatic unsigned int
280a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergdri2GetAPIMask(__DRIscreen *screen)
281a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg{
282a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    return screen->api_mask;
283a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg}
284a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
285a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergstatic __DRIcontext *
286a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergdri2CreateNewContextForAPI(__DRIscreen *screen, int api,
287a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg			   const __DRIconfig *config,
288a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg			   __DRIcontext *shared, void *data)
289a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg{
290a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    __DRIcontext *context;
291d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg    const struct gl_config *modes = (config != NULL) ? &config->modes : NULL;
292a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    void *shareCtx = (shared != NULL) ? shared->driverPrivate : NULL;
293a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    gl_api mesa_api;
294a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
295a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    if (!(screen->api_mask & (1 << api)))
296a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	return NULL;
297a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
298a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    switch (api) {
299a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    case __DRI_API_OPENGL:
300a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    mesa_api = API_OPENGL;
301a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    break;
302a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    case __DRI_API_GLES:
303a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    mesa_api = API_OPENGLES;
304a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    break;
305a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    case __DRI_API_GLES2:
306a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    mesa_api = API_OPENGLES2;
307a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    break;
3081b8c9fef1128cfeee5e5ba75ba7d645522cc76c2nobled    default:
3091b8c9fef1128cfeee5e5ba75ba7d645522cc76c2nobled	    return NULL;
310a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    }
311a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
312a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    context = malloc(sizeof *context);
313a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    if (!context)
314a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	return NULL;
315a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
316a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    context->driScreenPriv = screen;
317a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    context->driDrawablePriv = NULL;
318a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    context->loaderPrivate = data;
319a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
320875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis    if (!driDriverAPI.CreateContext(mesa_api, modes,
321875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis				    context, shareCtx) ) {
322a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg        free(context);
323a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg        return NULL;
324a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    }
325a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
326a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    return context;
327a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg}
328a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
3293f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul
330e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIcontext *
331e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergdri2CreateNewContext(__DRIscreen *screen, const __DRIconfig *config,
332e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg		      __DRIcontext *shared, void *data)
333f616a263a25eda135800bea7d3a863c569b93e30Kristian Høgsberg{
334a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg   return dri2CreateNewContextForAPI(screen, __DRI_API_OPENGL,
335a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg				     config, shared, data);
336f616a263a25eda135800bea7d3a863c569b93e30Kristian Høgsberg}
337680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
338e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int
339e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriCopyContext(__DRIcontext *dest, __DRIcontext *src, unsigned long mask)
340e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
34117d898d5b96809227d940768dc54cfe86070b8d0Ian Romanick    (void) dest;
34217d898d5b96809227d940768dc54cfe86070b8d0Ian Romanick    (void) src;
34317d898d5b96809227d940768dc54cfe86070b8d0Ian Romanick    (void) mask;
344e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    return GL_FALSE;
345e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
346e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
347e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/*@}*/
348e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
349e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
350680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
351680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Screen handling functions                              */
352680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
353680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/
354680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
355680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
356680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Destroy the per-screen private information.
357680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
358680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal
359680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::DestroyScreen on \p screenPrivate, calls
360680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * drmClose(), and finally frees \p screenPrivate.
361680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
362e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic void driDestroyScreen(__DRIscreen *psp)
363680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
364680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    if (psp) {
365680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	/* No interaction with the X-server is possible at this point.  This
366680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	 * routine is called after XCloseDisplay, so there is no protocol
367680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	 * stream open to the X-server anymore.
368680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	 */
369680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
370b83846475bac76268d75f53632faf8aad8cad02cEric Anholt       _mesa_destroy_shader_compiler();
371b83846475bac76268d75f53632faf8aad8cad02cEric Anholt
372875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis	if (driDriverAPI.DestroyScreen)
373875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis	    driDriverAPI.DestroyScreen(psp);
374680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
375a2ea34d70507ffb6b7277b4612ae3bc1ca582a60Kristian Høgsberg	driDestroyOptionCache(&psp->optionCache);
376a2ea34d70507ffb6b7277b4612ae3bc1ca582a60Kristian Høgsberg	driDestroyOptionInfo(&psp->optionInfo);
377e5c28321b2047418ba960c5f9c3aa86cf2514bbbTilman Sauerbeck
37832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg	free(psp);
379680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }
380680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
381680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
3826cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsbergstatic void
383e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergsetupLoaderExtensions(__DRIscreen *psp,
3846cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg		      const __DRIextension **extensions)
3856cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg{
3866cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg    int i;
3876cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg
3886cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg    for (i = 0; extensions[i]; i++) {
389f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg	if (strcmp(extensions[i]->name, __DRI_DRI2_LOADER) == 0)
390f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg	    psp->dri2.loader = (__DRIdri2LoaderExtension *) extensions[i];
391c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	if (strcmp(extensions[i]->name, __DRI_IMAGE_LOOKUP) == 0)
392c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	    psp->dri2.image = (__DRIimageLookupExtension *) extensions[i];
393db2993faa0211b60efd46016de5d07110cb9777aKristian Høgsberg	if (strcmp(extensions[i]->name, __DRI_USE_INVALIDATE) == 0)
394db2993faa0211b60efd46016de5d07110cb9777aKristian Høgsberg	    psp->dri2.useInvalidate = (__DRIuseInvalidateExtension *) extensions[i];
3956cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg    }
3966cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg}
3976cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg
398680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
3993f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * DRI2
4003f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul */
401e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIscreen *
402f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergdri2CreateNewScreen(int scrn, int fd,
403e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg		    const __DRIextension **extensions,
404e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg		    const __DRIconfig ***driver_configs, void *data)
4057da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg{
4067da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    static const __DRIextension *emptyExtensionList[] = { NULL };
407e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    __DRIscreen *psp;
40816242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg    drmVersionPtr version;
409129b9ad16f95421d12f77c1bd3eca915d8768b78Kristian Høgsberg
41032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg    psp = calloc(1, sizeof(*psp));
4117da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    if (!psp)
4127da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg	return NULL;
4137da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
4146cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg    setupLoaderExtensions(psp, extensions);
4156cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg
41616242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg    version = drmGetVersion(fd);
41716242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg    if (version) {
41816242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg	psp->drm_version.major = version->version_major;
41916242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg	psp->drm_version.minor = version->version_minor;
42016242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg	psp->drm_version.patch = version->version_patchlevel;
42116242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg	drmFreeVersion(version);
42216242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg    }
42316242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg
4247da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    psp->extensions = emptyExtensionList;
4257da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    psp->fd = fd;
4267da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    psp->myNum = scrn;
4277da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
428a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    psp->api_mask = (1 << __DRI_API_OPENGL);
4297192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis    *driver_configs = driDriverAPI.InitScreen(psp);
430e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    if (*driver_configs == NULL) {
43132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg	free(psp);
4327da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg	return NULL;
4337da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    }
4347da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
43517eace581d25a626a7d75d9d1205d012cbb14a6eKristian Høgsberg    psp->loaderPrivate = data;
436e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
437a482e033082bb0794fdf56c47dd76d949afde6faEric Anholt    driParseOptionInfo(&psp->optionInfo, __dri2ConfigOptions,
438a482e033082bb0794fdf56c47dd76d949afde6faEric Anholt		       __dri2NConfigOptions);
439a482e033082bb0794fdf56c47dd76d949afde6faEric Anholt    driParseConfigFiles(&psp->optionCache, &psp->optionInfo, psp->myNum,
440a482e033082bb0794fdf56c47dd76d949afde6faEric Anholt			"dri2");
441234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
4427da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    return psp;
4437da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg}
4447da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
445e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension **driGetExtensions(__DRIscreen *psp)
446e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
447e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    return psp->extensions;
448e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
449e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
450f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg/** Core interface */
451e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst __DRIcoreExtension driCoreExtension = {
452e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    { __DRI_CORE, __DRI_CORE_VERSION },
453f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    NULL,
454e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driDestroyScreen,
455e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driGetExtensions,
456e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driGetConfigAttrib,
457e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driIndexConfigAttrib,
458f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    NULL,
459e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driDestroyDrawable,
4606260618b29983fd961718fd6e3961bdd32163cb5Kristian Høgsberg    NULL,
461f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    NULL,
462e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driCopyContext,
463e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driDestroyContext,
464e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driBindContext,
465e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driUnbindContext
466e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
467e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
46839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/** DRI2 interface */
469f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergconst __DRIdri2Extension driDRI2Extension = {
470f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    { __DRI_DRI2, __DRI_DRI2_VERSION },
471f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    dri2CreateNewScreen,
472f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    dri2CreateNewDrawable,
473f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    dri2CreateNewContext,
474a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    dri2GetAPIMask,
4751b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke    dri2CreateNewContextForAPI,
4761b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke    dri2AllocateBuffer,
4771b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke    dri2ReleaseBuffer
478f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg};
479f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg
480234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesconst __DRI2configQueryExtension dri2ConfigQueryExtension = {
481234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   { __DRI2_CONFIG_QUERY, __DRI2_CONFIG_QUERY_VERSION },
482234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   dri2ConfigQueryb,
483234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   dri2ConfigQueryi,
484234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   dri2ConfigQueryf,
485234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes};
486234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
48761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezvoid
48861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateDrawable(__DRIdrawable *drawable)
48961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{
49061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez    drawable->dri2.stamp++;
49161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez}
49261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez
493c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg/**
494c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg * Check that the gl_framebuffer associated with dPriv is the right size.
495c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg * Resize the gl_framebuffer if needed.
496c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg * It's expected that the dPriv->driverPrivate member points to a
497c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg * gl_framebuffer object.
498c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg */
499c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsbergvoid
500c467db4cc765965bd347cf5b91aec39b831273ecKristian HøgsbergdriUpdateFramebufferSize(struct gl_context *ctx, const __DRIdrawable *dPriv)
501c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg{
502c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg   struct gl_framebuffer *fb = (struct gl_framebuffer *) dPriv->driverPrivate;
503c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg   if (fb && (dPriv->w != fb->Width || dPriv->h != fb->Height)) {
504c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg      ctx->Driver.ResizeBuffers(ctx, fb, dPriv->w, dPriv->h);
505c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg      /* if the driver needs the hw lock for ResizeBuffers, the drawable
506c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg         might have changed again by now */
507c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg      assert(fb->Width == dPriv->w);
508c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg      assert(fb->Height == dPriv->h);
509c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg   }
510c467db4cc765965bd347cf5b91aec39b831273ecKristian Høgsberg}
511