dri_util.c revision cab77711b3e8d398393677bcefcd413f50503a64
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" 34680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 35c604e457d1ebe9a884b0a1fb08af38a0ce486699Ian Romanick#ifndef GLX_OML_sync_control 36aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsbergtypedef GLboolean ( * PFNGLXGETMSCRATEOMLPROC) (__DRIdrawable *drawable, int32_t *numerator, int32_t *denominator); 378cdccc82d7948daee256e092a5253d49e277ef75Ian Romanick#endif 388cdccc82d7948daee256e092a5253d49e277ef75Ian Romanick 393264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_get_drawable(__DRIdrawable *pdp); 403264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_put_drawable(__DRIdrawable *pdp); 413264352c577ce1d6681e70abd76624ede906df71Dave Airlie 42680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 43f968f67e6214416f04b8875ce59a94a02f464c81Kristian Høgsberg * This is just a token extension used to signal that the driver 44f968f67e6214416f04b8875ce59a94a02f464c81Kristian Høgsberg * supports setting a read drawable. 45f968f67e6214416f04b8875ce59a94a02f464c81Kristian Høgsberg */ 46f968f67e6214416f04b8875ce59a94a02f464c81Kristian Høgsbergconst __DRIextension driReadDrawableExtension = { 47ccff0cb26378ce370fc8697a2a2ada138d2e119eKristian Høgsberg __DRI_READ_DRAWABLE, __DRI_READ_DRAWABLE_VERSION 48f968f67e6214416f04b8875ce59a94a02f464c81Kristian Høgsberg}; 49f968f67e6214416f04b8875ce59a94a02f464c81Kristian Høgsberg 50680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 51680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Print message to \c stderr if the \c LIBGL_DEBUG environment variable 52680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * is set. 53680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 54680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Is called from the drivers. 55680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 56680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param f \c printf like format string. 57680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 58680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellvoid 59680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell__driUtilMessage(const char *f, ...) 60680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 61680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell va_list args; 62680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 63680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if (getenv("LIBGL_DEBUG")) { 64e1a8852aa49b535a4fcec4eefda3fb7f8e57a5ccBrian Paul fprintf(stderr, "libGL: "); 65680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell va_start(args, f); 66680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell vfprintf(stderr, f, args); 67680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell va_end(args); 68680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell fprintf(stderr, "\n"); 69680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 70680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 71680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 72c95e66120be049ee51ff84868b1da3379b312fabGeorge SapountzisGLint 73c95e66120be049ee51ff84868b1da3379b312fabGeorge SapountzisdriIntersectArea( drm_clip_rect_t rect1, drm_clip_rect_t rect2 ) 74c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis{ 75c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis if (rect2.x1 > rect1.x1) rect1.x1 = rect2.x1; 76c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis if (rect2.x2 < rect1.x2) rect1.x2 = rect2.x2; 77c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis if (rect2.y1 > rect1.y1) rect1.y1 = rect2.y1; 78c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis if (rect2.y2 < rect1.y2) rect1.y2 = rect2.y2; 79c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 80c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis if (rect1.x1 > rect1.x2 || rect1.y1 > rect1.y2) return 0; 81c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 82c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis return (rect1.x2 - rect1.x1) * (rect1.y2 - rect1.y1); 83c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis} 84680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 85680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 86680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Context (un)binding functions */ 87680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 88680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/ 89680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 90680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 91680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Unbind context. 92680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 93aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg * \param scrn the screen. 94680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param gc context. 95680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 96680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \return \c GL_TRUE on success, or \c GL_FALSE on failure. 97680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 98680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal 99680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::UnbindContext, and then decrements 100d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg * __DRIdrawableRec::refcount which must be non-zero for a successful 101680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * return. 102680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 103680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * While casting the opaque private pointers associated with the parameters 104680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * into their respective real types it also assures they are not \c NULL. 105680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 106e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int driUnbindContext(__DRIcontext *pcp) 107680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 108e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIscreen *psp; 109418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen __DRIdrawable *pdp; 110418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen __DRIdrawable *prp; 111680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 112680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* 113680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** Assume error checking is done properly in glXMakeCurrent before 114c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick ** calling driUnbindContext. 115680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 116680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 117e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (pcp == NULL) 118aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg return GL_FALSE; 119680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 120e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp = pcp->driScreenPriv; 121418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen pdp = pcp->driDrawablePriv; 122418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen prp = pcp->driReadablePriv; 123680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 124418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen /* already unbound */ 125418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen if (!pdp && !prp) 126418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen return GL_TRUE; 127418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen /* Let driver unbind drawable from context */ 128680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell (*psp->DriverAPI.UnbindContext)(pcp); 129680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 130cab77711b3e8d398393677bcefcd413f50503a64Vinson Lee assert(pdp); 131418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen if (pdp->refcount == 0) { 132418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen /* ERROR!!! */ 133418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen return GL_FALSE; 134418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen } 135418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen 136418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen dri_put_drawable(pdp); 137418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen 138418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen if (prp != pdp) { 139418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen if (prp->refcount == 0) { 140418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen /* ERROR!!! */ 141418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen return GL_FALSE; 142418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen } 143418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen 144418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen dri_put_drawable(prp); 145418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen } 146418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen 147418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen 148418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen /* XXX this is disabled so that if we call SwapBuffers on an unbound 149418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen * window we can determine the last context bound to the window and 150418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen * use that context's lock. (BrianP, 2-Dec-2000) 151418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen */ 152418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen pcp->driDrawablePriv = pcp->driReadablePriv = NULL; 153418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen 154680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#if 0 155680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* Unbind the drawable */ 156680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->driContextPriv = &psp->dummyContextPriv; 157680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#endif 158680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 159680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return GL_TRUE; 160680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 161680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 162680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 163680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function takes both a read buffer and a draw buffer. This is needed 164680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * for \c glXMakeCurrentReadSGI or GLX 1.3's \c glXMakeContextCurrent 165680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * function. 166680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 167e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int driBindContext(__DRIcontext *pcp, 168e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIdrawable *pdp, 169e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIdrawable *prp) 170680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 171d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *psp = NULL; 172680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 173680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* Bind the drawable to the context */ 1748e753d04045a82062ac34d3b2622eb9dba8af374Thomas Hellstrom 175418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen if (pcp) { 176c994f08eb1ec2a4bbaa44fbd6d35e7ff033d5c3cVinson Lee psp = pcp->driScreenPriv; 177418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen pcp->driDrawablePriv = pdp; 178418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen pcp->driReadablePriv = prp; 179418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen if (pdp) { 180418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen pdp->driContextPriv = pcp; 181418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen dri_get_drawable(pdp); 1828e753d04045a82062ac34d3b2622eb9dba8af374Thomas Hellstrom } 183418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen if ( prp && pdp != prp ) { 184418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen dri_get_drawable(prp); 185418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen } 186418cdc66ec10c1f3005320ab46404b907c30e37dPauli Nieminen } 187680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 188680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* 189680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** Now that we have a context associated with this drawable, we can 190680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** initialize the drawable information if has not been done before. 191680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 192680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 193e63f532d26d82c06281840a84c73e2e36d7b3e1eVinson Lee assert(psp); 194f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg if (!psp->dri2.enabled) { 1958e753d04045a82062ac34d3b2622eb9dba8af374Thomas Hellstrom if (pdp && !pdp->pStamp) { 1967da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); 1977da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg __driUtilUpdateDrawableInfo(pdp); 1987da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); 1997da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg } 2008e753d04045a82062ac34d3b2622eb9dba8af374Thomas Hellstrom if (prp && pdp != prp && !prp->pStamp) { 2017da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); 2027da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg __driUtilUpdateDrawableInfo(prp); 2037da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); 2048e753d04045a82062ac34d3b2622eb9dba8af374Thomas Hellstrom } 2057b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick } 2067b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick 207680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* Call device-specific MakeCurrent */ 208680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 209c952b3e907ab31cd5f95157c18ce2f81626aafe4Thomas Hellstrom return (*psp->DriverAPI.MakeCurrent)(pcp, pdp, prp); 210680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 211680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 212680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@}*/ 213680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 214680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 215680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 216680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Drawable handling functions */ 217680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 218680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/ 219680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 220680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 221680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Update private drawable information. 222680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 223680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param pdp pointer to the private drawable information to update. 224680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 225d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg * This function basically updates the __DRIdrawable struct's 2265f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick * cliprect information by calling \c __DRIinterfaceMethods::getDrawableInfo. 2275f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick * This is usually called by the DRI_VALIDATE_DRAWABLE_INFO macro which 228680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * compares the __DRIdrwablePrivate pStamp and lastStamp values. If 229680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * the values are different that means we have to update the clipping 230680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * info. 231680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 232680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellvoid 233d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__driUtilUpdateDrawableInfo(__DRIdrawable *pdp) 234680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 235d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *psp = pdp->driScreenPriv; 236d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext *pcp = pdp->driContextPriv; 237680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 2387b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick if (!pcp 2397b1ff326071658d5bd6e7feb2ad78d0e0209211dIan Romanick || ((pdp != pcp->driDrawablePriv) && (pdp != pcp->driReadablePriv))) { 240682393944c72ecfabe8df674af0b48975e90b98cThomas Hellström /* ERROR!!! 241682393944c72ecfabe8df674af0b48975e90b98cThomas Hellström * ...but we must ignore it. There can be many contexts bound to a 242682393944c72ecfabe8df674af0b48975e90b98cThomas Hellström * drawable. 243682393944c72ecfabe8df674af0b48975e90b98cThomas Hellström */ 244680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 245680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 246680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if (pdp->pClipRects) { 24732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(pdp->pClipRects); 248a903749b246fce26038c66d06fe7eb77daf815abMichel Dänzer pdp->pClipRects = NULL; 249680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 250680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 251680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if (pdp->pBackClipRects) { 25232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(pdp->pBackClipRects); 253a903749b246fce26038c66d06fe7eb77daf815abMichel Dänzer pdp->pBackClipRects = NULL; 254680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 255680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 256680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); 257680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 258e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (! (*psp->getDrawableInfo->getDrawableInfo)(pdp, 259680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell &pdp->index, &pdp->lastStamp, 260680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell &pdp->x, &pdp->y, &pdp->w, &pdp->h, 261680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell &pdp->numClipRects, &pdp->pClipRects, 262680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell &pdp->backX, 263680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell &pdp->backY, 264680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell &pdp->numBackClipRects, 265e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg &pdp->pBackClipRects, 266e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg pdp->loaderPrivate)) { 267680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* Error -- eg the window may have been destroyed. Keep going 268680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * with no cliprects. 269680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 270680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pStamp = &pdp->lastStamp; /* prevent endless loop */ 271680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->numClipRects = 0; 272680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pClipRects = NULL; 273680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->numBackClipRects = 0; 274680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pBackClipRects = NULL; 275680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 276680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell else 277680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pStamp = &(psp->pSAREA->drawableTable[pdp->index].stamp); 278680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 279680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); 280680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 281680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 282680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@}*/ 283680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 284680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 285680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name GLX callbacks */ 286680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 287680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/ 288680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 289e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic void driReportDamage(__DRIdrawable *pdp, 290e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg struct drm_clip_rect *pClipRects, int numClipRects) 291e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 292e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIscreen *psp = pdp->driScreenPriv; 293e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 294e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg /* Check that we actually have the new damage report method */ 295f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg if (psp->damage) { 296e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg /* Report the damage. Currently, all our drivers draw 297e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * directly to the front buffer, so we report the damage there 298e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * rather than to the backing storein (if any). 299e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 300e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg (*psp->damage->reportDamage)(pdp, 301e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg pdp->x, pdp->y, 302e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg pClipRects, numClipRects, 303e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg GL_TRUE, pdp->loaderPrivate); 304e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg } 305e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 306e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 307e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 308680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 309680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Swap buffers. 310680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 311680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param drawablePrivate opaque pointer to the per-drawable private info. 312680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 313680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal 314d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg * This function calls __DRIdrawable::swapBuffers. 315680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 316680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Is called directly from glXSwapBuffers(). 317680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 318e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic void driSwapBuffers(__DRIdrawable *dPriv) 319680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 320e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIscreen *psp = dPriv->driScreenPriv; 3217627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao drm_clip_rect_t *rects; 3227627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao int i; 3232407e48f2805e27e76e2e1d7083926c4077d9032Xiang, Haihao 324e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->DriverAPI.SwapBuffers(dPriv); 325c2b185cff82a6cdb723cda4e05ffe1a213a9de3eEric Anholt 32643c7ffaea635f949fd4803c4f594cf53e4b98f24Younes Manton if (!dPriv->numClipRects) 32743c7ffaea635f949fd4803c4f594cf53e4b98f24Younes Manton return; 32843c7ffaea635f949fd4803c4f594cf53e4b98f24Younes Manton 32932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg rects = malloc(sizeof(*rects) * dPriv->numClipRects); 3307627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao 3317627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao if (!rects) 3327627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao return; 3337627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao 3347627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao for (i = 0; i < dPriv->numClipRects; i++) { 3357627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao rects[i].x1 = dPriv->pClipRects[i].x1 - dPriv->x; 3367627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao rects[i].y1 = dPriv->pClipRects[i].y1 - dPriv->y; 3377627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao rects[i].x2 = dPriv->pClipRects[i].x2 - dPriv->x; 3387627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao rects[i].y2 = dPriv->pClipRects[i].y2 - dPriv->y; 3397627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao } 3407627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao 3417627c7f5dfa3b1bc7be9d1670668a81a70d9f64aXiang, Haihao driReportDamage(dPriv, rects, dPriv->numClipRects); 34232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(rects); 343680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 344680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 345e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int driDrawableGetMSC( __DRIscreen *sPriv, __DRIdrawable *dPriv, 34638fdb47d26055e19d50cd407266b56ed4317ae0aJesse Barnes int64_t *msc ) 34738fdb47d26055e19d50cd407266b56ed4317ae0aJesse Barnes{ 3486e8d21d72f35767e07081a8bee4323aaaf5e2aaeKristian Høgsberg return sPriv->DriverAPI.GetDrawableMSC(sPriv, dPriv, msc); 349680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 350680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 3513f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul 352e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int driWaitForMSC(__DRIdrawable *dPriv, int64_t target_msc, 3535987a03f994af2bb413d1cf984ab01aa095c0943Kristian Høgsberg int64_t divisor, int64_t remainder, 3545987a03f994af2bb413d1cf984ab01aa095c0943Kristian Høgsberg int64_t * msc, int64_t * sbc) 355680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 356680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell __DRIswapInfo sInfo; 357680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell int status; 358680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 359680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell status = dPriv->driScreenPriv->DriverAPI.WaitForMSC( dPriv, target_msc, 360680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell divisor, remainder, 361680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell msc ); 362680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 363680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* GetSwapInfo() may not be provided by the driver if GLX_SGI_video_sync 364680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * is supported but GLX_OML_sync_control is not. Therefore, don't return 365680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * an error value if GetSwapInfo() is not implemented. 366680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 367680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if ( status == 0 368680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell && dPriv->driScreenPriv->DriverAPI.GetSwapInfo ) { 369680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell status = dPriv->driScreenPriv->DriverAPI.GetSwapInfo( dPriv, & sInfo ); 370680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *sbc = sInfo.swap_count; 371680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 372680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 373680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return status; 374680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 375680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 3763f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul 377106a6f29bbdc71982afd629bdf89369cefd1459eKristian Høgsbergconst __DRImediaStreamCounterExtension driMediaStreamCounterExtension = { 378ccff0cb26378ce370fc8697a2a2ada138d2e119eKristian Høgsberg { __DRI_MEDIA_STREAM_COUNTER, __DRI_MEDIA_STREAM_COUNTER_VERSION }, 379106a6f29bbdc71982afd629bdf89369cefd1459eKristian Høgsberg driWaitForMSC, 38038fdb47d26055e19d50cd407266b56ed4317ae0aJesse Barnes driDrawableGetMSC, 381106a6f29bbdc71982afd629bdf89369cefd1459eKristian Høgsberg}; 382680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 3833f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul 384e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic void driCopySubBuffer(__DRIdrawable *dPriv, 385f2ad1b60c0da11283b399008f491792790cea294Brian Paul int x, int y, int w, int h) 386f2ad1b60c0da11283b399008f491792790cea294Brian Paul{ 387e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg drm_clip_rect_t rect; 388e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 389e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg rect.x1 = x; 390377016d728ace47c9eeb3ac2f01191608ab060f6Dennis Kasprzyk rect.y1 = dPriv->h - y - h; 391e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg rect.x2 = x + w; 392377016d728ace47c9eeb3ac2f01191608ab060f6Dennis Kasprzyk rect.y2 = rect.y1 + h; 393e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driReportDamage(dPriv, &rect, 1); 3943a94b25538c647df965a93cd7734b841257ef203Peter Hutterer 3953a94b25538c647df965a93cd7734b841257ef203Peter Hutterer dPriv->driScreenPriv->DriverAPI.CopySubBuffer(dPriv, x, y, w, h); 396f2ad1b60c0da11283b399008f491792790cea294Brian Paul} 397680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 398ac3e838fa748c8c8a6ffc04d1ab13da71f75f103Kristian Høgsbergconst __DRIcopySubBufferExtension driCopySubBufferExtension = { 399ccff0cb26378ce370fc8697a2a2ada138d2e119eKristian Høgsberg { __DRI_COPY_SUB_BUFFER, __DRI_COPY_SUB_BUFFER_VERSION }, 400ccff0cb26378ce370fc8697a2a2ada138d2e119eKristian Høgsberg driCopySubBuffer 401ac3e838fa748c8c8a6ffc04d1ab13da71f75f103Kristian Høgsberg}; 402ac3e838fa748c8c8a6ffc04d1ab13da71f75f103Kristian Høgsberg 403e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic void driSetSwapInterval(__DRIdrawable *dPriv, unsigned int interval) 404efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg{ 405e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg dPriv->swap_interval = interval; 406efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg} 407efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg 408e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic unsigned int driGetSwapInterval(__DRIdrawable *dPriv) 409efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg{ 410e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return dPriv->swap_interval; 411efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg} 412efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg 413efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsbergconst __DRIswapControlExtension driSwapControlExtension = { 414ccff0cb26378ce370fc8697a2a2ada138d2e119eKristian Høgsberg { __DRI_SWAP_CONTROL, __DRI_SWAP_CONTROL_VERSION }, 415efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg driSetSwapInterval, 416efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg driGetSwapInterval 417efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg}; 418efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg 419efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg 420680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 421680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This is called via __DRIscreenRec's createNewDrawable pointer. 422680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 423e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIdrawable * 424e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriCreateNewDrawable(__DRIscreen *psp, const __DRIconfig *config, 425e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg drm_drawable_t hwDrawable, int renderType, 426e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const int *attrs, void *data) 427680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 428e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIdrawable *pdp; 4291960182ece3f1eca06d2e439f64dd61be8a03ff5Ian Romanick 430680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* Since pbuffers are not yet supported, no drawable attributes are 431680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * supported either. 432680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 433680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell (void) attrs; 434680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 43532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg pdp = malloc(sizeof *pdp); 436680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if (!pdp) { 437680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return NULL; 438680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 439680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 440e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg pdp->loaderPrivate = data; 4414ff95e78e19e5902352ea3759d32d9f013255f42Kristian Høgsberg pdp->hHWDrawable = hwDrawable; 4423264352c577ce1d6681e70abd76624ede906df71Dave Airlie pdp->refcount = 1; 443680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pStamp = NULL; 444680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->lastStamp = 0; 445680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->index = 0; 446680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->x = 0; 447680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->y = 0; 448680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->w = 0; 449680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->h = 0; 450680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->numClipRects = 0; 451680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->numBackClipRects = 0; 452680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pClipRects = NULL; 453680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pBackClipRects = NULL; 45438fdb47d26055e19d50cd407266b56ed4317ae0aJesse Barnes pdp->vblSeq = 0; 45538fdb47d26055e19d50cd407266b56ed4317ae0aJesse Barnes pdp->vblFlags = 0; 456680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 457680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->driScreenPriv = psp; 458680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->driContextPriv = &psp->dummyContextPriv; 459680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 460e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (!(*psp->DriverAPI.CreateBuffer)(psp, pdp, &config->modes, 461680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell renderType == GLX_PIXMAP_BIT)) { 46232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(pdp); 463680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return NULL; 464680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 465680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 46638fdb47d26055e19d50cd407266b56ed4317ae0aJesse Barnes pdp->msc_base = 0; 467680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 468c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick /* This special default value is replaced with the configured 469c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * default value when the drawable is first bound to a direct 470c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * rendering context. 471c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick */ 472efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg pdp->swap_interval = (unsigned)-1; 473680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 474e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return pdp; 475e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 476680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 4773f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul 478e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIdrawable * 479f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergdri2CreateNewDrawable(__DRIscreen *screen, 480f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg const __DRIconfig *config, 481f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg void *loaderPrivate) 482e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 483e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIdrawable *pdraw; 4847da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg 485f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg pdraw = driCreateNewDrawable(screen, config, 0, 0, NULL, loaderPrivate); 4865cf69fe511a67a7bcf6787974becf6a143abb507Alan Hourihane if (!pdraw) 4875cf69fe511a67a7bcf6787974becf6a143abb507Alan Hourihane return NULL; 488e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 489925b901ba313a3ddd7567eca088951be39414430Kristian Høgsberg pdraw->pClipRects = &pdraw->dri2.clipRect; 490925b901ba313a3ddd7567eca088951be39414430Kristian Høgsberg pdraw->pBackClipRects = &pdraw->dri2.clipRect; 491e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 49261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdraw->pStamp = &pdraw->dri2.stamp; 49361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez *pdraw->pStamp = pdraw->lastStamp + 1; 49461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 495e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return pdraw; 496680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 497680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 4983264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_get_drawable(__DRIdrawable *pdp) 4993264352c577ce1d6681e70abd76624ede906df71Dave Airlie{ 5003264352c577ce1d6681e70abd76624ede906df71Dave Airlie pdp->refcount++; 5013264352c577ce1d6681e70abd76624ede906df71Dave Airlie} 5023264352c577ce1d6681e70abd76624ede906df71Dave Airlie 5033264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void dri_put_drawable(__DRIdrawable *pdp) 504680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 505d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *psp; 506680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 507680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if (pdp) { 508f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee pdp->refcount--; 509f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee if (pdp->refcount) 510f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee return; 511f622b649fb0c55b1640997f9d32ea327743519a1Vinson Lee 512eab896cc213157758d74a2f39b5e3b1e748c071fDave Airlie psp = pdp->driScreenPriv; 513680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell (*psp->DriverAPI.DestroyBuffer)(pdp); 514925b901ba313a3ddd7567eca088951be39414430Kristian Høgsberg if (pdp->pClipRects && pdp->pClipRects != &pdp->dri2.clipRect) { 51532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(pdp->pClipRects); 516680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pClipRects = NULL; 517680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 518925b901ba313a3ddd7567eca088951be39414430Kristian Høgsberg if (pdp->pBackClipRects && pdp->pClipRects != &pdp->dri2.clipRect) { 51932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(pdp->pBackClipRects); 520680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pdp->pBackClipRects = NULL; 521680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 52232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(pdp); 523680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 524680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 525680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 5263264352c577ce1d6681e70abd76624ede906df71Dave Airliestatic void 5273264352c577ce1d6681e70abd76624ede906df71Dave AirliedriDestroyDrawable(__DRIdrawable *pdp) 5283264352c577ce1d6681e70abd76624ede906df71Dave Airlie{ 5293264352c577ce1d6681e70abd76624ede906df71Dave Airlie dri_put_drawable(pdp); 5303264352c577ce1d6681e70abd76624ede906df71Dave Airlie} 5313264352c577ce1d6681e70abd76624ede906df71Dave Airlie 532680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@}*/ 533680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 534680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 535680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 536680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Context handling functions */ 537680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 538680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/ 539680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 540680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 541680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Destroy the per-context private information. 542680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 543680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal 544680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::DestroyContext on \p contextPrivate, calls 545680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * drmDestroyContext(), and finally frees \p contextPrivate. 546680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 547b4b040f7d83f5f4917c48bf5833394d550e30421Brian Paulstatic void 548e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriDestroyContext(__DRIcontext *pcp) 549680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 550680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if (pcp) { 551680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell (*pcp->driScreenPriv->DriverAPI.DestroyContext)(pcp); 55232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(pcp); 553680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 554680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 555680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 556680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 557680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 558680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Create the per-drawable private driver information. 559680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 560680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param render_type Type of rendering target. \c GLX_RGBA is the only 561680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * type likely to ever be supported for direct-rendering. 5623f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * \param shared Context with which to share textures, etc. or NULL 563680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 564680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \returns An opaque pointer to the per-context private information on 565680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * success, or \c NULL on failure. 566680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 567680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal 568d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg * This function allocates and fills a __DRIcontextRec structure. It 569680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * performs some device independent initialization and passes all the 570680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * relevent information to __DriverAPIRec::CreateContext to create the 571680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * context. 572680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 573680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 574e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIcontext * 575e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriCreateNewContext(__DRIscreen *psp, const __DRIconfig *config, 576ecdb45cb29e3209287cc297081596126e955ff2bKristian Høgsberg int render_type, __DRIcontext *shared, 577e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg drm_context_t hwContext, void *data) 578680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 579e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIcontext *pcp; 580e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg void * const shareCtx = (shared != NULL) ? shared->driverPrivate : NULL; 581680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 58232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg pcp = malloc(sizeof *pcp); 583e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (!pcp) 584680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return NULL; 585680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 586680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pcp->driScreenPriv = psp; 587680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell pcp->driDrawablePriv = NULL; 58893931d9e684cd5a5659c3f28f8da7294ac174542Kristian Høgsberg pcp->loaderPrivate = data; 58993931d9e684cd5a5659c3f28f8da7294ac174542Kristian Høgsberg 590d449627829e1a4a3250a1a723af2f4e3cd5fd194Kristian Høgsberg pcp->dri2.draw_stamp = 0; 591d449627829e1a4a3250a1a723af2f4e3cd5fd194Kristian Høgsberg pcp->dri2.read_stamp = 0; 592680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* When the first context is created for a screen, initialize a "dummy" 593680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * context. 594680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 595680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 5967da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg if (!psp->dri2.enabled && !psp->dummyContextPriv.driScreenPriv) { 597680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->dummyContextPriv.hHWContext = psp->pSAREA->dummy_context; 598680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->dummyContextPriv.driScreenPriv = psp; 599680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->dummyContextPriv.driDrawablePriv = NULL; 600680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->dummyContextPriv.driverPrivate = NULL; 601680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* No other fields should be used! */ 602680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 603680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 604e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg pcp->hHWContext = hwContext; 60574d563cdfbfb07cc666d60dc909e90ddb9949cbbKeith Whitwell 606e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if ( !(*psp->DriverAPI.CreateContext)(&config->modes, pcp, shareCtx) ) { 60732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(pcp); 608680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return NULL; 609680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 610680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 611680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return pcp; 612680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 613ac3e838fa748c8c8a6ffc04d1ab13da71f75f103Kristian Høgsberg 6143f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul 615e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIcontext * 616e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergdri2CreateNewContext(__DRIscreen *screen, const __DRIconfig *config, 617e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIcontext *shared, void *data) 618f616a263a25eda135800bea7d3a863c569b93e30Kristian Høgsberg{ 619f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg return driCreateNewContext(screen, config, 0, shared, 0, data); 620f616a263a25eda135800bea7d3a863c569b93e30Kristian Høgsberg} 621680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 6223f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul 623e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic int 624e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriCopyContext(__DRIcontext *dest, __DRIcontext *src, unsigned long mask) 625e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 626e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return GL_FALSE; 627e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 628e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 629e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/*@}*/ 630e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 631e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 632680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 633680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** \name Screen handling functions */ 634680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*****************************************************************/ 635680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@{*/ 636680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 637680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 638680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Destroy the per-screen private information. 639680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 640680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \internal 641680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * This function calls __DriverAPIRec::DestroyScreen on \p screenPrivate, calls 642680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * drmClose(), and finally frees \p screenPrivate. 643680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 644e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic void driDestroyScreen(__DRIscreen *psp) 645680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 646680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if (psp) { 647680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* No interaction with the X-server is possible at this point. This 648680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * routine is called after XCloseDisplay, so there is no protocol 649680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * stream open to the X-server anymore. 650680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 651680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 652680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if (psp->DriverAPI.DestroyScreen) 653680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell (*psp->DriverAPI.DestroyScreen)(psp); 654680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 655f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg if (!psp->dri2.enabled) { 6567da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg (void)drmUnmap((drmAddress)psp->pSAREA, SAREA_MAX); 6577da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg (void)drmUnmap((drmAddress)psp->pFB, psp->fbSize); 6587da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg (void)drmCloseOnce(psp->fd); 6597da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg } 660e5c28321b2047418ba960c5f9c3aa86cf2514bbbTilman Sauerbeck 66132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(psp); 662680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 663680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 664680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 6656cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsbergstatic void 666e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergsetupLoaderExtensions(__DRIscreen *psp, 6676cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg const __DRIextension **extensions) 6686cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg{ 6696cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg int i; 6706cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg 6716cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg for (i = 0; extensions[i]; i++) { 6726cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg if (strcmp(extensions[i]->name, __DRI_GET_DRAWABLE_INFO) == 0) 6736cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg psp->getDrawableInfo = (__DRIgetDrawableInfoExtension *) extensions[i]; 6746cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg if (strcmp(extensions[i]->name, __DRI_DAMAGE) == 0) 6756cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg psp->damage = (__DRIdamageExtension *) extensions[i]; 6766cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg if (strcmp(extensions[i]->name, __DRI_SYSTEM_TIME) == 0) 6776cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg psp->systemTime = (__DRIsystemTimeExtension *) extensions[i]; 678f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg if (strcmp(extensions[i]->name, __DRI_DRI2_LOADER) == 0) 679f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg psp->dri2.loader = (__DRIdri2LoaderExtension *) extensions[i]; 680c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (strcmp(extensions[i]->name, __DRI_IMAGE_LOOKUP) == 0) 681c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg psp->dri2.image = (__DRIimageLookupExtension *) extensions[i]; 6826cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg } 6836cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg} 6846cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg 685680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 68664106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * This is the bootstrap function for the driver. libGL supplies all of the 68764106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * requisite information about the system, and the driver initializes itself. 68864106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * This routine also fills in the linked list pointed to by \c driver_modes 68964106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * with the \c __GLcontextModes that the driver can support for windows or 69064106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * pbuffers. 6913f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * 6923f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * For legacy DRI. 693680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 694680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param scrn Index of the screen 695680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param ddx_version Version of the 2D DDX. This may not be meaningful for 696680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * all drivers. 697680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param dri_version Version of the "server-side" DRI. 698680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param drm_version Version of the kernel DRM. 699680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param frame_buffer Data describing the location and layout of the 700680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * framebuffer. 701680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param pSAREA Pointer the the SAREA. 702680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param fd Device handle for the DRM. 7033f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * \param extensions ?? 7043f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * \param driver_modes Returns modes suppoted by the driver 7053f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * \param loaderPrivate ?? 706c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * 70764106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * \note There is no need to check the minimum API version in this 70864106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * function. Since the name of this function is versioned, it is 70964106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg * impossible for a loader that is too old to even load this driver. 710680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 711e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIscreen * 712e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriCreateNewScreen(int scrn, 713e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const __DRIversion *ddx_version, 714e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const __DRIversion *dri_version, 715e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const __DRIversion *drm_version, 716e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const __DRIframebuffer *frame_buffer, 717e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg drmAddress pSAREA, int fd, 718e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const __DRIextension **extensions, 719e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const __DRIconfig ***driver_modes, 720e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg void *loaderPrivate) 721680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 722efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg static const __DRIextension *emptyExtensionList[] = { NULL }; 723e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIscreen *psp; 724680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 72532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg psp = calloc(1, sizeof *psp); 72664106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg if (!psp) 727680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return NULL; 728680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 7296cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg setupLoaderExtensions(psp, extensions); 7306cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg 731680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* 732680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** NOT_DONE: This is used by the X server to detect when the client 733680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** has died while holding the drawable lock. The client sets the 734680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** drawable lock to this value. 735680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 736680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->drawLockID = 1; 737680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 738efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg psp->drm_version = *drm_version; 739efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg psp->ddx_version = *ddx_version; 740efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg psp->dri_version = *dri_version; 741680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 742680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->pSAREA = pSAREA; 7437da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg psp->lock = (drmLock *) &psp->pSAREA->lock; 744680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 745680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->pFB = frame_buffer->base; 746680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->fbSize = frame_buffer->size; 747680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->fbStride = frame_buffer->stride; 748680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->fbWidth = frame_buffer->width; 749680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->fbHeight = frame_buffer->height; 750680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->devPrivSize = frame_buffer->dev_priv_size; 751680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->pDevPriv = frame_buffer->dev_priv; 752fd4f7064e24654c89248be6d76f39c7baf22fce4Jon Smirl psp->fbBPP = psp->fbStride * 8 / frame_buffer->width; 753680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 754ac3e838fa748c8c8a6ffc04d1ab13da71f75f103Kristian Høgsberg psp->extensions = emptyExtensionList; 755680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->fd = fd; 75664106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg psp->myNum = scrn; 7577da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg psp->dri2.enabled = GL_FALSE; 758680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 759680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* 760680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** Do not init dummy context here; actual initialization will be 761680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** done when the first DRI context is created. Init screen priv ptr 762680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell ** to NULL to let CreateContext routine that it needs to be inited. 763680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 764680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell psp->dummyContextPriv.driScreenPriv = NULL; 765680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 766e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->DriverAPI = driDriverAPI; 767680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 768e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg *driver_modes = driDriverAPI.InitScreen(psp); 76964106d0d9aeefa6974317042b6bc3e5eaabac5a2Kristian Høgsberg if (*driver_modes == NULL) { 77032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(psp); 771680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return NULL; 772680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 773680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 774680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return psp; 775680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 776680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 7773f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul/** 7783f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul * DRI2 7793f3e4f645d389672e6d72215e60b812a887cc66dBrian Paul */ 780e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIscreen * 781f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergdri2CreateNewScreen(int scrn, int fd, 782e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const __DRIextension **extensions, 783e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg const __DRIconfig ***driver_configs, void *data) 7847da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg{ 7857da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg static const __DRIextension *emptyExtensionList[] = { NULL }; 786e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIscreen *psp; 78716242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg drmVersionPtr version; 788129b9ad16f95421d12f77c1bd3eca915d8768b78Kristian Høgsberg 789e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (driDriverAPI.InitScreen2 == NULL) 790129b9ad16f95421d12f77c1bd3eca915d8768b78Kristian Høgsberg return NULL; 7917da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg 79232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg psp = calloc(1, sizeof(*psp)); 7937da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg if (!psp) 7947da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg return NULL; 7957da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg 7966cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg setupLoaderExtensions(psp, extensions); 7976cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg 79816242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg version = drmGetVersion(fd); 79916242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg if (version) { 80016242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg psp->drm_version.major = version->version_major; 80116242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg psp->drm_version.minor = version->version_minor; 80216242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg psp->drm_version.patch = version->version_patchlevel; 80316242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg drmFreeVersion(version); 80416242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg } 80516242a8007f41ab63f9a28bb9a750857c8cdb8afKristian Høgsberg 8067da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg psp->extensions = emptyExtensionList; 8077da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg psp->fd = fd; 8087da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg psp->myNum = scrn; 8097da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg psp->dri2.enabled = GL_TRUE; 8107da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg 811e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->DriverAPI = driDriverAPI; 812e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg *driver_configs = driDriverAPI.InitScreen2(psp); 813e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (*driver_configs == NULL) { 81432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(psp); 8157da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg return NULL; 8167da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg } 8177da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg 818e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->DriverAPI = driDriverAPI; 819e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8207da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg return psp; 8217da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg} 8227da5705b090d9c97a9b765d786c5e89afe9d1f25Kristian Høgsberg 823e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension **driGetExtensions(__DRIscreen *psp) 824e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 825e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return psp->extensions; 826e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 827e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 828f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg/** Core interface */ 829e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst __DRIcoreExtension driCoreExtension = { 830e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg { __DRI_CORE, __DRI_CORE_VERSION }, 831f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg NULL, 832e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driDestroyScreen, 833e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driGetExtensions, 834e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driGetConfigAttrib, 835e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driIndexConfigAttrib, 836f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg NULL, 837e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driDestroyDrawable, 838e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driSwapBuffers, 839f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg NULL, 840e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driCopyContext, 841e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driDestroyContext, 842e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driBindContext, 843e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg driUnbindContext 844e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 845e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 846f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg/** Legacy DRI interface */ 847f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergconst __DRIlegacyExtension driLegacyExtension = { 848f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg { __DRI_LEGACY, __DRI_LEGACY_VERSION }, 849f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg driCreateNewScreen, 850f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg driCreateNewDrawable, 851f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg driCreateNewContext, 852f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}; 853f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 85439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/** DRI2 interface */ 855f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergconst __DRIdri2Extension driDRI2Extension = { 856f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg { __DRI_DRI2, __DRI_DRI2_VERSION }, 857f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg dri2CreateNewScreen, 858f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg dri2CreateNewDrawable, 859f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg dri2CreateNewContext, 860f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}; 861f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 862680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellstatic int 863a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian HøgsbergdriFrameTracking(__DRIdrawable *drawable, GLboolean enable) 864a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsberg{ 865a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsberg return GLX_BAD_CONTEXT; 866a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsberg} 867a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsberg 868a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsbergstatic int 869e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriQueryFrameTracking(__DRIdrawable *dpriv, 8705987a03f994af2bb413d1cf984ab01aa095c0943Kristian Høgsberg int64_t * sbc, int64_t * missedFrames, 8715987a03f994af2bb413d1cf984ab01aa095c0943Kristian Høgsberg float * lastMissedUsage, float * usage) 872680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 873680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell __DRIswapInfo sInfo; 874680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell int status; 875680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell int64_t ust; 876d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *psp = dpriv->driScreenPriv; 877680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 878680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell status = dpriv->driScreenPriv->DriverAPI.GetSwapInfo( dpriv, & sInfo ); 879680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell if ( status == 0 ) { 880680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *sbc = sInfo.swap_count; 881680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *missedFrames = sInfo.swap_missed_count; 882680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *lastMissedUsage = sInfo.swap_missed_usage; 883680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 8846cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg (*psp->systemTime->getUST)( & ust ); 885680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *usage = driCalculateSwapUsage( dpriv, sInfo.swap_ust, ust ); 886680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 887680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 888680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return status; 889680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 890680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 891a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsbergconst __DRIframeTrackingExtension driFrameTrackingExtension = { 892ccff0cb26378ce370fc8697a2a2ada138d2e119eKristian Høgsberg { __DRI_FRAME_TRACKING, __DRI_FRAME_TRACKING_VERSION }, 893a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsberg driFrameTracking, 894a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsberg driQueryFrameTracking 895a7a0a2beb54dcb78d7e0ab64cf2f5a6ede8191a4Kristian Høgsberg}; 896680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 897680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/** 898680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Calculate amount of swap interval used between GLX buffer swaps. 899680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 900680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * The usage value, on the range [0,max], is the fraction of total swap 901680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * interval time used between GLX buffer swaps is calculated. 902680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 903680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \f$p = t_d / (i * t_r)\f$ 904680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 905680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Where \f$t_d\f$ is the time since the last GLX buffer swap, \f$i\f$ is the 906680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * swap interval (as set by \c glXSwapIntervalSGI), and \f$t_r\f$ time 907680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * required for a single vertical refresh period (as returned by \c 908680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * glXGetMscRateOML). 909680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 910680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * See the documentation for the GLX_MESA_swap_frame_usage extension for more 911680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * details. 912680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 913680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param dPriv Pointer to the private drawable structure. 914680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \return If less than a single swap interval time period was required 915680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * between GLX buffer swaps, a number greater than 0 and less than 916680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 1.0 is returned. If exactly one swap interval time period is 917680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * required, 1.0 is returned, and if more than one is required then 918680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * a number greater than 1.0 will be returned. 919680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 920680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \sa glXSwapIntervalSGI glXGetMscRateOML 921680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 922680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \todo Instead of caching the \c glXGetMscRateOML function pointer, would it 923680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * be possible to cache the sync rate? 924680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 925680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwellfloat 926d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergdriCalculateSwapUsage( __DRIdrawable *dPriv, int64_t last_swap_ust, 927680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell int64_t current_ust ) 928680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{ 929680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell int32_t n; 930680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell int32_t d; 931680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell int interval; 932680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell float usage = 1.0; 933d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *psp = dPriv->driScreenPriv; 934680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 935e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if ( (*psp->systemTime->getMSCRate)(dPriv, &n, &d, dPriv->loaderPrivate) ) { 936efaf90b03e8b69e04909bce071f8ef6b65cc0e9dKristian Høgsberg interval = (dPriv->swap_interval != 0) ? dPriv->swap_interval : 1; 937680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 938680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 939680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell /* We want to calculate 940680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * (current_UST - last_swap_UST) / (interval * us_per_refresh). We get 941680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * current_UST by calling __glXGetUST. last_swap_UST is stored in 942680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * dPriv->swap_ust. interval has already been calculated. 943680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 944680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * The only tricky part is us_per_refresh. us_per_refresh is 945680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 1000000 / MSC_rate. We know the MSC_rate is n / d. We can flip it 946680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * around and say us_per_refresh = 1000000 * d / n. Since this goes in 947680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * the denominator of the final calculation, we calculate 948680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * (interval * 1000000 * d) and move n into the numerator. 949680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */ 950680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 951680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell usage = (current_ust - last_swap_ust); 952680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell usage *= n; 953680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell usage /= (interval * d); 954680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell usage /= 1000000.0; 955680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell } 956680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 957680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell return usage; 958680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell} 959680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell 96061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezvoid 96161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateDrawable(__DRIdrawable *drawable) 96261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{ 96361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez drawable->dri2.stamp++; 96461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez} 96561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 966680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*@}*/ 967