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