dri2_glx.c revision a296d96de45d38a6ed0b3c817334d443facc169b
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 3380b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 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" 408b0b5ace4871847f7d8608e0ce6f67b7c5731ea7Francisco Jerez#include <X11/extensions/dri2proto.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" 5045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 5145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes/* From xmlpool/options.h, user exposed so should be stable */ 5245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#define DRI_CONF_VBLANK_NEVER 0 5345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 5445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 5545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 56e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 57dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick#undef DRI2_MINOR 58dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick#define DRI2_MINOR 1 59dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 60a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_display 610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdisplay base; 63e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* 65e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg ** XFree86-DRI version information 66e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driMajor; 680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driMinor; 690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driPatch; 70a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes int swapAvailable; 7161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez int invalidateAvailable; 724258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 733750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __glxHashTable *dri2Hash; 743750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 754258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg const __DRIextension *loader_extensions[4]; 76e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 77e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 78a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_context 790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontext base; 810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *driContext; 820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXscreenConfigs *psc; 83e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 84e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 85a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_drawable 860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable base; 880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIbuffer buffers[5]; 890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int bufferCount; 900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int width, height; 910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_back; 920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_fake_front; 93efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes int swap_interval; 94f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}; 95f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyContext(__GLXDRIcontext * context, 980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXscreenConfigs * psc, Display * dpy) 99e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 100a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 1010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 102e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->destroyContext) (pcp->driContext); 104e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 106e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 107e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool 1090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2BindContext(__GLXDRIcontext * context, 1100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable * draw, __GLXDRIdrawable * read) 111e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 112a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 1130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 114e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return (*core->bindContext) (pcp->driContext, 1160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf draw->driDrawable, read->driDrawable); 117e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 118e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 1200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2UnbindContext(__GLXDRIcontext * context) 121e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 122a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 1230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 124e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->unbindContext) (pcp->driContext); 126e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 127e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIcontext * 1290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateContext(__GLXscreenConfigs * psc, 1300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __GLcontextModes * mode, 1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLXContext gc, GLXContext shareList, int renderType) 132e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 133a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp, *pcp_shared; 1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode; 1350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *shared = NULL; 1360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (shareList) { 138a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pcp_shared = (struct dri2_context *) shareList->driContext; 1390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf shared = pcp_shared->driContext; 1400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp = Xmalloc(sizeof *pcp); 1430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp == NULL) 1440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->psc = psc; 1470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->driContext = 1480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->dri2->createNewContext) (psc->__driScreen, 1490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, shared, pcp); 1500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf gc->__driContext = pcp->driContext; 1510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp->driContext == NULL) { 1530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 1540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.destroyContext = dri2DestroyContext; 1580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.bindContext = dri2BindContext; 1590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.unbindContext = dri2UnbindContext; 1600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pcp->base; 162e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 163e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 1653750ebd540510324ef5ada769537ae05309adadbKristian Høgsbergdri2DestroyDrawable(__GLXDRIdrawable *pdraw) 166e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pdraw->psc->core; 1683750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXdisplayPrivate *dpyPriv; 169a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 170e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1713750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg dpyPriv = __glXInitialize(pdraw->psc->dpy); 172a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pdp = (struct dri2_display *)dpyPriv->dri2Display; 1733750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 1743750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __glxHashDelete(pdp->dri2Hash, pdraw->xDrawable); 1750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->destroyDrawable) (pdraw->driDrawable); 176029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2DestroyDrawable(pdraw->psc->dpy, pdraw->xDrawable); 1770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 178e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 179e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIdrawable * 1810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDrawable(__GLXscreenConfigs * psc, 1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XID xDrawable, 1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLXDrawable drawable, const __GLcontextModes * modes) 184e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 185a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw; 1860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes; 1870a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes __GLXdisplayPrivate *dpyPriv; 188a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 18945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 190e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw = Xmalloc(sizeof(*pdraw)); 1920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw) 1930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 194e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.destroyDrawable = dri2DestroyDrawable; 1960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable = xDrawable; 1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.drawable = drawable; 1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.psc = psc; 1990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = 0; 20045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; /* default may be overridden below */ 201d20fce057ee94fc3441c01a9e54cb5e19f7ddfd3Pierre Willenbrock pdraw->have_back = 0; 20245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 20345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (psc->config) 20445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes psc->config->configQueryi(psc->__driScreen, "vblank_mode", &vblank_mode); 20545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 20645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 20745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 20845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_0: 20945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 0; 21045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 21145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_1: 21245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 21345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 21445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; 21545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 21645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 217e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2CreateDrawable(psc->dpy, xDrawable); 219e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2200a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes dpyPriv = __glXInitialize(psc->dpy); 221a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pdp = (struct dri2_display *)dpyPriv->dri2Display;; 2220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Create a new drawable */ 2230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.driDrawable = 2240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->dri2->createNewDrawable) (psc->__driScreen, 2250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, pdraw); 226f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 2270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw->base.driDrawable) { 228029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2DestroyDrawable(psc->dpy, xDrawable); 2290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 2300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 2310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 232e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2333750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashInsert(pdp->dri2Hash, xDrawable, pdraw)) { 2343750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg (*psc->core->destroyDrawable) (pdraw->base.driDrawable); 2353750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg DRI2DestroyDrawable(psc->dpy, xDrawable); 2363750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdraw); 2373750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return None; 2383750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 2393750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 2403750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 241c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#ifdef X_DRI2SwapInterval 242385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes /* 243385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * Make sure server has the same swap interval we do for the new 244385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * drawable. 245385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes */ 2460a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes if (pdp->swapAvailable) 2470a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes DRI2SwapInterval(psc->dpy, xDrawable, pdraw->swap_interval); 248c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#endif 2490a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes 2500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdraw->base; 251f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg} 252f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 25307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2GetMSC 25407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 255daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 256daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2DrawableGetMSC(__GLXscreenConfigs *psc, __GLXDRIdrawable *pdraw, 257daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *ust, int64_t *msc, int64_t *sbc) 258daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 25962eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2GetMSC(psc->dpy, pdraw->xDrawable, ust, msc, sbc); 260daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 261daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 26207c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif 26307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 26407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 26507c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2WaitMSC 26607c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 267daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 268daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 269daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) 270daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 27162eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2WaitMSC(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 272daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, ust, msc, sbc); 273daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 274daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 275daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 276daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, 277daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *msc, int64_t *sbc) 278daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 27962eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2WaitSBC(pdraw->psc->dpy, pdraw->xDrawable, target_sbc, ust, msc, 280daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes sbc); 281daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 282daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 28307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2WaitMSC */ 28407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 2850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 286daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, int width, int height) 2874830809524b20e517e949151957512b14d7e679aKristian Høgsberg{ 288a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 2890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 2900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 2914830809524b20e517e949151957512b14d7e679aKristian Høgsberg 2920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 2930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_back) 2940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 29563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = x; 2970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = priv->height - y - height; 2980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = width; 2990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = height; 3004830809524b20e517e949151957512b14d7e679aKristian Høgsberg 30165562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 3020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->psc->f) 3030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*pdraw->psc->f->flush) (pdraw->driDrawable); 30465562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 30565562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 3060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1); 307029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2CopyRegion(pdraw->psc->dpy, pdraw->xDrawable, region, 3080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferBackLeft); 3090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XFixesDestroyRegion(pdraw->psc->dpy, region); 3105ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 3110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Refresh the fake front (if present) after we just damaged the real 3120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * front. 3130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 314b006d465ea0ea680326f702ad248544c576301a2Kristian Høgsberg DRI2CopyRegion(pdraw->psc->dpy, pdraw->xDrawable, region, 315b006d465ea0ea680326f702ad248544c576301a2Kristian Høgsberg DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 316b006d465ea0ea680326f702ad248544c576301a2Kristian Høgsberg XFixesDestroyRegion(pdraw->psc->dpy, region); 3174830809524b20e517e949151957512b14d7e679aKristian Høgsberg} 3184830809524b20e517e949151957512b14d7e679aKristian Høgsberg 3190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 320a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergdri2_copy_drawable(struct dri2_drawable *priv, int dest, int src) 32163b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 3220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 3230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 324308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg __GLXscreenConfigs *const psc = priv->base.psc; 32563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 3270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 3280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 3290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 33063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 33165562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 332308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg if (psc->f) 333308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg (*psc->f->flush) (priv->base.driDrawable); 33465562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 33565562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 336308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg region = XFixesCreateRegion(psc->dpy, &xrect, 1); 337308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg DRI2CopyRegion(psc->dpy, priv->base.xDrawable, region, dest, src); 338308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg XFixesDestroyRegion(psc->dpy, region); 339308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 34063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 34163b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 343308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergdri2WaitX(__GLXDRIdrawable *pdraw) 34463b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 345a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 34663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_fake_front) 3480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 34963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 350308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 351308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg} 35263b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 353308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergstatic void 354308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergdri2WaitGL(__GLXDRIdrawable * pdraw) 355308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg{ 356a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 35765562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 358308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg if (!priv->have_fake_front) 359308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg return; 360308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 361308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 36263b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 36363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 36561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) 36682634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick{ 367a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 3684cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg __GLXdisplayPrivate *priv = __glXInitialize(pdraw->base.psc->dpy); 369a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = (struct dri2_display *)priv->dri2Display; 3704cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 3714cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 3724cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 3734cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg dri2InvalidateBuffers(priv->dpy, pdraw->base.drawable); 3744cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 37561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez dri2WaitGL(loaderPrivate); 37682634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick} 37782634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 37882634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 3790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 3800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyScreen(__GLXscreenConfigs * psc) 381e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 3820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Free the direct rendering per screen data */ 3830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->core->destroyScreen) (psc->__driScreen); 3840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf close(psc->fd); 3850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->__driScreen = NULL; 386e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 387e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 388dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick/** 389dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Process list of buffer received from the server 390dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * 391dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Processes the list of buffers received in a reply from the server to either 392dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat. 393dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick */ 394dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic void 395a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergprocess_buffers(struct dri2_drawable * pdraw, DRI2Buffer * buffers, 3960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned count) 397e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 3980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 3990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 4000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = count; 4010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 0; 4020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 0; 4030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 4040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* This assumes the DRI2 buffer attachment tokens matches the 4050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * __DRIbuffer tokens. */ 4060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; i < count; i++) { 4070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].attachment = buffers[i].attachment; 4080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].name = buffers[i].name; 4090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].pitch = buffers[i].pitch; 4100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].cpp = buffers[i].cpp; 4110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].flags = buffers[i].flags; 4120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) 4130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 1; 4140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) 4150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 1; 4160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 41777c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 418dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 419dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 420daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int64_t 421daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 422daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder) 423a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes{ 424a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 425a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes __GLXdisplayPrivate *dpyPriv = __glXInitialize(priv->base.psc->dpy); 426a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = 427a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg (struct dri2_display *)dpyPriv->dri2Display; 428daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t ret; 429a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 430a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#ifdef __DRI2_FLUSH 431a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes if (pdraw->psc->f) 432a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes (*pdraw->psc->f->flush)(pdraw->driDrawable); 433a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#endif 434a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 4354cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 4364cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 4374cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg dri2InvalidateBuffers(dpyPriv->dpy, pdraw->drawable); 4384cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 439a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes /* Old servers can't handle swapbuffers */ 440daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes if (!pdp->swapAvailable) { 441daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height); 442daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return 0; 443daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes } 444a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 44501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapBuffers 44662eb28c810a192dab772402904c50eea43b8340eJesse Barnes DRI2SwapBuffers(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 447daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, &ret); 44801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 449a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 450daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return ret; 451a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes} 452a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 453dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 4540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffers(__DRIdrawable * driDrawable, 4550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 4560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 4570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 458dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 459a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 4600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 461dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable, 4630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, count, out_count); 4640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 4650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 466dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 4680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 4690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 470dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 472dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 474dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 475dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 476dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 4770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffersWithFormat(__DRIdrawable * driDrawable, 4780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 4790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 4800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 481dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 482a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 4830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 484dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy, 4860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable, 4870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, 4880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf count, out_count); 4890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 4900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 491dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 4930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 4940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 495dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 49777c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 4980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 499e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 500e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 50107c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2SwapInterval 50207c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 503efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesstatic void 504efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) 505efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 50645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes __GLXscreenConfigs *psc = pdraw->psc; 507a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 50845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 50945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 51045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (psc->config) 51145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes psc->config->configQueryi(psc->__driScreen, "vblank_mode", &vblank_mode); 51245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 51345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 51445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 51545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes return; 51645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 51745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (interval <= 0) 51845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes return; 51945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 52045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 52145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 52245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 523efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 524efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes DRI2SwapInterval(priv->base.psc->dpy, pdraw->xDrawable, interval); 525efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes priv->swap_interval = interval; 526efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 527efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 528efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesstatic unsigned int 529efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2GetSwapInterval(__GLXDRIdrawable *pdraw) 530efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 531a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 532efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 533efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes return priv->swap_interval; 534efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 535efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 53607c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2SwapInterval */ 53707c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 538f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergstatic const __DRIdri2LoaderExtension dri2LoaderExtension = { 5390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 5400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 5410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 5420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffersWithFormat, 543dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 544dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 545dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIdri2LoaderExtension dri2LoaderExtension_old = { 5460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 5480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 5490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL, 550e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 551e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 5524258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 5534258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsbergstatic const __DRIuseInvalidateExtension dri2UseInvalidate = { 5544258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION } 555dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 5564258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 557dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 55861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez_X_HIDDEN void 55961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateBuffers(Display *dpy, XID drawable) 56061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{ 5613750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw = 5623750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg dri2GetGlxDrawableFromXDrawableId(dpy, drawable); 56361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 56461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#if __DRI2_FLUSH_VERSION >= 3 56561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez if (pdraw && pdraw->psc->f) 56661d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdraw->psc->f->invalidate(pdraw->driDrawable); 56761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#endif 56861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez} 56961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 570643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 571643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_bind_tex_image(Display * dpy, 572643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg GLXDrawable drawable, 573643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg int buffer, const int *attrib_list) 574643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 575643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg GLXContext gc = __glXGetCurrentContext(); 576643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL); 577ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg __GLXdisplayPrivate *dpyPriv = __glXInitialize(dpy); 578a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = 579a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg (struct dri2_display *) dpyPriv->dri2Display; 580643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 581643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg if (pdraw != NULL) { 582ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 583ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#if __DRI2_FLUSH_VERSION >= 3 584ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg if (!pdp->invalidateAvailable && pdraw->psc->f) 585ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg pdraw->psc->f->invalidate(pdraw->driDrawable); 586ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#endif 587ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 588643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg if (pdraw->psc->texBuffer->base.version >= 2 && 589643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg pdraw->psc->texBuffer->setTexBuffer2 != NULL) { 590643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg (*pdraw->psc->texBuffer->setTexBuffer2) (gc->__driContext, 591643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg pdraw->textureTarget, 592643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg pdraw->textureFormat, 593643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg pdraw->driDrawable); 594643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 595643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg else { 596643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg (*pdraw->psc->texBuffer->setTexBuffer) (gc->__driContext, 597643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg pdraw->textureTarget, 598643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg pdraw->driDrawable); 599643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 600643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 601643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 602643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 603643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 604643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) 605643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 606643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 607643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 608643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic const struct glx_context_vtable dri2_context_vtable = { 609643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_bind_tex_image, 610643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_release_tex_image, 611643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}; 612643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 6130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIscreen * 6140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateScreen(__GLXscreenConfigs * psc, int screen, 6150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXdisplayPrivate * priv) 616e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 6170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIconfig **driver_configs; 6180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIextension **extensions; 619a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg const struct dri2_display *const pdp = (struct dri2_display *) 620dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick priv->dri2Display; 6210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIscreen *psp; 6220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf char *driverName, *deviceName; 6230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drm_magic_t magic; 6240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 6250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp = Xmalloc(sizeof *psp); 6270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psp == NULL) 6280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 6290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2Connect(psc->dpy, RootWindow(psc->dpy, screen), 63181cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes &driverName, &deviceName)) { 63281cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes XFree(psp); 6330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 63481cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes } 6350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver = driOpenDriver(driverName); 6370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->driver == NULL) { 6380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver pointer missing\n"); 6390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 6400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); 6430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (extensions == NULL) { 6440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); 6450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 6460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; extensions[i]; i++) { 6490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_CORE) == 0) 650daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->core = (__DRIcoreExtension *) extensions[i]; 6510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_DRI2) == 0) 652daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->dri2 = (__DRIdri2Extension *) extensions[i]; 6530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->core == NULL || psc->dri2 == NULL) { 6560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("core dri or dri2 extension not found\n"); 6570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 6580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->fd = open(deviceName, O_RDWR); 6610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->fd < 0) { 6620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to open drm device: %s\n", strerror(errno)); 66381cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 6640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (drmGetMagic(psc->fd, &magic)) { 6670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to get magic\n"); 66881cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 6690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2Authenticate(psc->dpy, RootWindow(psc->dpy, screen), magic)) { 6720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to authenticate magic %d\n", magic); 67381cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 6740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6764258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 6770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* If the server does not support the protocol for 6780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * DRI2GetBuffersWithFormat, don't supply that interface to the driver. 6790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 6800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->__driScreen = 6814258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg psc->dri2->createNewScreen(screen, psc->fd, 6824258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg (const __DRIextension **) 6834258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg &pdp->loader_extensions[0], 684daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes &driver_configs, psc); 6850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->__driScreen == NULL) { 6870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to create dri screen\n"); 68881cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 6890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 691daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes driBindCommonExtensions(psc); 692daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes dri2BindExtensions(psc); 6930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs); 6950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs); 6960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver_configs = driver_configs; 6980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->destroyScreen = dri2DestroyScreen; 7000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createContext = dri2CreateContext; 7010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createDrawable = dri2CreateDrawable; 7020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->swapBuffers = dri2SwapBuffers; 7030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->waitGL = dri2WaitGL; 7040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->waitX = dri2WaitX; 70501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getDrawableMSC = NULL; 70601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForMSC = NULL; 70701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForSBC = NULL; 70801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->setSwapInterval = NULL; 70901923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getSwapInterval = NULL; 71001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell 7111cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes if (pdp->driMinor >= 2) { 71201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2GetMSC 7131cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getDrawableMSC = dri2DrawableGetMSC; 71401923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 71501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2WaitMSC 7161cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForMSC = dri2WaitForMSC; 7171cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForSBC = dri2WaitForSBC; 71801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 71901923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapInterval 7201cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->setSwapInterval = dri2SetSwapInterval; 7211cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getSwapInterval = dri2GetSwapInterval; 72201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 7231ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#if defined(X_DRI2GetMSC) && defined(X_DRI2WaitMSC) && defined(X_DRI2SwapInterval) 7241ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes __glXEnableDirectExtension(psc, "GLX_OML_sync_control"); 7251ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#endif 7261cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes } 7270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always 7290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * available.*/ 7300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->copySubBuffer = dri2CopySubBuffer; 7310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer"); 7320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 733643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg psc->direct_context_vtable = &dri2_context_vtable; 734643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 7350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 7360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 7370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return psp; 739e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 740daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barneshandle_error: 7410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 7420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 74381cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes XFree(psp); 744e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* FIXME: clean up here */ 746e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 748e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 749e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 750e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* Called from __glXFreeDisplayPrivate. 751e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 7520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 7530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDisplay(__GLXDRIdisplay * dpy) 754e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 7550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(dpy); 756e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 757e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7583750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg_X_HIDDEN __GLXDRIdrawable * 7593750ebd540510324ef5ada769537ae05309adadbKristian Høgsbergdri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id) 7603750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg{ 7613750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXdisplayPrivate *d = __glXInitialize(dpy); 762a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = (struct dri2_display *) d->dri2Display; 7633750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw; 7643750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 7653750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashLookup(pdp->dri2Hash, id, (void *) &pdraw) == 0) 7663750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return pdraw; 7673750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 7683750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 7693750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg} 7703750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 771e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* 772e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Allocate, initialize and return a __DRIdisplayPrivate object. 773e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * This is called from __glXInitialize() when we are given a new 774e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * display pointer. 775e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 7760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay * 7770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDisplay(Display * dpy) 778e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 779a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 7804258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg int eventBase, errorBase, i; 781e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) 7830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 784e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp = Xmalloc(sizeof *pdp); 7860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdp == NULL) 7870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 788e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) { 7900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdp); 7910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 7920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 793e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->driPatch = 0; 79561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->swapAvailable = (pdp->driMinor >= 2); 79661d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->invalidateAvailable = (pdp->driMinor >= 3); 797e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.destroyDisplay = dri2DestroyDisplay; 7990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.createScreen = dri2CreateScreen; 800e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8014258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg i = 0; 8024258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg if (pdp->driMinor < 1) 8034258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base; 8044258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg else 8054258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension.base; 8064258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 8074258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &systemTimeExtension.base; 8084258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 8094258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 8104cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg pdp->loader_extensions[i++] = &dri2UseInvalidate.base; 8114258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 812c8f407bcec7619eb2030ea9fe52501ad33075699Kristian Høgsberg pdp->loader_extensions[i++] = NULL; 8134258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 8143750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg pdp->dri2Hash = __glxHashCreate(); 8153750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (pdp->dri2Hash == NULL) { 8163750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdp); 8173750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 8183750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 8193750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 8200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdp->base; 821e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 822e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 823e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif /* GLX_DIRECT_RENDERING */ 824