dri2_glx.c revision c37e275e778e8c944e3dfad159b1eb94c601af60
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 33115203281cf791221f586f03c14cfe4e0a44dd7aJeremy Huddleston#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" 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" 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; 7061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez int invalidateAvailable; 71e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 72e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstruct __GLXDRIcontextPrivateRec 740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontext base; 760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *driContext; 770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXscreenConfigs *psc; 78e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 79e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstruct __GLXDRIdrawablePrivateRec 810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable base; 830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIbuffer buffers[5]; 840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int bufferCount; 850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int width, height; 860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_back; 870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_fake_front; 88efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes int swap_interval; 89f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}; 90f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void dri2WaitX(__GLXDRIdrawable * pdraw); 925ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyContext(__GLXDRIcontext * context, 950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXscreenConfigs * psc, Display * dpy) 96e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; 980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 99e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->destroyContext) (pcp->driContext); 101e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 103e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 104e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool 1060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2BindContext(__GLXDRIcontext * context, 1070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable * draw, __GLXDRIdrawable * read) 108e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; 1100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 111e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return (*core->bindContext) (pcp->driContext, 1130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf draw->driDrawable, read->driDrawable); 114e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 115e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 1170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2UnbindContext(__GLXDRIcontext * context) 118e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; 1200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pcp->psc->core; 121e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->unbindContext) (pcp->driContext); 123e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 124e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIcontext * 1260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateContext(__GLXscreenConfigs * psc, 1270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __GLcontextModes * mode, 1280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLXContext gc, GLXContext shareList, int renderType) 129e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontextPrivate *pcp, *pcp_shared; 1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode; 1320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *shared = NULL; 1330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (shareList) { 1350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext; 1360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf shared = pcp_shared->driContext; 1370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp = Xmalloc(sizeof *pcp); 1400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp == NULL) 1410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->psc = psc; 1440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->driContext = 1450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->dri2->createNewContext) (psc->__driScreen, 1460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, shared, pcp); 1470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf gc->__driContext = pcp->driContext; 1480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp->driContext == NULL) { 1500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 1510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.destroyContext = dri2DestroyContext; 1550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.bindContext = dri2BindContext; 1560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.unbindContext = dri2UnbindContext; 1570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pcp->base; 159e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 160e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 1620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDrawable(__GLXDRIdrawable * pdraw) 163e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIcoreExtension *core = pdraw->psc->core; 165e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*core->destroyDrawable) (pdraw->driDrawable); 167029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2DestroyDrawable(pdraw->psc->dpy, pdraw->xDrawable); 1680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 169e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 170e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIdrawable * 1720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDrawable(__GLXscreenConfigs * psc, 1730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XID xDrawable, 1740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLXDrawable drawable, const __GLcontextModes * modes) 175e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *pdraw; 1770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes; 1780a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes __GLXdisplayPrivate *dpyPriv; 1790a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes __GLXDRIdisplayPrivate *pdp; 180e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw = Xmalloc(sizeof(*pdraw)); 1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw) 1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 184e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.destroyDrawable = dri2DestroyDrawable; 1860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable = xDrawable; 1870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.drawable = drawable; 1880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.psc = psc; 1890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = 0; 190385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes pdraw->swap_interval = 1; 191e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2CreateDrawable(psc->dpy, xDrawable); 193e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1940a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes dpyPriv = __glXInitialize(psc->dpy); 1950a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes pdp = (__GLXDRIdisplayPrivate *)dpyPriv->dri2Display;; 1960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Create a new drawable */ 1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.driDrawable = 1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->dri2->createNewDrawable) (psc->__driScreen, 1990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, pdraw); 200f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 2010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw->base.driDrawable) { 202029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2DestroyDrawable(psc->dpy, xDrawable); 2030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 2040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 2050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 206e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 207c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#ifdef X_DRI2SwapInterval 208385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes /* 209385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * Make sure server has the same swap interval we do for the new 210385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * drawable. 211385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes */ 2120a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes if (pdp->swapAvailable) 2130a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes DRI2SwapInterval(psc->dpy, xDrawable, pdraw->swap_interval); 214c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#endif 2150a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes 2160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdraw->base; 217f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg} 218f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 21907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2GetMSC 22007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 221daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 222daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2DrawableGetMSC(__GLXscreenConfigs *psc, __GLXDRIdrawable *pdraw, 223daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *ust, int64_t *msc, int64_t *sbc) 224daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 22562eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2GetMSC(psc->dpy, pdraw->xDrawable, ust, msc, sbc); 226daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 227daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 22807c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif 22907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 23007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 23107c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2WaitMSC 23207c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 233daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 234daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 235daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) 236daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 23762eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2WaitMSC(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 238daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, ust, msc, sbc); 239daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 240daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 241daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 242daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, 243daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *msc, int64_t *sbc) 244daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 24562eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2WaitSBC(pdraw->psc->dpy, pdraw->xDrawable, target_sbc, ust, msc, 246daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes sbc); 247daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 248daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 24907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2WaitMSC */ 25007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 2510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 252daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, int width, int height) 2534830809524b20e517e949151957512b14d7e679aKristian Høgsberg{ 2540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 2550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 2560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 2574830809524b20e517e949151957512b14d7e679aKristian Høgsberg 2580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 2590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_back) 2600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 26163b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = x; 2630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = priv->height - y - height; 2640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = width; 2650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = height; 2664830809524b20e517e949151957512b14d7e679aKristian Høgsberg 26765562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 2680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->psc->f) 2690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*pdraw->psc->f->flush) (pdraw->driDrawable); 27065562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 27165562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 2720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1); 2730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* should get a fence ID back from here at some point */ 274029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2CopyRegion(pdraw->psc->dpy, pdraw->xDrawable, region, 2750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferBackLeft); 2760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XFixesDestroyRegion(pdraw->psc->dpy, region); 2775ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 2780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Refresh the fake front (if present) after we just damaged the real 2790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * front. 2800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 2810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2WaitX(pdraw); 2824830809524b20e517e949151957512b14d7e679aKristian Høgsberg} 2834830809524b20e517e949151957512b14d7e679aKristian Høgsberg 2840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 285a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnesdri2WaitX(__GLXDRIdrawable *pdraw) 28663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 2870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 2880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 2890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 29063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 2920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_fake_front) 2930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 29463b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 2950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 2960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 2970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 2980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 29963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 30065562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 3010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->psc->f) 3020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*pdraw->psc->f->flush) (pdraw->driDrawable); 30365562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 30465562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 3050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1); 306029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2CopyRegion(pdraw->psc->dpy, pdraw->xDrawable, region, 3070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 3080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XFixesDestroyRegion(pdraw->psc->dpy, region); 30963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 31063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 3120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2WaitGL(__GLXDRIdrawable * pdraw) 31363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 3140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 3150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 3160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 31763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_fake_front) 3190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 32063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 3220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 3230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 3240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 32563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 32665562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 3270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->psc->f) 3280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*pdraw->psc->f->flush) (pdraw->driDrawable); 32965562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 33065562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 3310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1); 332029e643b24f7deea51e90b9101323e7bcce43681Michel Dänzer DRI2CopyRegion(pdraw->psc->dpy, pdraw->xDrawable, region, 3330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 3340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XFixesDestroyRegion(pdraw->psc->dpy, region); 33563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 33663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 33861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) 33982634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick{ 34061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez __GLXDRIdrawablePrivate *pdraw = loaderPrivate; 34161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez __GLXdisplayPrivate *priv = __glXInitialize(pdraw->base.psc->dpy); 34261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez __GLXDRIdisplayPrivate *pdp = (__GLXDRIdisplayPrivate *)priv->dri2Display; 34361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 34461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez /* Old servers don't send invalidate events */ 34561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez if (!pdp->invalidateAvailable) 3462b4d8616f581a36ed98a491ac1ec14be69d37511Jesse Barnes dri2InvalidateBuffers(priv->dpy, pdraw->base.drawable); 34761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 34861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez dri2WaitGL(loaderPrivate); 34982634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick} 35082634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 35182634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 3520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 3530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyScreen(__GLXscreenConfigs * psc) 354e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 3550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Free the direct rendering per screen data */ 3560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (*psc->core->destroyScreen) (psc->__driScreen); 3570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf close(psc->fd); 3580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->__driScreen = NULL; 359e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 360e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 361dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick/** 362dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Process list of buffer received from the server 363dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * 364dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Processes the list of buffers received in a reply from the server to either 365dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat. 366dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick */ 367dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic void 3680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófprocess_buffers(__GLXDRIdrawablePrivate * pdraw, DRI2Buffer * buffers, 3690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned count) 370e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 3710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 3720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 3730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = count; 3740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 0; 3750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 0; 3760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 3770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* This assumes the DRI2 buffer attachment tokens matches the 3780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * __DRIbuffer tokens. */ 3790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; i < count; i++) { 3800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].attachment = buffers[i].attachment; 3810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].name = buffers[i].name; 3820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].pitch = buffers[i].pitch; 3830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].cpp = buffers[i].cpp; 3840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].flags = buffers[i].flags; 3850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) 3860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 1; 3870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) 3880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 1; 3890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 39077c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 391dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 392dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 393daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int64_t 394daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 395daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder) 396a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes{ 397a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 398a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes __GLXdisplayPrivate *dpyPriv = __glXInitialize(priv->base.psc->dpy); 399a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes __GLXDRIdisplayPrivate *pdp = 400a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes (__GLXDRIdisplayPrivate *)dpyPriv->dri2Display; 401daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t ret; 402a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 403a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#ifdef __DRI2_FLUSH 404a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes if (pdraw->psc->f) 405a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes (*pdraw->psc->f->flush)(pdraw->driDrawable); 406a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#endif 407a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 40861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez /* Old servers don't send invalidate events */ 40961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez if (!pdp->invalidateAvailable) 4102b4d8616f581a36ed98a491ac1ec14be69d37511Jesse Barnes dri2InvalidateBuffers(dpyPriv->dpy, pdraw->drawable); 41161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 412a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes /* Old servers can't handle swapbuffers */ 413daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes if (!pdp->swapAvailable) { 414daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height); 415daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return 0; 416daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes } 417a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 41801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapBuffers 41962eb28c810a192dab772402904c50eea43b8340eJesse Barnes DRI2SwapBuffers(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 420daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, &ret); 42101923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 422a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 423daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return ret; 424a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes} 425a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 426dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 4270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffers(__DRIdrawable * driDrawable, 4280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 4290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 4300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 431dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 4320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *pdraw = loaderPrivate; 4330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 434dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable, 4360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, count, out_count); 4370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 4380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 439dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 4410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 4420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 443dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 445dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 447dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 448dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 449dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 4500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffersWithFormat(__DRIdrawable * driDrawable, 4510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 4520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 4530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 454dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 4550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawablePrivate *pdraw = loaderPrivate; 4560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 457dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy, 4590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable, 4600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, 4610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf count, out_count); 4620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 4630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 464dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 4660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 4670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 468dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 47077c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 4710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 472e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 473e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 47407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2SwapInterval 47507c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 476efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesstatic void 477efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) 478efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 479efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 480efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 481efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes DRI2SwapInterval(priv->base.psc->dpy, pdraw->xDrawable, interval); 482efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes priv->swap_interval = interval; 483efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 484efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 485efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesstatic unsigned int 486efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2GetSwapInterval(__GLXDRIdrawable *pdraw) 487efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 488efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; 489efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 490efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes return priv->swap_interval; 491efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 492efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 49307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2SwapInterval */ 49407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 495f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergstatic const __DRIdri2LoaderExtension dri2LoaderExtension = { 4960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 4970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 4980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 4990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffersWithFormat, 500dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 501dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 502dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIdri2LoaderExtension dri2LoaderExtension_old = { 5030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 5040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 5050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 5060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL, 507e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 508e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 509e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *loader_extensions[] = { 5100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &dri2LoaderExtension.base, 5110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &systemTimeExtension.base, 5120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL 513e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 514e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 515dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIextension *loader_extensions_old[] = { 5160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &dri2LoaderExtension_old.base, 5170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &systemTimeExtension.base, 5180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL 519dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 520dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 52161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez_X_HIDDEN void 52261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateBuffers(Display *dpy, XID drawable) 52361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{ 52461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL); 52561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 52661d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#if __DRI2_FLUSH_VERSION >= 3 52761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez if (pdraw && pdraw->psc->f) 52861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdraw->psc->f->invalidate(pdraw->driDrawable); 52961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#endif 53061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez} 53161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 5320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIscreen * 5330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateScreen(__GLXscreenConfigs * psc, int screen, 5340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXdisplayPrivate * priv) 535e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 5360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIconfig **driver_configs; 5370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIextension **extensions; 5380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __GLXDRIdisplayPrivate *const pdp = (__GLXDRIdisplayPrivate *) 539dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick priv->dri2Display; 5400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIscreen *psp; 5410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf char *driverName, *deviceName; 5420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drm_magic_t magic; 5430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 5440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp = Xmalloc(sizeof *psp); 5460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psp == NULL) 5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 5480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2Connect(psc->dpy, RootWindow(psc->dpy, screen), 55081cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes &driverName, &deviceName)) { 55181cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes XFree(psp); 5520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 55381cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes } 5540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver = driOpenDriver(driverName); 5560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->driver == NULL) { 5570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver pointer missing\n"); 5580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 5590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); 5620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (extensions == NULL) { 5630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); 5640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 5650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; extensions[i]; i++) { 5680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_CORE) == 0) 569daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->core = (__DRIcoreExtension *) extensions[i]; 5700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_DRI2) == 0) 571daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->dri2 = (__DRIdri2Extension *) extensions[i]; 5720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->core == NULL || psc->dri2 == NULL) { 5750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("core dri or dri2 extension not found\n"); 5760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 5770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->fd = open(deviceName, O_RDWR); 5800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->fd < 0) { 5810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to open drm device: %s\n", strerror(errno)); 58281cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 5830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (drmGetMagic(psc->fd, &magic)) { 5860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to get magic\n"); 58781cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 5880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2Authenticate(psc->dpy, RootWindow(psc->dpy, screen), magic)) { 5910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to authenticate magic %d\n", magic); 59281cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 5930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 5940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* If the server does not support the protocol for 5960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * DRI2GetBuffersWithFormat, don't supply that interface to the driver. 5970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 5980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->__driScreen = 5990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->dri2->createNewScreen(screen, psc->fd, ((pdp->driMinor < 1) 600daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes ? loader_extensions_old 601daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes : loader_extensions), 602daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes &driver_configs, psc); 6030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->__driScreen == NULL) { 6050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to create dri screen\n"); 60681cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 6070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 609daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes driBindCommonExtensions(psc); 610daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes dri2BindExtensions(psc); 6110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs); 6130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs); 6140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver_configs = driver_configs; 6160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->destroyScreen = dri2DestroyScreen; 6180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createContext = dri2CreateContext; 6190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createDrawable = dri2CreateDrawable; 6200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->swapBuffers = dri2SwapBuffers; 6210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->waitGL = dri2WaitGL; 6220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->waitX = dri2WaitX; 62301923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getDrawableMSC = NULL; 62401923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForMSC = NULL; 62501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForSBC = NULL; 62601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->setSwapInterval = NULL; 62701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getSwapInterval = NULL; 62801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell 6291cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes if (pdp->driMinor >= 2) { 63001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2GetMSC 6311cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getDrawableMSC = dri2DrawableGetMSC; 63201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 63301923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2WaitMSC 6341cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForMSC = dri2WaitForMSC; 6351cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForSBC = dri2WaitForSBC; 63601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 63701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapInterval 6381cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->setSwapInterval = dri2SetSwapInterval; 6391cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getSwapInterval = dri2GetSwapInterval; 64001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 6411ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#if defined(X_DRI2GetMSC) && defined(X_DRI2WaitMSC) && defined(X_DRI2SwapInterval) 6421ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes __glXEnableDirectExtension(psc, "GLX_OML_sync_control"); 6431ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#endif 6441cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes } 6450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always 6470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * available.*/ 6480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->copySubBuffer = dri2CopySubBuffer; 6490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer"); 6500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 6520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 6530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return psp; 655e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 656daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barneshandle_error: 6570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 6580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 65981cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes XFree(psp); 660e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* FIXME: clean up here */ 662e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 664e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 665e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 666e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* Called from __glXFreeDisplayPrivate. 667e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 6680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 6690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDisplay(__GLXDRIdisplay * dpy) 670e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 6710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(dpy); 672e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 673e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 674e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* 675e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Allocate, initialize and return a __DRIdisplayPrivate object. 676e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * This is called from __glXInitialize() when we are given a new 677e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * display pointer. 678e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 6790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay * 6800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDisplay(Display * dpy) 681e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 6820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdisplayPrivate *pdp; 6830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int eventBase, errorBase; 684e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) 6860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 687e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp = Xmalloc(sizeof *pdp); 6890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdp == NULL) 6900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 691e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) { 6930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdp); 6940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 6950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 696e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->driPatch = 0; 69861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->swapAvailable = (pdp->driMinor >= 2); 69961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->invalidateAvailable = (pdp->driMinor >= 3); 700e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.destroyDisplay = dri2DestroyDisplay; 7020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.createScreen = dri2CreateScreen; 703e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdp->base; 705e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 706e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 707e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif /* GLX_DIRECT_RENDERING */ 708