dri2_glx.c revision 81cca6d4538bdde1661ce868af2a5de47cd251ab
1e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* 2e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Copyright © 2008 Red Hat, Inc. 3e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * 4e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a 5e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * copy of this software and associated documentation files (the "Soft- 6e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * ware"), to deal in the Software without restriction, including without 7e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * limitation the rights to use, copy, modify, merge, publish, distribute, 8e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the 9e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Software is furnished to do so, provided that the above copyright 10e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * notice(s) and this permission notice appear in all copies of the Soft- 11e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * ware and that both the above copyright notice(s) and this permission 12e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * notice appear in supporting documentation. 13e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * 14e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 16e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY 17e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN 18e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE- 19e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 20e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 21e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR- 22e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * MANCE OF THIS SOFTWARE. 23e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * 24e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Except as contained in this notice, the name of a copyright holder shall 25e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * not be used in advertising or otherwise to promote the sale, use or 26e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * other dealings in this Software without prior written authorization of 27e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * the copyright holder. 28e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * 29e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Authors: 30e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Kristian Høgsberg (krh@redhat.com) 31e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 32e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 33e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#ifdef GLX_DIRECT_RENDERING 34e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 356497d50924230e6b96929c8da0c2bd7287b70d8aAlan Hourihane#include <X11/Xlib.h> 36e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <X11/extensions/Xfixes.h> 37e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <X11/extensions/Xdamage.h> 38a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#include "glapi.h" 39e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "glxclient.h" 40df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#include "glcontextmodes.h" 41e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "xf86dri.h" 42e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <dlfcn.h> 434830809524b20e517e949151957512b14d7e679aKristian Høgsberg#include <fcntl.h> 444830809524b20e517e949151957512b14d7e679aKristian Høgsberg#include <unistd.h> 45e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <sys/types.h> 46e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <sys/mman.h> 47e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "xf86drm.h" 48e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "dri2.h" 49079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#include "dri_common.h" 50efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes#include "../../mesa/drivers/dri/common/dri_util.h" 51e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 52dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick#undef DRI2_MINOR 53dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick#define DRI2_MINOR 1 54dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 55e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergtypedef struct __GLXDRIdisplayPrivateRec __GLXDRIdisplayPrivate; 56e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergtypedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate; 57f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergtypedef struct __GLXDRIdrawablePrivateRec __GLXDRIdrawablePrivate; 58e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstruct __GLXDRIdisplayPrivateRec 600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdisplay base; 62e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* 64e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg ** XFree86-DRI version information 65e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driMajor; 670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driMinor; 680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driPatch; 69a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes int swapAvailable; 70e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 71e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstruct __GLXDRIcontextPrivateRec 730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontext base; 750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *driContext; 760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXscreenConfigs *psc; 77e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 78e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstruct __GLXDRIdrawablePrivateRec 800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable base; 820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIbuffer buffers[5]; 830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int bufferCount; 840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int width, height; 850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_back; 860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_fake_front; 87efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes int swap_interval; 88f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}; 89f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void dri2WaitX(__GLXDRIdrawable * pdraw); 915ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyContext(__GLXDRIcontext * context, 940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXscreenConfigs * psc, Display * dpy) 95e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; 970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 98e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->destroyContext) (pcp->driContext); 100e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 102e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 103e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool 1050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2BindContext(__GLXDRIcontext * context, 1060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable * draw, __GLXDRIdrawable * read) 107e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; 1090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 110e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return (*core->bindContext) (pcp->driContext, 1120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf draw->driDrawable, read->driDrawable); 113e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 114e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 1160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2UnbindContext(__GLXDRIcontext * context) 117e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; 1190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 120e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->unbindContext) (pcp->driContext); 122e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 123e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIcontext * 1250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateContext(__GLXscreenConfigs * psc, 1260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __GLcontextModes * mode, 1270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLXContext gc, GLXContext shareList, int renderType) 128e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontextPrivate *pcp, *pcp_shared; 1300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode; 1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *shared = NULL; 1320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (shareList) { 1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext; 1350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf shared = pcp_shared->driContext; 1360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp = Xmalloc(sizeof *pcp); 1390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp == NULL) 1400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->psc = psc; 1430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->driContext = 1440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->dri2->createNewContext) (psc->__driScreen, 1450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, shared, pcp); 1460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf gc->__driContext = pcp->driContext; 1470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp->driContext == NULL) { 1490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 1500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.destroyContext = dri2DestroyContext; 1540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.bindContext = dri2BindContext; 1550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.unbindContext = dri2UnbindContext; 1560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pcp->base; 158e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 159e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 1610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDrawable(__GLXDRIdrawable * pdraw) 162e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pdraw->psc->core; 164e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->destroyDrawable) (pdraw->driDrawable); 166029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2DestroyDrawable(pdraw->psc->dpy, pdraw->xDrawable); 1670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 168e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 169e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIdrawable * 1710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDrawable(__GLXscreenConfigs * psc, 1720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XID xDrawable, 1730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLXDrawable drawable, const __GLcontextModes * modes) 174e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *pdraw; 1760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes; 177e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw = Xmalloc(sizeof(*pdraw)); 1790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw) 1800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 181e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.destroyDrawable = dri2DestroyDrawable; 1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable = xDrawable; 1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.drawable = drawable; 1850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.psc = psc; 1860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = 0; 187e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2CreateDrawable(psc->dpy, xDrawable); 189e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Create a new drawable */ 1910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.driDrawable = 1920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->dri2->createNewDrawable) (psc->__driScreen, 1930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, pdraw); 194f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 1950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw->base.driDrawable) { 196029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2DestroyDrawable(psc->dpy, xDrawable); 1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 200e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdraw->base; 202f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg} 203f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 204daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 205daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2DrawableGetMSC(__GLXscreenConfigs *psc, __GLXDRIdrawable *pdraw, 206daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *ust, int64_t *msc, int64_t *sbc) 207daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 20862eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2GetMSC(psc->dpy, pdraw->xDrawable, ust, msc, sbc); 209daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 210daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 211daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 212daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 213daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) 214daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 21562eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2WaitMSC(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 216daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, ust, msc, sbc); 217daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 218daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 219daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 220daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, 221daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *msc, int64_t *sbc) 222daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 22362eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2WaitSBC(pdraw->psc->dpy, pdraw->xDrawable, target_sbc, ust, msc, 224daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes sbc); 225daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 226daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 2270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 228daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, int width, int height) 2294830809524b20e517e949151957512b14d7e679aKristian Høgsberg{ 2300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 2310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 2320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 2334830809524b20e517e949151957512b14d7e679aKristian Høgsberg 2340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 2350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_back) 2360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 23763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = x; 2390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = priv->height - y - height; 2400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = width; 2410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = height; 2424830809524b20e517e949151957512b14d7e679aKristian Høgsberg 24365562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 2440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->psc->f) 2450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*pdraw->psc->f->flush) (pdraw->driDrawable); 24665562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 24765562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 2480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1); 2490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* should get a fence ID back from here at some point */ 250029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2CopyRegion(pdraw->psc->dpy, pdraw->xDrawable, region, 2510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferBackLeft); 2520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XFixesDestroyRegion(pdraw->psc->dpy, region); 2535ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 2540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Refresh the fake front (if present) after we just damaged the real 2550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * front. 2560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 2570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2WaitX(pdraw); 2584830809524b20e517e949151957512b14d7e679aKristian Høgsberg} 2594830809524b20e517e949151957512b14d7e679aKristian Høgsberg 2600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 261a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnesdri2WaitX(__GLXDRIdrawable *pdraw) 26263b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 2630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 2640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 2650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 26663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 2680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_fake_front) 2690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 27063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 2720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 2730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 2740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 27563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 27665562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 2770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->psc->f) 2780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*pdraw->psc->f->flush) (pdraw->driDrawable); 27965562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 28065562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 2810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1); 282029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2CopyRegion(pdraw->psc->dpy, pdraw->xDrawable, region, 2830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 2840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XFixesDestroyRegion(pdraw->psc->dpy, region); 28563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 28663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 2880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2WaitGL(__GLXDRIdrawable * pdraw) 28963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 2900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 2910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 2920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 29363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_fake_front) 2950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 29663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 2980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 2990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 3000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 30163b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 30265562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 3030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->psc->f) 3040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*pdraw->psc->f->flush) (pdraw->driDrawable); 30565562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 30665562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 3070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1); 308029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2CopyRegion(pdraw->psc->dpy, pdraw->xDrawable, region, 3090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 3100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XFixesDestroyRegion(pdraw->psc->dpy, region); 31163b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 31263b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 31382634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 3140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 3150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2FlushFrontBuffer(__DRIdrawable * driDrawable, void *loaderPrivate) 31682634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick{ 3170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (void) driDrawable; 3180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2WaitGL((__GLXDRIdrawable *) loaderPrivate); 31982634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick} 32082634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 32182634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 3220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 3230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyScreen(__GLXscreenConfigs * psc) 324e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 3250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Free the direct rendering per screen data */ 3260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->core->destroyScreen) (psc->__driScreen); 3270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf close(psc->fd); 3280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->__driScreen = NULL; 329e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 330e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 331dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick/** 332dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Process list of buffer received from the server 333dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * 334dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Processes the list of buffers received in a reply from the server to either 335dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat. 336dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick */ 337dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic void 3380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófprocess_buffers(__GLXDRIdrawablePrivate * pdraw, DRI2Buffer * buffers, 3390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned count) 340e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 3410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 3420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 3430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = count; 3440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 0; 3450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 0; 3460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 3470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* This assumes the DRI2 buffer attachment tokens matches the 3480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * __DRIbuffer tokens. */ 3490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; i < count; i++) { 3500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].attachment = buffers[i].attachment; 3510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].name = buffers[i].name; 3520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].pitch = buffers[i].pitch; 3530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].cpp = buffers[i].cpp; 3540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].flags = buffers[i].flags; 3550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) 3560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 1; 3570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) 3580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 1; 3590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 36077c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 361dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 362dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 363daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int64_t 364daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 365daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder) 366a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes{ 367a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 368a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes __GLXdisplayPrivate *dpyPriv = __glXInitialize(priv->base.psc->dpy); 369a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes __GLXDRIdisplayPrivate *pdp = 370a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes (__GLXDRIdisplayPrivate *)dpyPriv->dri2Display; 371daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t ret; 372a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 373a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#ifdef __DRI2_FLUSH 374a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes if (pdraw->psc->f) 375a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes (*pdraw->psc->f->flush)(pdraw->driDrawable); 376a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#endif 377a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 378a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes /* Old servers can't handle swapbuffers */ 379daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes if (!pdp->swapAvailable) { 380daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height); 381daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return 0; 382daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes } 383a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 38462eb28c810a192dab772402904c50eea43b8340eJesse Barnes DRI2SwapBuffers(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 385daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, &ret); 386a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 387a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#if __DRI2_FLUSH_VERSION >= 2 388a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes if (pdraw->psc->f) 389a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes (*pdraw->psc->f->flushInvalidate)(pdraw->driDrawable); 390a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#endif 391daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 392daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return ret; 393a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes} 394a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 395dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 3960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffers(__DRIdrawable * driDrawable, 3970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 3980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 3990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 400dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 4010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *pdraw = loaderPrivate; 4020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 403dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable, 4050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, count, out_count); 4060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 4070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 408dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 4100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 4110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 412dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 414dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 416dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 417dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 418dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 4190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffersWithFormat(__DRIdrawable * driDrawable, 4200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 4210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 4220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 423dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 4240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *pdraw = loaderPrivate; 4250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 426dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy, 4280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable, 4290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, 4300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf count, out_count); 4310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 4320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 433dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 4350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 4360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 437dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 43977c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 4400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 441e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 442e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 443efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesstatic void 444efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) 445efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 446efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 447efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 448efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes DRI2SwapInterval(priv->base.psc->dpy, pdraw->xDrawable, interval); 449efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes priv->swap_interval = interval; 450efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 451efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 452efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesstatic unsigned int 453efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2GetSwapInterval(__GLXDRIdrawable *pdraw) 454efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 455efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 456efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 457efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes return priv->swap_interval; 458efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 459efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 460f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergstatic const __DRIdri2LoaderExtension dri2LoaderExtension = { 4610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 4620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 4630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 4640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffersWithFormat, 465dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 466dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 467dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIdri2LoaderExtension dri2LoaderExtension_old = { 4680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 4690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 4700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 4710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL, 472e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 473e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 474e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *loader_extensions[] = { 4750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &dri2LoaderExtension.base, 4760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &systemTimeExtension.base, 4770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL 478e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 479e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 480dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIextension *loader_extensions_old[] = { 4810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &dri2LoaderExtension_old.base, 4820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &systemTimeExtension.base, 4830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL 484dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 485dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIscreen * 4870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateScreen(__GLXscreenConfigs * psc, int screen, 4880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXdisplayPrivate * priv) 489e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 4900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIconfig **driver_configs; 4910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIextension **extensions; 4920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __GLXDRIdisplayPrivate *const pdp = (__GLXDRIdisplayPrivate *) 493dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick priv->dri2Display; 4940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIscreen *psp; 4950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf char *driverName, *deviceName; 4960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drm_magic_t magic; 4970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 4980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 4990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp = Xmalloc(sizeof *psp); 5000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psp == NULL) 5010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 5020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Initialize per screen dynamic client GLX extensions */ 5040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->ext_list_first_time = GL_TRUE; 5050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2Connect(psc->dpy, RootWindow(psc->dpy, screen), 50781cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes &driverName, &deviceName)) { 50881cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes XFree(psp); 5090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 51081cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes } 5110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver = driOpenDriver(driverName); 5130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->driver == NULL) { 5140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver pointer missing\n"); 5150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 5160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); 5190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (extensions == NULL) { 5200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); 5210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 5220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; extensions[i]; i++) { 5250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_CORE) == 0) 526daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->core = (__DRIcoreExtension *) extensions[i]; 5270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_DRI2) == 0) 528daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->dri2 = (__DRIdri2Extension *) extensions[i]; 5290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->core == NULL || psc->dri2 == NULL) { 5320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("core dri or dri2 extension not found\n"); 5330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 5340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->fd = open(deviceName, O_RDWR); 5370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->fd < 0) { 5380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to open drm device: %s\n", strerror(errno)); 53981cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 5400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (drmGetMagic(psc->fd, &magic)) { 5430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to get magic\n"); 54481cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 5450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2Authenticate(psc->dpy, RootWindow(psc->dpy, screen), magic)) { 5480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to authenticate magic %d\n", magic); 54981cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 5500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* If the server does not support the protocol for 5530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * DRI2GetBuffersWithFormat, don't supply that interface to the driver. 5540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 5550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->__driScreen = 5560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->dri2->createNewScreen(screen, psc->fd, ((pdp->driMinor < 1) 557daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes ? loader_extensions_old 558daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes : loader_extensions), 559daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes &driver_configs, psc); 5600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->__driScreen == NULL) { 5620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to create dri screen\n"); 56381cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 5640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 566daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes driBindCommonExtensions(psc); 567daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes dri2BindExtensions(psc); 5680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs); 5700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs); 5710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver_configs = driver_configs; 5730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->destroyScreen = dri2DestroyScreen; 5750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createContext = dri2CreateContext; 5760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createDrawable = dri2CreateDrawable; 5770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->swapBuffers = dri2SwapBuffers; 5780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->waitGL = dri2WaitGL; 5790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->waitX = dri2WaitX; 5801cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes if (pdp->driMinor >= 2) { 5811cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getDrawableMSC = dri2DrawableGetMSC; 5821cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForMSC = dri2WaitForMSC; 5831cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForSBC = dri2WaitForSBC; 5841cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->setSwapInterval = dri2SetSwapInterval; 5851cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getSwapInterval = dri2GetSwapInterval; 5861cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes } else { 5871cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getDrawableMSC = NULL; 5881cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForMSC = NULL; 5891cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForSBC = NULL; 5901cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->setSwapInterval = NULL; 5911cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getSwapInterval = NULL; 5921cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes } 5930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always 5950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * available.*/ 5960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->copySubBuffer = dri2CopySubBuffer; 5970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer"); 5980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 6000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 6010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return psp; 603e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 604daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barneshandle_error: 6050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 6060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 60781cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes XFree(psp); 608e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* FIXME: clean up here */ 610e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 612e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 613e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 614e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* Called from __glXFreeDisplayPrivate. 615e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 6160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 6170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDisplay(__GLXDRIdisplay * dpy) 618e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 6190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(dpy); 620e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 621e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 622e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* 623e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Allocate, initialize and return a __DRIdisplayPrivate object. 624e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * This is called from __glXInitialize() when we are given a new 625e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * display pointer. 626e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 6270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay * 6280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDisplay(Display * dpy) 629e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 6300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdisplayPrivate *pdp; 6310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int eventBase, errorBase; 632e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) 6340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 635e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp = Xmalloc(sizeof *pdp); 6370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdp == NULL) 6380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 639e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) { 6410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdp); 6420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 6430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 644e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->driPatch = 0; 646a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes pdp->swapAvailable = 0; 647a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes if (pdp->driMinor >= 2) 648a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes pdp->swapAvailable = 1; 649e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.destroyDisplay = dri2DestroyDisplay; 6510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.createScreen = dri2CreateScreen; 652e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdp->base; 654e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 655e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 656e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif /* GLX_DIRECT_RENDERING */ 657