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