dri2_glx.c revision c356f5867f2c1fad7155df538b9affa8dbdcf869
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 { 7966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen base; 80f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 8170887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg __DRIscreen *driScreen; 8270887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg __GLXDRIscreen vtable; 83f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg const __DRIdri2Extension *dri2; 84f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg const __DRIcoreExtension *core; 859e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 869e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg const __DRI2flushExtension *f; 879e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg const __DRI2configQueryExtension *config; 889e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg const __DRItexBufferExtension *texBuffer; 89bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg const __DRIconfig **driver_configs; 909e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 91f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg void *driver; 92f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg int fd; 93f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg}; 94f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 95a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_context 960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 97c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context base; 9831819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg __GLXDRIcontext dri_vtable; 990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *driContext; 100e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 101e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 102a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_drawable 1030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 1040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable base; 105271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg __DRIdrawable *driDrawable; 1060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIbuffer buffers[5]; 1070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int bufferCount; 1080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int width, height; 1090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_back; 1100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_fake_front; 111efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes int swap_interval; 112f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}; 113f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 11431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsbergstatic const struct glx_context_vtable dri2_context_vtable; 11531819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg 1160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 117c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2_destroy_context(struct glx_context *context) 118e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 119a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 12031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) context->psc; 121e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 122d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg if (context->xid) 123d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg glx_send_destroy_context(psc->base.dpy, context->xid); 124c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg 125c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg if (context->extensions) 126c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg XFree((char *) context->extensions); 127c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg 128c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg GarbageCollectDRIDrawables(context->psc); 129c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg 130f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyContext) (pcp->driContext); 131e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 133e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 134e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool 136c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2BindContext(struct glx_context *context, 137f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __GLXDRIdrawable *draw, __GLXDRIdrawable *read) 138e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 139a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 14031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; 141271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdr = (struct dri2_drawable *) draw; 142271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *prd = (struct dri2_drawable *) read; 143e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 144f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return (*psc->core->bindContext) (pcp->driContext, 145271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdr->driDrawable, prd->driDrawable); 146e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 147e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 149c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2UnbindContext(struct glx_context *context) 150e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 151a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 15231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; 153e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 154f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->unbindContext) (pcp->driContext); 155e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 156e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 157c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic struct glx_context * 15866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2_create_context(struct glx_screen *base, 1596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg struct glx_config *config_base, 160c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *shareList, int renderType) 161e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 162a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp, *pcp_shared; 163f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 1646ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; 1650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *shared = NULL; 1660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (shareList) { 168af6a2aede696ad3c45798d6c28aa04e8f5035e6eEric Anholt pcp_shared = (struct dri2_context *) shareList; 1690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf shared = pcp_shared->driContext; 1700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp = Xmalloc(sizeof *pcp); 1730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp == NULL) 1740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 17631819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg memset(pcp, 0, sizeof *pcp); 1776ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg if (!glx_context_init(&pcp->base, &psc->base, &config->base)) { 17831819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg Xfree(pcp); 17931819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg return NULL; 18031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg } 18131819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg 1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->driContext = 18370887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->dri2->createNewContext) (psc->driScreen, 1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, shared, pcp); 1850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp->driContext == NULL) { 1870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 1880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 19131819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg pcp->base.vtable = &dri2_context_vtable; 19231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg pcp->base.driContext = &pcp->dri_vtable; 19331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg pcp->dri_vtable.bindContext = dri2BindContext; 19431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg pcp->dri_vtable.unbindContext = dri2UnbindContext; 1950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pcp->base; 197e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 198e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 200271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsbergdri2DestroyDrawable(__GLXDRIdrawable *base) 201e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 202271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base->psc; 203271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdraw = (struct dri2_drawable *) base; 204c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = psc->base.display; 205037755122e9011c768e5caa4d4cb83aba783d3e9Kristian Høgsberg struct dri2_display *pdp = (struct dri2_display *)dpyPriv->dri2Display; 2063750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 207271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg __glxHashDelete(pdp->dri2Hash, pdraw->base.xDrawable); 208f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyDrawable) (pdraw->driDrawable); 209271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, pdraw->base.xDrawable); 2100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 211e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 212e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIdrawable * 21466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2CreateDrawable(struct glx_screen *base, XID xDrawable, 2156ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLXDrawable drawable, struct glx_config *config_base) 216e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 217a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw; 218f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 2196ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; 220c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv; 221a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 22245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 223e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw = Xmalloc(sizeof(*pdraw)); 2250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw) 2260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 227e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2286393a33944ec9983426cecd5f6c9f05ac089e1aeKristian Høgsberg memset(pdraw, 0, sizeof *pdraw); 2290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.destroyDrawable = dri2DestroyDrawable; 2300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable = xDrawable; 2310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.drawable = drawable; 232f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg pdraw->base.psc = &psc->base; 2330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = 0; 23445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; /* default may be overridden below */ 235d20fce057ee94fc3441c01a9e54cb5e19f7ddfd3Pierre Willenbrock pdraw->have_back = 0; 23645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 2379e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->config) 23870887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->config->configQueryi(psc->driScreen, 2399e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg "vblank_mode", &vblank_mode); 24045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 24145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 24245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 24345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_0: 24445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 0; 24545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 24645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_1: 24745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 24845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 24945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; 25045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 25145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 252e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 253f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2CreateDrawable(psc->base.dpy, xDrawable); 254e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 255f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg dpyPriv = __glXInitialize(psc->base.dpy); 256a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pdp = (struct dri2_display *)dpyPriv->dri2Display;; 2570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Create a new drawable */ 258271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->driDrawable = 25970887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->dri2->createNewDrawable) (psc->driScreen, 2600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, pdraw); 261f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 262271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg if (!pdraw->driDrawable) { 263f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, xDrawable); 2640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 2650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 2660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 267e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2683750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashInsert(pdp->dri2Hash, xDrawable, pdraw)) { 269271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->core->destroyDrawable) (pdraw->driDrawable); 270f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, xDrawable); 2713750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdraw); 2723750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return None; 2733750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 2743750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 2753750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 276c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#ifdef X_DRI2SwapInterval 277385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes /* 278385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * Make sure server has the same swap interval we do for the new 279385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * drawable. 280385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes */ 2810a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes if (pdp->swapAvailable) 282f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2SwapInterval(psc->base.dpy, xDrawable, pdraw->swap_interval); 283c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#endif 2840a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes 2850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdraw->base; 286f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg} 287f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 28807c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2GetMSC 28907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 290daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 29166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2DrawableGetMSC(struct glx_screen *psc, __GLXDRIdrawable *pdraw, 292daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *ust, int64_t *msc, int64_t *sbc) 293daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 2948d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 2958d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 2968d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 2978d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2GetMSC(psc->dpy, pdraw->xDrawable, 2988d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg &dri2_ust, &dri2_msc, &dri2_sbc); 2998d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 3008d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 3018d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 3028d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3038d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 304daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 305daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 30607c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif 30707c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 30807c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 30907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2WaitMSC 31007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 311daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 312daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 313daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) 314daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 3158d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 3168d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 3178d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3188d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2WaitMSC(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 3198d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg remainder, &dri2_ust, &dri2_msc, &dri2_sbc); 3208d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 3218d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 3228d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 3238d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3248d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 325daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 326daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 327daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 328daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, 329daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *msc, int64_t *sbc) 330daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 3318d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 3328d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 3338d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3348d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2WaitSBC(pdraw->psc->dpy, pdraw->xDrawable, 3358d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg target_sbc, &dri2_ust, &dri2_msc, &dri2_sbc); 3368d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 3378d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 3388d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 3398d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3408d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 341daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 342daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 34307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2WaitMSC */ 34407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 3450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 346daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, int width, int height) 3474830809524b20e517e949151957512b14d7e679aKristian Høgsberg{ 348a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 3499e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; 3500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 3510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 3524830809524b20e517e949151957512b14d7e679aKristian Høgsberg 3530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 3540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_back) 3550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 35663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = x; 3580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = priv->height - y - height; 3590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = width; 3600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = height; 3614830809524b20e517e949151957512b14d7e679aKristian Høgsberg 36265562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 3639e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->f) 364271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->f->flush) (priv->driDrawable); 36565562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 36665562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 3679e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg region = XFixesCreateRegion(psc->base.dpy, &xrect, 1); 3689e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region, 3690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferBackLeft); 3705ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 3710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Refresh the fake front (if present) after we just damaged the real 3720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * front. 3730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 374bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer if (priv->have_fake_front) 375bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region, 376bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 377bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer 3789e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 3794830809524b20e517e949151957512b14d7e679aKristian Høgsberg} 3804830809524b20e517e949151957512b14d7e679aKristian Høgsberg 3810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 382a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergdri2_copy_drawable(struct dri2_drawable *priv, int dest, int src) 38363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 3840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 3850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 3869e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 38763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 3880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 3890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 3900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 3910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 39263b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 39365562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 394308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg if (psc->f) 395271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->f->flush) (priv->driDrawable); 39665562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 39765562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 3989e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg region = XFixesCreateRegion(psc->base.dpy, &xrect, 1); 3999e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, priv->base.xDrawable, region, dest, src); 4009e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 401308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 40263b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 40363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 405c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2_wait_x(struct glx_context *gc) 40663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 4077b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) 408eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); 40963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4107b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg if (priv == NULL || !priv->have_fake_front) 4110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 41263b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 413308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 414308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg} 41563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 416308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergstatic void 417c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2_wait_gl(struct glx_context *gc) 418308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg{ 4197b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) 420eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); 42165562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 4227b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg if (priv == NULL || !priv->have_fake_front) 423308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg return; 424308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 425308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 42663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 42763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 42961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) 43082634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick{ 431a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 432c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv = __glXInitialize(pdraw->base.psc->dpy); 433a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = (struct dri2_display *)priv->dri2Display; 434c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *gc = __glXGetCurrentContext(); 4354cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 4364cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 4374cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 4384cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg dri2InvalidateBuffers(priv->dpy, pdraw->base.drawable); 4394cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 4409a12a3925a82475fd8f01ba53987581d30dd1128Eric Anholt dri2_wait_gl(gc); 44182634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick} 44282634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 44382634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 4440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 44566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2DestroyScreen(struct glx_screen *base) 446e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 447f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 448f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 4490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Free the direct rendering per screen data */ 45070887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->core->destroyScreen) (psc->driScreen); 451bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg driDestroyConfigs(psc->driver_configs); 4520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf close(psc->fd); 453f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 454e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 455e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 456dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick/** 457dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Process list of buffer received from the server 458dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * 459dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Processes the list of buffers received in a reply from the server to either 460dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat. 461dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick */ 462dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic void 463a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergprocess_buffers(struct dri2_drawable * pdraw, DRI2Buffer * buffers, 4640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned count) 465e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 4660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 4670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 4680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = count; 4690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 0; 4700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 0; 4710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 4720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* This assumes the DRI2 buffer attachment tokens matches the 4730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * __DRIbuffer tokens. */ 4740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; i < count; i++) { 4750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].attachment = buffers[i].attachment; 4760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].name = buffers[i].name; 4770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].pitch = buffers[i].pitch; 4780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].cpp = buffers[i].cpp; 4790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].flags = buffers[i].flags; 4800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) 4810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 1; 4820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) 4830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 1; 4840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 48577c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 486dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 487dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 488daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int64_t 489daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 490daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder) 491a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes{ 492a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 493c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = __glXInitialize(priv->base.psc->dpy); 4949e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 495a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = 496a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg (struct dri2_display *)dpyPriv->dri2Display; 497db011c8141d7b01b67f2ded4e634657b92ed707aCarl Worth CARD64 ret = 0; 498a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 499a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#ifdef __DRI2_FLUSH 5009e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->f) 501271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->f->flush)(priv->driDrawable); 502a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#endif 503a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 5044cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 5054cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 5064cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg dri2InvalidateBuffers(dpyPriv->dpy, pdraw->drawable); 5074cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 508a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes /* Old servers can't handle swapbuffers */ 509daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes if (!pdp->swapAvailable) { 510daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height); 511daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return 0; 512daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes } 513a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 51401923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapBuffers 5159e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2SwapBuffers(psc->base.dpy, pdraw->xDrawable, target_msc, divisor, 516daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes remainder, &ret); 51701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 518a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 519daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return ret; 520a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes} 521a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 522dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 5230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffers(__DRIdrawable * driDrawable, 5240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 5250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 5260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 527dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 528a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 5290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 530dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable, 5320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, count, out_count); 5330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 5340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 535dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 5370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 5380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 539dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 541dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 543dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 544dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 545dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 5460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffersWithFormat(__DRIdrawable * driDrawable, 5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 5480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 5490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 550dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 551a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 5520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 553dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy, 5550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable, 5560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, 5570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf count, out_count); 5580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 5590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 560dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 5620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 5630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 564dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 5650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 56677c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 5670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 568e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 569e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 57007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2SwapInterval 57107c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 572089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic int 573efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) 574efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 575a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 57645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 5779e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 57845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 57945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (psc->config) 58070887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->config->configQueryi(psc->driScreen, 5819e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg "vblank_mode", &vblank_mode); 58245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 58345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 58445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 585089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return GLX_BAD_VALUE; 58645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 58745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (interval <= 0) 588089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return GLX_BAD_VALUE; 58945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 59045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 59145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 59245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 593efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 5949e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2SwapInterval(priv->base.psc->dpy, priv->base.xDrawable, interval); 595efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes priv->swap_interval = interval; 596089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg 597089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return 0; 598efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 599efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 6008d0228912bfef173139296a96a097f1a6348c963Kristian Høgsbergstatic int 601efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2GetSwapInterval(__GLXDRIdrawable *pdraw) 602efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 603a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 604efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 605efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes return priv->swap_interval; 606efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 607efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 60807c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2SwapInterval */ 60907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 610f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergstatic const __DRIdri2LoaderExtension dri2LoaderExtension = { 6110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 6120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 6130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 6140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffersWithFormat, 615dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 616dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 617dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIdri2LoaderExtension dri2LoaderExtension_old = { 6180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 6190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 6200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 6210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL, 622e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 623e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 6244258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 6254258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsbergstatic const __DRIuseInvalidateExtension dri2UseInvalidate = { 6264258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION } 627dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 6284258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 629dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 63061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez_X_HIDDEN void 63161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateBuffers(Display *dpy, XID drawable) 63261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{ 6333750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw = 6343750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg dri2GetGlxDrawableFromXDrawableId(dpy, drawable); 6359e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; 636271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdp = (struct dri2_drawable *) pdraw; 63761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 63861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#if __DRI2_FLUSH_VERSION >= 3 6399e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (pdraw && psc->f) 640271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg psc->f->invalidate(pdp->driDrawable); 64161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#endif 64261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez} 64361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 644643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 645643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_bind_tex_image(Display * dpy, 646643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg GLXDrawable drawable, 647643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg int buffer, const int *attrib_list) 648643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 649c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *gc = __glXGetCurrentContext(); 650566373967a6a63b6a9c85a2392bc827ac7ef679fEric Anholt struct dri2_context *pcp = (struct dri2_context *) gc; 651eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); 652c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = __glXInitialize(dpy); 653271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdraw = (struct dri2_drawable *) base; 654271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_display *pdp = 655271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (struct dri2_display *) dpyPriv->dri2Display; 656271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base->psc; 657643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 658643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg if (pdraw != NULL) { 659ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 660ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#if __DRI2_FLUSH_VERSION >= 3 6619e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (!pdp->invalidateAvailable && psc->f) 6629e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f->invalidate(pdraw->driDrawable); 663ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#endif 664ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 6659e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->texBuffer->base.version >= 2 && 6669e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->texBuffer->setTexBuffer2 != NULL) { 667f679640868ae6ef700d8672702c31ba2515220a7Kristian Høgsberg (*psc->texBuffer->setTexBuffer2) (pcp->driContext, 668271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureTarget, 669271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureFormat, 6709e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->driDrawable); 671643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 672643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg else { 673f679640868ae6ef700d8672702c31ba2515220a7Kristian Høgsberg (*psc->texBuffer->setTexBuffer) (pcp->driContext, 674271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureTarget, 6759e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->driDrawable); 676643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 677643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 678643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 679643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 680643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 681643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) 682643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 683643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 684643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 685643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic const struct glx_context_vtable dri2_context_vtable = { 686c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg dri2_destroy_context, 6877b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg dri2_wait_gl, 6887b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg dri2_wait_x, 6897b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg DRI_glXUseXFont, 690643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_bind_tex_image, 691643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_release_tex_image, 692643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}; 693643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 6949e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsbergstatic void 6959e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsbergdri2BindExtensions(struct dri2_screen *psc, const __DRIextension **extensions) 6969e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg{ 6979e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg int i; 6989e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 6999e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); 7009e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control"); 7019e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control"); 702a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read"); 7039e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 7049e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg /* FIXME: if DRI2 version supports it... */ 7059e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "INTEL_swap_event"); 7069e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 7079e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg for (i = 0; extensions[i]; i++) { 7089e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) { 7099e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->texBuffer = (__DRItexBufferExtension *) extensions[i]; 7109e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap"); 7119e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 7129e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 7139e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) { 7149e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f = (__DRI2flushExtension *) extensions[i]; 7159e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg /* internal driver extension, no GL extension exposed */ 7169e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 7179e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 7189e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0)) 7199e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->config = (__DRI2configQueryExtension *) extensions[i]; 7209e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 7219e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg} 7229e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 7236ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsbergstatic const struct glx_screen_vtable dri2_screen_vtable = { 7246ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg dri2_create_context 7256ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg}; 7269e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 72766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergstatic struct glx_screen * 728c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2CreateScreen(int screen, struct glx_display * priv) 729e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 7300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIconfig **driver_configs; 7310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIextension **extensions; 732a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg const struct dri2_display *const pdp = (struct dri2_display *) 733dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick priv->dri2Display; 734f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc; 7350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIscreen *psp; 7360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf char *driverName, *deviceName; 7370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drm_magic_t magic; 7380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 7390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 740f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = Xmalloc(sizeof *psc); 741f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL) 7420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 7430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 744f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg memset(psc, 0, sizeof *psc); 745f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!glx_screen_init(&psc->base, screen, priv)) 746f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return NULL; 747f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 748f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen), 74981cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes &driverName, &deviceName)) { 750f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg XFree(psc); 7510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 75281cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes } 7530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver = driOpenDriver(driverName); 7550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->driver == NULL) { 7560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver pointer missing\n"); 7570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 7580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); 7610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (extensions == NULL) { 7620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); 7630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 7640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; extensions[i]; i++) { 7670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_CORE) == 0) 768daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->core = (__DRIcoreExtension *) extensions[i]; 7690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_DRI2) == 0) 770daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->dri2 = (__DRIdri2Extension *) extensions[i]; 7710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->core == NULL || psc->dri2 == NULL) { 7740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("core dri or dri2 extension not found\n"); 7750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 7760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->fd = open(deviceName, O_RDWR); 7790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->fd < 0) { 7800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to open drm device: %s\n", strerror(errno)); 78181cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 7820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (drmGetMagic(psc->fd, &magic)) { 7850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to get magic\n"); 78681cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 7870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 789f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!DRI2Authenticate(priv->dpy, RootWindow(priv->dpy, screen), magic)) { 7900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to authenticate magic %d\n", magic); 79181cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 7920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 7930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 7944258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 7950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* If the server does not support the protocol for 7960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * DRI2GetBuffersWithFormat, don't supply that interface to the driver. 7970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 79870887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->driScreen = 7994258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg psc->dri2->createNewScreen(screen, psc->fd, 8004258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg (const __DRIextension **) 8014258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg &pdp->loader_extensions[0], 802daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes &driver_configs, psc); 8030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 80470887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg if (psc->driScreen == NULL) { 8050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to create dri screen\n"); 80681cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 8070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 8080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 80970887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg extensions = psc->core->getExtensions(psc->driScreen); 8109e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg dri2BindExtensions(psc, extensions); 8110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 812f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.configs = 813f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg driConvertConfigs(psc->core, psc->base.configs, driver_configs); 814f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.visuals = 815f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg driConvertConfigs(psc->core, psc->base.visuals, driver_configs); 8160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 817bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg psc->driver_configs = driver_configs; 8180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 8196ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg psc->base.vtable = &dri2_screen_vtable; 82070887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psp = &psc->vtable; 821f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.driScreen = psp; 8220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->destroyScreen = dri2DestroyScreen; 8230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createDrawable = dri2CreateDrawable; 8240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->swapBuffers = dri2SwapBuffers; 82501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getDrawableMSC = NULL; 82601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForMSC = NULL; 82701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForSBC = NULL; 82801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->setSwapInterval = NULL; 82901923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getSwapInterval = NULL; 83001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell 8311cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes if (pdp->driMinor >= 2) { 83201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2GetMSC 8331cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getDrawableMSC = dri2DrawableGetMSC; 83401923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 83501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2WaitMSC 8361cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForMSC = dri2WaitForMSC; 8371cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForSBC = dri2WaitForSBC; 83801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 83901923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapInterval 8401cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->setSwapInterval = dri2SetSwapInterval; 8411cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getSwapInterval = dri2GetSwapInterval; 84201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 8431ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#if defined(X_DRI2GetMSC) && defined(X_DRI2WaitMSC) && defined(X_DRI2SwapInterval) 844f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); 8451ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#endif 8461cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes } 8470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 8480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always 8490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * available.*/ 8500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->copySubBuffer = dri2CopySubBuffer; 851f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); 8520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 8530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 8540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 8550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 856f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return &psc->base; 857e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 858daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barneshandle_error: 8590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 8600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 861f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg XFree(psc); 862e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* FIXME: clean up here */ 864e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 866e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 867e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 868e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* Called from __glXFreeDisplayPrivate. 869e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 8700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 8710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDisplay(__GLXDRIdisplay * dpy) 872e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 8730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(dpy); 874e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 875e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8763750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg_X_HIDDEN __GLXDRIdrawable * 8773750ebd540510324ef5ada769537ae05309adadbKristian Høgsbergdri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id) 8783750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg{ 879c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *d = __glXInitialize(dpy); 880a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = (struct dri2_display *) d->dri2Display; 8813750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw; 8823750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 8833750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashLookup(pdp->dri2Hash, id, (void *) &pdraw) == 0) 8843750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return pdraw; 8853750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 8863750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 8873750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg} 8883750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 889e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* 890e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Allocate, initialize and return a __DRIdisplayPrivate object. 891e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * This is called from __glXInitialize() when we are given a new 892e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * display pointer. 893e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 8940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay * 8950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDisplay(Display * dpy) 896e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 897a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 8984258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg int eventBase, errorBase, i; 899e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 9000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) 9010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 902e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 9030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp = Xmalloc(sizeof *pdp); 9040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdp == NULL) 9050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 906e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 9070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) { 9080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdp); 9090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 9100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 911e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 9120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->driPatch = 0; 91361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->swapAvailable = (pdp->driMinor >= 2); 91461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->invalidateAvailable = (pdp->driMinor >= 3); 915e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 9160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.destroyDisplay = dri2DestroyDisplay; 9170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.createScreen = dri2CreateScreen; 918e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 9194258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg i = 0; 9204258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg if (pdp->driMinor < 1) 9214258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base; 9224258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg else 9234258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension.base; 9244258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 9254258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &systemTimeExtension.base; 9264258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 9274258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 9284cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg pdp->loader_extensions[i++] = &dri2UseInvalidate.base; 9294258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 930c8f407bcec7619eb2030ea9fe52501ad33075699Kristian Høgsberg pdp->loader_extensions[i++] = NULL; 9314258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 9323750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg pdp->dri2Hash = __glxHashCreate(); 9333750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (pdp->dri2Hash == NULL) { 9343750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdp); 9353750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 9363750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 9373750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 9380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdp->base; 939e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 940e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 941e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif /* GLX_DIRECT_RENDERING */ 942