dri2_glx.c revision 9e546ecfd446abf1236cdb0b9469157de5d084ce
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 78f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergstruct dri2_screen { 79f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __GLXscreenConfigs base; 80f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 81f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __GLXDRIscreen driScreen; 82f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg const __DRIdri2Extension *dri2; 83f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg const __DRIcoreExtension *core; 849e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 859e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg const __DRI2flushExtension *f; 869e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg const __DRI2configQueryExtension *config; 879e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg const __DRItexBufferExtension *texBuffer; 889e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 89f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg void *driver; 90f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg int fd; 91f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg}; 92f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 93a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_context 940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIcontext base; 960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *driContext; 970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXscreenConfigs *psc; 98e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 99e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 100a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_drawable 1010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 1020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable base; 1030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIbuffer buffers[5]; 1040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int bufferCount; 1050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int width, height; 1060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_back; 1070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_fake_front; 108efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes int swap_interval; 109f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}; 110f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 1110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 112f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergdri2DestroyContext(__GLXDRIcontext *context, 113f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __GLXscreenConfigs *base, Display *dpy) 114e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 115a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 116f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 117e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 118f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyContext) (pcp->driContext); 119e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 121e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 122e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool 124f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergdri2BindContext(__GLXDRIcontext *context, 125f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __GLXDRIdrawable *draw, __GLXDRIdrawable *read) 126e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 127a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 128f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pcp->psc; 129e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 130f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return (*psc->core->bindContext) (pcp->driContext, 131f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg draw->driDrawable, read->driDrawable); 132e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 133e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 135f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergdri2UnbindContext(__GLXDRIcontext *context) 136e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 137a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 138f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pcp->psc; 139e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 140f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->unbindContext) (pcp->driContext); 141e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 142e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIcontext * 144f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergdri2CreateContext(__GLXscreenConfigs *base, 1450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __GLcontextModes * mode, 1460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLXContext gc, GLXContext shareList, int renderType) 147e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 148a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp, *pcp_shared; 149f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 1500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode; 1510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *shared = NULL; 1520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (shareList) { 154a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pcp_shared = (struct dri2_context *) shareList->driContext; 1550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf shared = pcp_shared->driContext; 1560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp = Xmalloc(sizeof *pcp); 1590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp == NULL) 1600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 162f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg pcp->psc = &psc->base; 1630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->driContext = 164f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->dri2->createNewContext) (psc->base.__driScreen, 1650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, shared, pcp); 1660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf gc->__driContext = pcp->driContext; 1670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp->driContext == NULL) { 1690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 1700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.destroyContext = dri2DestroyContext; 1740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.bindContext = dri2BindContext; 1750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->base.unbindContext = dri2UnbindContext; 1760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pcp->base; 178e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 179e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 1813750ebd540510324ef5ada769537ae05309adadbKristian Høgsbergdri2DestroyDrawable(__GLXDRIdrawable *pdraw) 182e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 183f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; 1843750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXdisplayPrivate *dpyPriv; 185a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 186e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1873750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg dpyPriv = __glXInitialize(pdraw->psc->dpy); 188a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pdp = (struct dri2_display *)dpyPriv->dri2Display; 1893750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 1903750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __glxHashDelete(pdp->dri2Hash, pdraw->xDrawable); 191f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyDrawable) (pdraw->driDrawable); 192f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, pdraw->xDrawable); 1930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 194e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 195e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIdrawable * 197f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergdri2CreateDrawable(__GLXscreenConfigs *base, XID xDrawable, 198f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg GLXDrawable drawable, const __GLcontextModes * modes) 199e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 200a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw; 201f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 2020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes; 2030a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes __GLXdisplayPrivate *dpyPriv; 204a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 20545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 206e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw = Xmalloc(sizeof(*pdraw)); 2080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw) 2090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 210e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.destroyDrawable = dri2DestroyDrawable; 2120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable = xDrawable; 2130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.drawable = drawable; 214f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg pdraw->base.psc = &psc->base; 2150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = 0; 21645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; /* default may be overridden below */ 217d20fce057ee94fc3441c01a9e54cb5e19f7ddfd3Pierre Willenbrock pdraw->have_back = 0; 21845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 2199e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->config) 2209e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->config->configQueryi(psc->base.__driScreen, 2219e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg "vblank_mode", &vblank_mode); 22245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 22345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 22445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 22545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_0: 22645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 0; 22745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 22845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_1: 22945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 23045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 23145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; 23245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 23345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 234e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 235f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2CreateDrawable(psc->base.dpy, xDrawable); 236e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 237f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg dpyPriv = __glXInitialize(psc->base.dpy); 238a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pdp = (struct dri2_display *)dpyPriv->dri2Display;; 2390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Create a new drawable */ 2400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.driDrawable = 241f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->dri2->createNewDrawable) (psc->base.__driScreen, 2420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, pdraw); 243f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 2440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw->base.driDrawable) { 245f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, xDrawable); 2460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 2470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 2480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 249e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2503750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashInsert(pdp->dri2Hash, xDrawable, pdraw)) { 2513750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg (*psc->core->destroyDrawable) (pdraw->base.driDrawable); 252f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, xDrawable); 2533750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdraw); 2543750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return None; 2553750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 2563750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 2573750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 258c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#ifdef X_DRI2SwapInterval 259385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes /* 260385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * Make sure server has the same swap interval we do for the new 261385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * drawable. 262385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes */ 2630a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes if (pdp->swapAvailable) 264f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2SwapInterval(psc->base.dpy, xDrawable, pdraw->swap_interval); 265c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#endif 2660a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes 2670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdraw->base; 268f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg} 269f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 27007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2GetMSC 27107c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 272daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 273daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2DrawableGetMSC(__GLXscreenConfigs *psc, __GLXDRIdrawable *pdraw, 274daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *ust, int64_t *msc, int64_t *sbc) 275daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 27662eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2GetMSC(psc->dpy, pdraw->xDrawable, ust, msc, sbc); 277daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 278daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 27907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif 28007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 28107c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 28207c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2WaitMSC 28307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 284daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 285daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 286daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) 287daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 28862eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2WaitMSC(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 289daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, ust, msc, sbc); 290daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 291daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 292daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 293daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, 294daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *msc, int64_t *sbc) 295daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 29662eb28c810a192dab772402904c50eea43b8340eJesse Barnes return DRI2WaitSBC(pdraw->psc->dpy, pdraw->xDrawable, target_sbc, ust, msc, 297daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes sbc); 298daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 299daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 30007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2WaitMSC */ 30107c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 3020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 303daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, int width, int height) 3044830809524b20e517e949151957512b14d7e679aKristian Høgsberg{ 305a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 3069e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; 3070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 3080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 3094830809524b20e517e949151957512b14d7e679aKristian Høgsberg 3100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 3110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_back) 3120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 31363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = x; 3150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = priv->height - y - height; 3160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = width; 3170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = height; 3184830809524b20e517e949151957512b14d7e679aKristian Høgsberg 31965562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 3209e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->f) 3219e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg (*psc->f->flush) (pdraw->driDrawable); 32265562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 32365562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 3249e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg region = XFixesCreateRegion(psc->base.dpy, &xrect, 1); 3259e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region, 3260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferBackLeft); 3279e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 3285ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 3290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Refresh the fake front (if present) after we just damaged the real 3300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * front. 3310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 3329e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region, 333b006d465ea0ea680326f702ad248544c576301a2Kristian Høgsberg DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 3349e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 3354830809524b20e517e949151957512b14d7e679aKristian Høgsberg} 3364830809524b20e517e949151957512b14d7e679aKristian Høgsberg 3370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 338a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergdri2_copy_drawable(struct dri2_drawable *priv, int dest, int src) 33963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 3400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 3410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 3429e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 34363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 3450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 3460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 3470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 34863b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 34965562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 350308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg if (psc->f) 351308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg (*psc->f->flush) (priv->base.driDrawable); 35265562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 35365562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 3549e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg region = XFixesCreateRegion(psc->base.dpy, &xrect, 1); 3559e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, priv->base.xDrawable, region, dest, src); 3569e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 357308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 35863b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 35963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 361308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergdri2WaitX(__GLXDRIdrawable *pdraw) 36263b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 363a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 36463b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_fake_front) 3660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 36763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 368308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 369308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg} 37063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 371308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergstatic void 372308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergdri2WaitGL(__GLXDRIdrawable * pdraw) 373308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg{ 374a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 37565562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 376308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg if (!priv->have_fake_front) 377308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg return; 378308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 379308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 38063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 38163b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 38361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) 38482634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick{ 385a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 3864cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg __GLXdisplayPrivate *priv = __glXInitialize(pdraw->base.psc->dpy); 387a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = (struct dri2_display *)priv->dri2Display; 3884cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 3894cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 3904cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 3914cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg dri2InvalidateBuffers(priv->dpy, pdraw->base.drawable); 3924cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 39361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez dri2WaitGL(loaderPrivate); 39482634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick} 39582634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 39682634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 3970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 398f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergdri2DestroyScreen(__GLXscreenConfigs *base) 399e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 400f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 401f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 4020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Free the direct rendering per screen data */ 403f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyScreen) (psc->base.__driScreen); 4040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf close(psc->fd); 405f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg base->__driScreen = NULL; 406f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 407e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 408e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 409dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick/** 410dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Process list of buffer received from the server 411dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * 412dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Processes the list of buffers received in a reply from the server to either 413dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat. 414dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick */ 415dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic void 416a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergprocess_buffers(struct dri2_drawable * pdraw, DRI2Buffer * buffers, 4170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned count) 418e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 4190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 4200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 4210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = count; 4220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 0; 4230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 0; 4240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 4250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* This assumes the DRI2 buffer attachment tokens matches the 4260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * __DRIbuffer tokens. */ 4270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; i < count; i++) { 4280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].attachment = buffers[i].attachment; 4290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].name = buffers[i].name; 4300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].pitch = buffers[i].pitch; 4310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].cpp = buffers[i].cpp; 4320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].flags = buffers[i].flags; 4330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) 4340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 1; 4350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) 4360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 1; 4370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 43877c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 439dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 440dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 441daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int64_t 442daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 443daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder) 444a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes{ 445a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 446a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes __GLXdisplayPrivate *dpyPriv = __glXInitialize(priv->base.psc->dpy); 4479e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 448a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = 449a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg (struct dri2_display *)dpyPriv->dri2Display; 450daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t ret; 451a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 452a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#ifdef __DRI2_FLUSH 4539e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->f) 4549e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg (*psc->f->flush)(pdraw->driDrawable); 455a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#endif 456a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 4574cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 4584cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 4594cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg dri2InvalidateBuffers(dpyPriv->dpy, pdraw->drawable); 4604cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 461a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes /* Old servers can't handle swapbuffers */ 462daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes if (!pdp->swapAvailable) { 463daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height); 464daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return 0; 465daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes } 466a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 46701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapBuffers 4689e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2SwapBuffers(psc->base.dpy, pdraw->xDrawable, target_msc, divisor, 469daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, &ret); 47001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 471a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 472daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return ret; 473a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes} 474a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 475dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 4760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffers(__DRIdrawable * driDrawable, 4770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 4780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 4790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 480dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 481a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 4820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 483dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable, 4850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, count, out_count); 4860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 4870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 488dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 4900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 4910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 492dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 494dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 4950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 496dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 497dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 498dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 4990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffersWithFormat(__DRIdrawable * driDrawable, 5000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 5010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 5020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 503dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 504a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 5050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 506dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy, 5080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable, 5090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, 5100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf count, out_count); 5110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 5120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 513dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 5150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 5160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 517dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 51977c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 5200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 521e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 522e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 52307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2SwapInterval 52407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 525efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesstatic void 526efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) 527efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 528a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 52945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 5309e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 53145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 53245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (psc->config) 5339e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->config->configQueryi(psc->base.__driScreen, 5349e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg "vblank_mode", &vblank_mode); 53545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 53645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 53745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 53845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes return; 53945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 54045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (interval <= 0) 54145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes return; 54245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 54345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 54445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 54545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 546efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 5479e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2SwapInterval(priv->base.psc->dpy, priv->base.xDrawable, interval); 548efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes priv->swap_interval = interval; 549efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 550efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 551efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesstatic unsigned int 552efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2GetSwapInterval(__GLXDRIdrawable *pdraw) 553efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 554a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 555efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 556efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes return priv->swap_interval; 557efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 558efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 55907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2SwapInterval */ 56007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 561f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergstatic const __DRIdri2LoaderExtension dri2LoaderExtension = { 5620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 5630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 5640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 5650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffersWithFormat, 566dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 567dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 568dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIdri2LoaderExtension dri2LoaderExtension_old = { 5690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 5700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 5710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 5720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL, 573e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 574e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 5754258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 5764258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsbergstatic const __DRIuseInvalidateExtension dri2UseInvalidate = { 5774258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION } 578dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 5794258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 580dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 58161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez_X_HIDDEN void 58261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateBuffers(Display *dpy, XID drawable) 58361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{ 5843750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw = 5853750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg dri2GetGlxDrawableFromXDrawableId(dpy, drawable); 5869e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; 58761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 58861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#if __DRI2_FLUSH_VERSION >= 3 5899e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (pdraw && psc->f) 5909e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f->invalidate(pdraw->driDrawable); 59161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#endif 59261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez} 59361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 594643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 595643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_bind_tex_image(Display * dpy, 596643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg GLXDrawable drawable, 597643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg int buffer, const int *attrib_list) 598643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 599643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg GLXContext gc = __glXGetCurrentContext(); 600643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL); 601ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg __GLXdisplayPrivate *dpyPriv = __glXInitialize(dpy); 602a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = 603a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg (struct dri2_display *) dpyPriv->dri2Display; 6049e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; 605643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 606643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg if (pdraw != NULL) { 607ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 608ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#if __DRI2_FLUSH_VERSION >= 3 6099e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (!pdp->invalidateAvailable && psc->f) 6109e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f->invalidate(pdraw->driDrawable); 611ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#endif 612ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 6139e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->texBuffer->base.version >= 2 && 6149e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->texBuffer->setTexBuffer2 != NULL) { 6159e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg (*psc->texBuffer->setTexBuffer2) (gc->__driContext, 6169e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->textureTarget, 6179e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->textureFormat, 6189e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->driDrawable); 619643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 620643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg else { 6219e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg (*psc->texBuffer->setTexBuffer) (gc->__driContext, 6229e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->textureTarget, 6239e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->driDrawable); 624643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 625643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 626643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 627643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 628643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 629643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) 630643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 631643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 632643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 633643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic const struct glx_context_vtable dri2_context_vtable = { 634643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_bind_tex_image, 635643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_release_tex_image, 636643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}; 637643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 6389e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsbergstatic void 6399e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsbergdri2BindExtensions(struct dri2_screen *psc, const __DRIextension **extensions) 6409e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg{ 6419e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg int i; 6429e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 6439e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); 6449e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control"); 6459e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control"); 6469e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 6479e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg /* FIXME: if DRI2 version supports it... */ 6489e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "INTEL_swap_event"); 6499e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 6509e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg for (i = 0; extensions[i]; i++) { 6519e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) { 6529e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->texBuffer = (__DRItexBufferExtension *) extensions[i]; 6539e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap"); 6549e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 6559e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 6569e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) { 6579e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f = (__DRI2flushExtension *) extensions[i]; 6589e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg /* internal driver extension, no GL extension exposed */ 6599e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 6609e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 6619e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0)) 6629e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->config = (__DRI2configQueryExtension *) extensions[i]; 6639e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 6649e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg} 6659e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 6669e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 667f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergstatic __GLXscreenConfigs * 668f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergdri2CreateScreen(int screen, __GLXdisplayPrivate * priv) 669e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 6700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIconfig **driver_configs; 6710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIextension **extensions; 672a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg const struct dri2_display *const pdp = (struct dri2_display *) 673dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick priv->dri2Display; 674f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc; 6750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIscreen *psp; 6760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf char *driverName, *deviceName; 6770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drm_magic_t magic; 6780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 6790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 680f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = Xmalloc(sizeof *psc); 681f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL) 6820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 6830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 684f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg memset(psc, 0, sizeof *psc); 685f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!glx_screen_init(&psc->base, screen, priv)) 686f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return NULL; 687f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 688f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen), 68981cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes &driverName, &deviceName)) { 690f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg XFree(psc); 6910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 69281cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes } 6930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver = driOpenDriver(driverName); 6950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->driver == NULL) { 6960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver pointer missing\n"); 6970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 6980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 6990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); 7010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (extensions == NULL) { 7020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); 7030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 7040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; extensions[i]; i++) { 7070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_CORE) == 0) 708daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->core = (__DRIcoreExtension *) extensions[i]; 7090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_DRI2) == 0) 710daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->dri2 = (__DRIdri2Extension *) extensions[i]; 7110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->core == NULL || psc->dri2 == NULL) { 7140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("core dri or dri2 extension not found\n"); 7150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 7160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->fd = open(deviceName, O_RDWR); 7190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->fd < 0) { 7200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to open drm device: %s\n", strerror(errno)); 72181cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 7220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (drmGetMagic(psc->fd, &magic)) { 7250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to get magic\n"); 72681cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 7270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 729f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!DRI2Authenticate(priv->dpy, RootWindow(priv->dpy, screen), magic)) { 7300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to authenticate magic %d\n", magic); 73181cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 7320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7344258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 7350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* If the server does not support the protocol for 7360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * DRI2GetBuffersWithFormat, don't supply that interface to the driver. 7370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 738f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.__driScreen = 7394258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg psc->dri2->createNewScreen(screen, psc->fd, 7404258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg (const __DRIextension **) 7414258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg &pdp->loader_extensions[0], 742daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes &driver_configs, psc); 7430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 744f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc->base.__driScreen == NULL) { 7450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to create dri screen\n"); 74681cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 7470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 749f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg extensions = psc->core->getExtensions(psc->base.__driScreen); 750f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg driBindCommonExtensions(&psc->base, extensions); 7519e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg dri2BindExtensions(psc, extensions); 7520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 753f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.configs = 754f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg driConvertConfigs(psc->core, psc->base.configs, driver_configs); 755f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.visuals = 756f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg driConvertConfigs(psc->core, psc->base.visuals, driver_configs); 7570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 758f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.driver_configs = driver_configs; 7590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 760f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psp = &psc->driScreen; 761f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.driScreen = psp; 7620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->destroyScreen = dri2DestroyScreen; 7630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createContext = dri2CreateContext; 7640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createDrawable = dri2CreateDrawable; 7650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->swapBuffers = dri2SwapBuffers; 7660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->waitGL = dri2WaitGL; 7670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->waitX = dri2WaitX; 76801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getDrawableMSC = NULL; 76901923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForMSC = NULL; 77001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForSBC = NULL; 77101923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->setSwapInterval = NULL; 77201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getSwapInterval = NULL; 77301923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell 7741cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes if (pdp->driMinor >= 2) { 77501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2GetMSC 7761cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getDrawableMSC = dri2DrawableGetMSC; 77701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 77801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2WaitMSC 7791cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForMSC = dri2WaitForMSC; 7801cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForSBC = dri2WaitForSBC; 78101923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 78201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapInterval 7831cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->setSwapInterval = dri2SetSwapInterval; 7841cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getSwapInterval = dri2GetSwapInterval; 78501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 7861ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#if defined(X_DRI2GetMSC) && defined(X_DRI2WaitMSC) && defined(X_DRI2SwapInterval) 787f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); 7881ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#endif 7891cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes } 7900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always 7920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * available.*/ 7930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->copySubBuffer = dri2CopySubBuffer; 794f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); 7950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 796f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.direct_context_vtable = &dri2_context_vtable; 797643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 7980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 7990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 8000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 801f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return &psc->base; 802e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 803daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barneshandle_error: 8040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 8050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 806f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg XFree(psc); 807e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* FIXME: clean up here */ 809e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 811e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 812e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 813e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* Called from __glXFreeDisplayPrivate. 814e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 8150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 8160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDisplay(__GLXDRIdisplay * dpy) 817e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 8180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(dpy); 819e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 820e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8213750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg_X_HIDDEN __GLXDRIdrawable * 8223750ebd540510324ef5ada769537ae05309adadbKristian Høgsbergdri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id) 8233750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg{ 8243750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXdisplayPrivate *d = __glXInitialize(dpy); 825a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = (struct dri2_display *) d->dri2Display; 8263750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw; 8273750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 8283750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashLookup(pdp->dri2Hash, id, (void *) &pdraw) == 0) 8293750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return pdraw; 8303750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 8313750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 8323750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg} 8333750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 834e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* 835e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Allocate, initialize and return a __DRIdisplayPrivate object. 836e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * This is called from __glXInitialize() when we are given a new 837e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * display pointer. 838e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 8390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay * 8400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDisplay(Display * dpy) 841e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 842a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 8434258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg int eventBase, errorBase, i; 844e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) 8460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 847e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp = Xmalloc(sizeof *pdp); 8490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdp == NULL) 8500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 851e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) { 8530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdp); 8540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 8550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 856e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->driPatch = 0; 85861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->swapAvailable = (pdp->driMinor >= 2); 85961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->invalidateAvailable = (pdp->driMinor >= 3); 860e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.destroyDisplay = dri2DestroyDisplay; 8620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.createScreen = dri2CreateScreen; 863e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8644258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg i = 0; 8654258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg if (pdp->driMinor < 1) 8664258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base; 8674258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg else 8684258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension.base; 8694258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 8704258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &systemTimeExtension.base; 8714258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 8724258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 8734cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg pdp->loader_extensions[i++] = &dri2UseInvalidate.base; 8744258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 875c8f407bcec7619eb2030ea9fe52501ad33075699Kristian Høgsberg pdp->loader_extensions[i++] = NULL; 8764258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 8773750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg pdp->dri2Hash = __glxHashCreate(); 8783750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (pdp->dri2Hash == NULL) { 8793750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdp); 8803750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 8813750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 8823750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 8830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdp->base; 884e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 885e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 886e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif /* GLX_DIRECT_RENDERING */ 887