dri_util.c revision e9beaf65fdaf82a7845cbe176f353ddb6b8466c7
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 <unistd.h>
21680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#include <sys/mman.h>
22680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#include <stdio.h>
237c46033130b1b4d6098647d85c2710367572e079Ian Romanick
2438b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane#ifndef MAP_FAILED
2538b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane#define MAP_FAILED ((void *)-1)
2638b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane#endif
2738b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane
28ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
29c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick#define None 0
307c46033130b1b4d6098647d85c2710367572e079Ian Romanick
317c46033130b1b4d6098647d85c2710367572e079Ian Romanick#include "dri_util.h"
32ffb36d57a5f6359b5b91b73af60482a0016dd431Jon Smirl#include "drm_sarea.h"
33c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis#include "utils.h"
3445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#include "xmlpool.h"
35ae6e112c69cf42fb81ef4ed5bdeb3b280647f141Eric Anholt#include "../glsl/glsl_parser_extras.h"
3645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes
3745e2b51c853471b79004a954ce3092a253b20b77Jesse BarnesPUBLIC const char __dri2ConfigOptions[] =
3845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes   DRI_CONF_BEGIN
3945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes      DRI_CONF_SECTION_PERFORMANCE
4045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes         DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_1)
4145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes      DRI_CONF_SECTION_END
4245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes   DRI_CONF_END;
4345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes
4445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnesstatic const uint __dri2NConfigOptions = 1;
45680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
46c604e457d1ebe9a884b0a1fb08af38a0ce486699Ian Romanick#ifndef GLX_OML_sync_control
47aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsbergtypedef GLboolean ( * PFNGLXGETMSCRATEOMLPROC) (__DRIdrawable *drawable, int32_t *numerator, int32_t *denominator);
488cdccc82d7948daee256e092a5253d49e277ef75Ian Romanick#endif
498cdccc82d7948daee256e092a5253d49e277ef75Ian Romanick
503264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_get_drawable(__DRIdrawable *pdp);
513264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_put_drawable(__DRIdrawable *pdp);
523264352c577ce1d6681e70abd76624ede906df71Dave Airlie
53680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
54680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Context (un)binding functions                          */
55680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
56680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/
57680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
58680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
59680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Unbind context.
60680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
61aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg * \param scrn the screen.
62680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param gc context.
63680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
64680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \return \c GL_TRUE on success, or \c GL_FALSE on failure.
65680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
66680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal
67680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::UnbindContext, and then decrements
68d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg * __DRIdrawableRec::refcount which must be non-zero for a successful
69680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * return.
70680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
71680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * While casting the opaque private pointers associated with the parameters
72680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * into their respective real types it also assures they are not \c NULL.
73680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
74e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int driUnbindContext(__DRIcontext *pcp)
75680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
76e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    __DRIscreen *psp;
77418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    __DRIdrawable *pdp;
78418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    __DRIdrawable *prp;
79680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
80680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /*
81680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    ** Assume error checking is done properly in glXMakeCurrent before
82c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick    ** calling driUnbindContext.
83680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    */
84680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
85e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    if (pcp == NULL)
86aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg        return GL_FALSE;
87680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
88e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    psp = pcp->driScreenPriv;
89418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    pdp = pcp->driDrawablePriv;
90418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    prp = pcp->driReadablePriv;
91680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
92418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    /* already unbound */
93418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    if (!pdp && !prp)
94418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen      return GL_TRUE;
95418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    /* Let driver unbind drawable from context */
96680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    (*psp->DriverAPI.UnbindContext)(pcp);
97680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
98cab77711b3e8d398393677bcefcd413f50503a64Vinson Lee    assert(pdp);
99418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    if (pdp->refcount == 0) {
100418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	/* ERROR!!! */
101418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	return GL_FALSE;
102418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    }
103418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
104418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    dri_put_drawable(pdp);
105418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
106418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    if (prp != pdp) {
107418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen        if (prp->refcount == 0) {
108418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	    /* ERROR!!! */
109418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	    return GL_FALSE;
110418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen	}
111418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
112418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    	dri_put_drawable(prp);
113418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    }
114418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
115418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
116418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    /* XXX this is disabled so that if we call SwapBuffers on an unbound
117418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen     * window we can determine the last context bound to the window and
118418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen     * use that context's lock. (BrianP, 2-Dec-2000)
119418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen     */
120418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    pcp->driDrawablePriv = pcp->driReadablePriv = NULL;
121418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen
122680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    return GL_TRUE;
123680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
124680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
125680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
126680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function takes both a read buffer and a draw buffer.  This is needed
127680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * for \c glXMakeCurrentReadSGI or GLX 1.3's \c glXMakeContextCurrent
128680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * function.
129680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
130e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int driBindContext(__DRIcontext *pcp,
131e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg			  __DRIdrawable *pdp,
132e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg			  __DRIdrawable *prp)
133680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
134d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg    __DRIscreen *psp = NULL;
135680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
13664fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    /*
13764fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    ** Assume error checking is done properly in glXMakeCurrent before
13864fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    ** calling driUnbindContext.
13964fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    */
1408e753d04045a82062ac34d3b2622eb9dba8af374Thomas Hellstrom
14164fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    if (!pcp)
14264fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz	return GL_FALSE;
14364fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz
14464fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    /* Bind the drawable to the context */
14564fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    psp = pcp->driScreenPriv;
14664fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    pcp->driDrawablePriv = pdp;
14764fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    pcp->driReadablePriv = prp;
14864fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    if (pdp) {
14964fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz	pdp->driContextPriv = pcp;
15064fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz	dri_get_drawable(pdp);
15164fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    }
15264fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz    if (prp && pdp != prp) {
15364fa717b18272bda2551a6dc2e1a40725b031097Jakob Bornecrantz	dri_get_drawable(prp);
154418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen    }
155680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
156680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    /* Call device-specific MakeCurrent */
157c952b3e907ab31cd5f95157c18ce2f81626aafe4Thomas Hellstrom    return (*psp->DriverAPI.MakeCurrent)(pcp, pdp, prp);
158680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
159680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
160e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIdrawable *
161f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsbergdri2CreateNewDrawable(__DRIscreen *screen,
162f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg		      const __DRIconfig *config,
163f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg		      void *loaderPrivate)
164680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
165f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    __DRIdrawable *pdraw;
166680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
167f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw = malloc(sizeof *pdraw);
168f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    if (!pdraw)
169680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	return NULL;
170680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
171f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->driContextPriv = NULL;
172f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->loaderPrivate = loaderPrivate;
173f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->refcount = 1;
174f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->lastStamp = 0;
175f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->w = 0;
176f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->h = 0;
177f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    pdraw->driScreenPriv = screen;
178f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg
179f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg    if (!(*screen->DriverAPI.CreateBuffer)(screen, pdraw, &config->modes, 0)) {
180f5ba7662bdaf7f8d62cbc1c0c0a59dabb242e78bKristian Høgsberg       free(pdraw);
181680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell       return NULL;
182680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }
183680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
184e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg    pdraw->dri2.stamp = pdraw->lastStamp + 1;
18561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez
186e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    return pdraw;
187680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
188680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
1891b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzkestatic __DRIbuffer *
1901b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzkedri2AllocateBuffer(__DRIscreen *screen,
1911b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke		   unsigned int attachment, unsigned int format,
1921b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke		   int width, int height)
1931b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke{
1941b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke    return (*screen->DriverAPI.AllocateBuffer)(screen, attachment, format,
1951b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke					       width, height);
1961b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke}
1971b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke
1981b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzkestatic void
1991b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzkedri2ReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer)
2001b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke{
2011b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke   (*screen->DriverAPI.ReleaseBuffer)(screen, buffer);
2021b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke}
2031b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke
2041b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke
205234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesstatic int
206234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesdri2ConfigQueryb(__DRIscreen *screen, const char *var, GLboolean *val)
207234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes{
208234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   if (!driCheckOption(&screen->optionCache, var, DRI_BOOL))
209234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes      return -1;
210234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
211234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   *val = driQueryOptionb(&screen->optionCache, var);
212234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
213234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   return 0;
214234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes}
215234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
216234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesstatic int
217234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesdri2ConfigQueryi(__DRIscreen *screen, const char *var, GLint *val)
218234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes{
219234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   if (!driCheckOption(&screen->optionCache, var, DRI_INT) &&
220234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes       !driCheckOption(&screen->optionCache, var, DRI_ENUM))
221234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes      return -1;
222234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
223234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    *val = driQueryOptioni(&screen->optionCache, var);
224234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
225234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    return 0;
226234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes}
227234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
228234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesstatic int
229234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesdri2ConfigQueryf(__DRIscreen *screen, const char *var, GLfloat *val)
230234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes{
231234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   if (!driCheckOption(&screen->optionCache, var, DRI_FLOAT))
232234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes      return -1;
233234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
234234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    *val = driQueryOptionf(&screen->optionCache, var);
235234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
236234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    return 0;
237234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes}
238234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
239234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
2403264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_get_drawable(__DRIdrawable *pdp)
2413264352c577ce1d6681e70abd76624ede906df71Dave Airlie{
2423264352c577ce1d6681e70abd76624ede906df71Dave Airlie    pdp->refcount++;
2433264352c577ce1d6681e70abd76624ede906df71Dave Airlie}
2443264352c577ce1d6681e70abd76624ede906df71Dave Airlie
2453264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_put_drawable(__DRIdrawable *pdp)
246680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
247d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg    __DRIscreen *psp;
248680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
249680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    if (pdp) {
250f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee	pdp->refcount--;
251f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee	if (pdp->refcount)
252f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee	    return;
253f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee
254eab896cc213157758d74a2f39b5e3b1e748c071fDave Airlie	psp = pdp->driScreenPriv;
255680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell        (*psp->DriverAPI.DestroyBuffer)(pdp);
25632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg	free(pdp);
257680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }
258680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
259680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
2603264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void
2613264352c577ce1d6681e70abd76624ede906df71Dave AirliedriDestroyDrawable(__DRIdrawable *pdp)
2623264352c577ce1d6681e70abd76624ede906df71Dave Airlie{
2633264352c577ce1d6681e70abd76624ede906df71Dave Airlie    dri_put_drawable(pdp);
2643264352c577ce1d6681e70abd76624ede906df71Dave Airlie}
2653264352c577ce1d6681e70abd76624ede906df71Dave Airlie
266680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@}*/
267680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
268680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
269680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
270680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Context handling functions                             */
271680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
272680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/
273680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
274680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
275680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Destroy the per-context private information.
276680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
277680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal
278680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::DestroyContext on \p contextPrivate, calls
279680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * drmDestroyContext(), and finally frees \p contextPrivate.
280680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
281b4b040f7d83f5f4917c48bf5833394d550e30421Brian Paulstatic void
282e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriDestroyContext(__DRIcontext *pcp)
283680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
284680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    if (pcp) {
285680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	(*pcp->driScreenPriv->DriverAPI.DestroyContext)(pcp);
28632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg	free(pcp);
287680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }
288680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
289680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
290a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergstatic unsigned int
291a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergdri2GetAPIMask(__DRIscreen *screen)
292a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg{
293a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    return screen->api_mask;
294a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg}
295a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
296a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergstatic __DRIcontext *
297a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergdri2CreateNewContextForAPI(__DRIscreen *screen, int api,
298a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg			   const __DRIconfig *config,
299a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg			   __DRIcontext *shared, void *data)
300a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg{
301a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    __DRIcontext *context;
302d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg    const struct gl_config *modes = (config != NULL) ? &config->modes : NULL;
303a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    void *shareCtx = (shared != NULL) ? shared->driverPrivate : NULL;
304a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    gl_api mesa_api;
305a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
306a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    if (!(screen->api_mask & (1 << api)))
307a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	return NULL;
308a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
309a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    switch (api) {
310a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    case __DRI_API_OPENGL:
311a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    mesa_api = API_OPENGL;
312a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    break;
313a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    case __DRI_API_GLES:
314a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    mesa_api = API_OPENGLES;
315a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    break;
316a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    case __DRI_API_GLES2:
317a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    mesa_api = API_OPENGLES2;
318a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	    break;
3191b8c9fef1128cfeee5e5ba75ba7d645522cc76c2nobled    default:
3201b8c9fef1128cfeee5e5ba75ba7d645522cc76c2nobled	    return NULL;
321a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    }
322a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
323a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    context = malloc(sizeof *context);
324a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    if (!context)
325a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg	return NULL;
326a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
327a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    context->driScreenPriv = screen;
328a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    context->driDrawablePriv = NULL;
329a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    context->loaderPrivate = data;
330a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
3316561a64a69c0f5005d03ea297f9a309f48449731nobled    if (!(*screen->DriverAPI.CreateContext)(mesa_api, modes,
332a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg					    context, shareCtx) ) {
333a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg        free(context);
334a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg        return NULL;
335a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    }
336a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
337a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    return context;
338a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg}
339a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg
3403f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul
341e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIcontext *
342e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergdri2CreateNewContext(__DRIscreen *screen, const __DRIconfig *config,
343e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg		      __DRIcontext *shared, void *data)
344f616a263a25eda135800bea7d3a863c569b93e30Kristian Høgsberg{
345a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg   return dri2CreateNewContextForAPI(screen, __DRI_API_OPENGL,
346a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg				     config, shared, data);
347f616a263a25eda135800bea7d3a863c569b93e30Kristian Høgsberg}
348680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
349e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int
350e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriCopyContext(__DRIcontext *dest, __DRIcontext *src, unsigned long mask)
351e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
35217d898d5b96809227d940768dc54cfe86070b8d0Ian Romanick    (void) dest;
35317d898d5b96809227d940768dc54cfe86070b8d0Ian Romanick    (void) src;
35417d898d5b96809227d940768dc54cfe86070b8d0Ian Romanick    (void) mask;
355e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    return GL_FALSE;
356e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
357e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
358e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/*@}*/
359e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
360e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
361680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
362680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Screen handling functions                              */
363680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/
364680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/
365680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
366680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
367680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Destroy the per-screen private information.
368680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
369680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal
370680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::DestroyScreen on \p screenPrivate, calls
371680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * drmClose(), and finally frees \p screenPrivate.
372680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
373e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic void driDestroyScreen(__DRIscreen *psp)
374680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
375680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    if (psp) {
376680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	/* No interaction with the X-server is possible at this point.  This
377680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	 * routine is called after XCloseDisplay, so there is no protocol
378680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	 * stream open to the X-server anymore.
379680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	 */
380680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
381b83846475bac76268d75f53632faf8aad8cad02cEric Anholt       _mesa_destroy_shader_compiler();
382b83846475bac76268d75f53632faf8aad8cad02cEric Anholt
383680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	if (psp->DriverAPI.DestroyScreen)
384680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell	    (*psp->DriverAPI.DestroyScreen)(psp);
385680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
386a2ea34d70507ffb6b7277b4612ae3bc1ca582a60Kristian Høgsberg	driDestroyOptionCache(&psp->optionCache);
387a2ea34d70507ffb6b7277b4612ae3bc1ca582a60Kristian Høgsberg	driDestroyOptionInfo(&psp->optionInfo);
388e5c28321b2047418ba960c5f9c3aa86cf2514bbbTilman Sauerbeck
38932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg	free(psp);
390680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell    }
391680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
392680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
3936cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsbergstatic void
394e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergsetupLoaderExtensions(__DRIscreen *psp,
3956cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg		      const __DRIextension **extensions)
3966cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg{
3976cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg    int i;
3986cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg
3996cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg    for (i = 0; extensions[i]; i++) {
400f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg	if (strcmp(extensions[i]->name, __DRI_DRI2_LOADER) == 0)
401f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg	    psp->dri2.loader = (__DRIdri2LoaderExtension *) extensions[i];
402c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	if (strcmp(extensions[i]->name, __DRI_IMAGE_LOOKUP) == 0)
403c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	    psp->dri2.image = (__DRIimageLookupExtension *) extensions[i];
404db2993faa0211b60efd46016de5d07110cb9777aKristian Høgsberg	if (strcmp(extensions[i]->name, __DRI_USE_INVALIDATE) == 0)
405db2993faa0211b60efd46016de5d07110cb9777aKristian Høgsberg	    psp->dri2.useInvalidate = (__DRIuseInvalidateExtension *) extensions[i];
4066cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg    }
4076cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg}
4086cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg
409680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
4103f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * DRI2
4113f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul */
412e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIscreen *
413f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergdri2CreateNewScreen(int scrn, int fd,
414e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg		    const __DRIextension **extensions,
415e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg		    const __DRIconfig ***driver_configs, void *data)
4167da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg{
4177da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    static const __DRIextension *emptyExtensionList[] = { NULL };
418e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    __DRIscreen *psp;
41916242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg    drmVersionPtr version;
420129b9ad16f95421d12f77c1bd3eca915d8768b78Kristian Høgsberg
421e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    if (driDriverAPI.InitScreen2 == NULL)
422129b9ad16f95421d12f77c1bd3eca915d8768b78Kristian Høgsberg        return NULL;
4237da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
42432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg    psp = calloc(1, sizeof(*psp));
4257da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    if (!psp)
4267da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg	return NULL;
4277da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
4286cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg    setupLoaderExtensions(psp, extensions);
4296cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg
43016242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg    version = drmGetVersion(fd);
43116242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg    if (version) {
43216242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg	psp->drm_version.major = version->version_major;
43316242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg	psp->drm_version.minor = version->version_minor;
43416242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg	psp->drm_version.patch = version->version_patchlevel;
43516242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg	drmFreeVersion(version);
43616242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg    }
43716242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg
4387da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    psp->extensions = emptyExtensionList;
4397da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    psp->fd = fd;
4407da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    psp->myNum = scrn;
4417da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
442e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    psp->DriverAPI = driDriverAPI;
443a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    psp->api_mask = (1 << __DRI_API_OPENGL);
444e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    *driver_configs = driDriverAPI.InitScreen2(psp);
445e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    if (*driver_configs == NULL) {
44632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg	free(psp);
4477da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg	return NULL;
4487da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    }
4497da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
450e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    psp->DriverAPI = driDriverAPI;
45117eace581d25a626a7d75d9d1205d012cbb14a6eKristian Høgsberg    psp->loaderPrivate = data;
452e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
453a482e033082bb0794fdf56c47dd76d949afde6faEric Anholt    driParseOptionInfo(&psp->optionInfo, __dri2ConfigOptions,
454a482e033082bb0794fdf56c47dd76d949afde6faEric Anholt		       __dri2NConfigOptions);
455a482e033082bb0794fdf56c47dd76d949afde6faEric Anholt    driParseConfigFiles(&psp->optionCache, &psp->optionInfo, psp->myNum,
456a482e033082bb0794fdf56c47dd76d949afde6faEric Anholt			"dri2");
457234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
4587da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg    return psp;
4597da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg}
4607da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg
461e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension **driGetExtensions(__DRIscreen *psp)
462e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
463e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    return psp->extensions;
464e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
465e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
466f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg/** Core interface */
467e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst __DRIcoreExtension driCoreExtension = {
468e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    { __DRI_CORE, __DRI_CORE_VERSION },
469f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    NULL,
470e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driDestroyScreen,
471e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driGetExtensions,
472e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driGetConfigAttrib,
473e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driIndexConfigAttrib,
474f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    NULL,
475e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driDestroyDrawable,
4766260618b29983fd961718fd6e3961bdd32163cb5Kristian Høgsberg    NULL,
477f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    NULL,
478e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driCopyContext,
479e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driDestroyContext,
480e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driBindContext,
481e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    driUnbindContext
482e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
483e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
48439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/** DRI2 interface */
485f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergconst __DRIdri2Extension driDRI2Extension = {
486f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    { __DRI_DRI2, __DRI_DRI2_VERSION },
487f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    dri2CreateNewScreen,
488f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    dri2CreateNewDrawable,
489f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg    dri2CreateNewContext,
490a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg    dri2GetAPIMask,
4911b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke    dri2CreateNewContextForAPI,
4921b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke    dri2AllocateBuffer,
4931b8ef9416bf3a4d2d47fcf9935063af57da2975dBenjamin Franzke    dri2ReleaseBuffer
494f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg};
495f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg
496234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnesconst __DRI2configQueryExtension dri2ConfigQueryExtension = {
497234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   { __DRI2_CONFIG_QUERY, __DRI2_CONFIG_QUERY_VERSION },
498234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   dri2ConfigQueryb,
499234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   dri2ConfigQueryi,
500234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes   dri2ConfigQueryf,
501234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes};
502234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes
50361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezvoid
50461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateDrawable(__DRIdrawable *drawable)
50561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{
50661d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez    drawable->dri2.stamp++;
50761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez}
50861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez
509680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@}*/
510