dri2_glx.c revision 511dc295f82c61acefe026d0f4de43d4a31dbf90
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> 37a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#include "glapi.h" 38e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "glxclient.h" 398b0b5ace4871847f7d8608e0ce6f67b7c5731ea7Francisco Jerez#include <X11/extensions/dri2proto.h> 40e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "xf86dri.h" 41e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <dlfcn.h> 424830809524b20e517e949151957512b14d7e679aKristian Høgsberg#include <fcntl.h> 434830809524b20e517e949151957512b14d7e679aKristian Høgsberg#include <unistd.h> 44e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <sys/types.h> 45e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <sys/mman.h> 46e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "xf86drm.h" 47e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "dri2.h" 48079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#include "dri_common.h" 4945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 5045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes/* From xmlpool/options.h, user exposed so should be stable */ 5145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#define DRI_CONF_VBLANK_NEVER 0 5245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 5345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 5445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 55e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 56dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick#undef DRI2_MINOR 57dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick#define DRI2_MINOR 1 58dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 59a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_display 600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdisplay base; 62e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* 64e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg ** XFree86-DRI version information 65e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driMajor; 670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driMinor; 680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int driPatch; 69a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes int swapAvailable; 7061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez int invalidateAvailable; 714258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 723750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __glxHashTable *dri2Hash; 733750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 744258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg const __DRIextension *loader_extensions[4]; 75e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 76e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 77f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergstruct dri2_screen { 7866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen base; 79f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 8070887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg __DRIscreen *driScreen; 8170887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg __GLXDRIscreen vtable; 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; 88511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom const __DRI2throttleExtension *throttle; 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; 980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *driContext; 99e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 100e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 101a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri2_drawable 1020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 1030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIdrawable base; 104271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg __DRIdrawable *driDrawable; 1050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIbuffer buffers[5]; 1060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int bufferCount; 1070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int width, height; 1080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_back; 1090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int have_fake_front; 110efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes int swap_interval; 111f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}; 112f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 11331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsbergstatic const struct glx_context_vtable dri2_context_vtable; 11431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg 1150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 116c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2_destroy_context(struct glx_context *context) 117e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 118a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 11931819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) context->psc; 120e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 121441344ba7ed2a1d162ee33ac4bac4bf645188cebKristian Høgsberg driReleaseDrawables(&pcp->base); 122441344ba7ed2a1d162ee33ac4bac4bf645188cebKristian Høgsberg 123d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg if (context->xid) 124d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg glx_send_destroy_context(psc->base.dpy, context->xid); 125c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg 126c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg if (context->extensions) 127c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg XFree((char *) context->extensions); 128c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg 129f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyContext) (pcp->driContext); 130e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 132e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 133e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool 135c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsbergdri2_bind_context(struct glx_context *context, struct glx_context *old, 136c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg GLXDrawable draw, GLXDrawable read) 137e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 138a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 13931819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; 140c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg struct dri2_drawable *pdraw, *pread; 14186a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg struct dri2_display *pdp; 142e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 143c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg pdraw = (struct dri2_drawable *) driFetchDrawable(context, draw); 144c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg pread = (struct dri2_drawable *) driFetchDrawable(context, read); 145c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg 146bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin driReleaseDrawables(&pcp->base); 147bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin 148c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg if (pdraw == NULL || pread == NULL) 149c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg return GLXBadDrawable; 150c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg 15186a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg if (!(*psc->core->bindContext) (pcp->driContext, 15286a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg pdraw->driDrawable, pread->driDrawable)) 15386a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg return GLXBadContext; 15486a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg 15586a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg /* If the server doesn't send invalidate events, we may miss a 15686a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg * resize before the rendering starts. Invalidate the buffers now 15786a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg * so the driver will recheck before rendering starts. */ 15886a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg pdp = (struct dri2_display *) psc->base.display; 15986a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg if (!pdp->invalidateAvailable) { 16086a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg dri2InvalidateBuffers(psc->base.dpy, pdraw->base.xDrawable); 16186a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg if (pread != pdraw) 16286a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg dri2InvalidateBuffers(psc->base.dpy, pread->base.xDrawable); 16386a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg } 164c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg 16586a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg return Success; 166e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 167e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 169c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsbergdri2_unbind_context(struct glx_context *context, struct glx_context *new) 170e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 171a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 17231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; 173e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 174f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->unbindContext) (pcp->driContext); 175e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 176e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 177c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic struct glx_context * 17866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2_create_context(struct glx_screen *base, 1796ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg struct glx_config *config_base, 180c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *shareList, int renderType) 181e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 182a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp, *pcp_shared; 183f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 1846ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; 1850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *shared = NULL; 1860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (shareList) { 188af6a2aede696ad3c45798d6c28aa04e8f5035e6eEric Anholt pcp_shared = (struct dri2_context *) shareList; 1890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf shared = pcp_shared->driContext; 1900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp = Xmalloc(sizeof *pcp); 1930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp == NULL) 1940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 19631819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg memset(pcp, 0, sizeof *pcp); 1976ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg if (!glx_context_init(&pcp->base, &psc->base, &config->base)) { 19831819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg Xfree(pcp); 19931819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg return NULL; 20031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg } 20131819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg 2020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->driContext = 20370887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->dri2->createNewContext) (psc->driScreen, 2040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, shared, pcp); 2050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp->driContext == NULL) { 2070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 2080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 2090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 2100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 21131819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg pcp->base.vtable = &dri2_context_vtable; 2120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pcp->base; 214e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 215e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 217271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsbergdri2DestroyDrawable(__GLXDRIdrawable *base) 218e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 219271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base->psc; 220271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdraw = (struct dri2_drawable *) base; 221c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = psc->base.display; 222037755122e9011c768e5caa4d4cb83aba783d3e9Kristian Høgsberg struct dri2_display *pdp = (struct dri2_display *)dpyPriv->dri2Display; 2233750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 224271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg __glxHashDelete(pdp->dri2Hash, pdraw->base.xDrawable); 225f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyDrawable) (pdraw->driDrawable); 2264ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg 2274ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg /* If it's a GLX 1.3 drawables, we can destroy the DRI2 drawable 2284ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * now, as the application explicitly asked to destroy the GLX 2294ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * drawable. Otherwise, for legacy drawables, we let the DRI2 2304ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * drawable linger on the server, since there's no good way of 2314ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * knowing when the application is done with it. The server will 2324ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * destroy the DRI2 drawable when it destroys the X drawable or the 2334ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * client exits anyway. */ 2344ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg if (pdraw->base.xDrawable != pdraw->base.drawable) 2354ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, pdraw->base.xDrawable); 2364ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg 2370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 238e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 239e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIdrawable * 24166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2CreateDrawable(struct glx_screen *base, XID xDrawable, 2426ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLXDrawable drawable, struct glx_config *config_base) 243e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 244a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw; 245f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 2466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; 247c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv; 248a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 24945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 250e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw = Xmalloc(sizeof(*pdraw)); 2520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw) 2530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 254e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2556393a33944ec9983426cecd5f6c9f05ac089e1aeKristian Høgsberg memset(pdraw, 0, sizeof *pdraw); 2560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.destroyDrawable = dri2DestroyDrawable; 2570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable = xDrawable; 2580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.drawable = drawable; 259f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg pdraw->base.psc = &psc->base; 2600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = 0; 26145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; /* default may be overridden below */ 262d20fce057ee94fc3441c01a9e54cb5e19f7ddfd3Pierre Willenbrock pdraw->have_back = 0; 26345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 2649e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->config) 26570887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->config->configQueryi(psc->driScreen, 2669e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg "vblank_mode", &vblank_mode); 26745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 26845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 26945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 27045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_0: 27145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 0; 27245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 27345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_1: 27445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 27545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 27645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; 27745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 27845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 279e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 280f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2CreateDrawable(psc->base.dpy, xDrawable); 281e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 282f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg dpyPriv = __glXInitialize(psc->base.dpy); 283a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pdp = (struct dri2_display *)dpyPriv->dri2Display;; 2840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Create a new drawable */ 285271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->driDrawable = 28670887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->dri2->createNewDrawable) (psc->driScreen, 2870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, pdraw); 288f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 289271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg if (!pdraw->driDrawable) { 290f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, xDrawable); 2910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 2920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 2930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 294e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 2953750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashInsert(pdp->dri2Hash, xDrawable, pdraw)) { 296271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->core->destroyDrawable) (pdraw->driDrawable); 297f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, xDrawable); 2983750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdraw); 2993750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return None; 3003750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 3013750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 3023750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 303c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#ifdef X_DRI2SwapInterval 304385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes /* 305385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * Make sure server has the same swap interval we do for the new 306385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * drawable. 307385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes */ 3080a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes if (pdp->swapAvailable) 309f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2SwapInterval(psc->base.dpy, xDrawable, pdraw->swap_interval); 310c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#endif 3110a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes 3120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdraw->base; 313f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg} 314f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 31507c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2GetMSC 31607c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 317daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 31866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2DrawableGetMSC(struct glx_screen *psc, __GLXDRIdrawable *pdraw, 319daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *ust, int64_t *msc, int64_t *sbc) 320daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 3218d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 3228d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 3238d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3248d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2GetMSC(psc->dpy, pdraw->xDrawable, 3258d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg &dri2_ust, &dri2_msc, &dri2_sbc); 3268d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 3278d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 3288d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 3298d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3308d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 331daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 332daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 33307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif 33407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 33507c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 33607c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2WaitMSC 33707c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 338daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 339daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 340daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) 341daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 3428d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 3438d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 3448d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3458d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2WaitMSC(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 3468d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg remainder, &dri2_ust, &dri2_msc, &dri2_sbc); 3478d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 3488d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 3498d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 3508d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3518d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 352daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 353daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 354daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 355daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, 356daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *msc, int64_t *sbc) 357daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 3588d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 3598d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 3608d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3618d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2WaitSBC(pdraw->psc->dpy, pdraw->xDrawable, 3628d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg target_sbc, &dri2_ust, &dri2_msc, &dri2_sbc); 3638d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 3648d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 3658d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 3668d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 3678d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 368daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 369daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 37007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2WaitMSC */ 37107c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 372511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom/** 373511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * dri2Throttle - Request driver throttling 374511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * 375511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * This function uses the DRI2 throttle extension to give the 376511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * driver the opportunity to throttle on flush front, copysubbuffer 377511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * and swapbuffers. 378511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom */ 379511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstromstatic void 380511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstromdri2Throttle(struct dri2_screen *psc, 381511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom struct dri2_drawable *draw, 382511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom enum __DRI2throttleReason reason) 383511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom{ 384511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom if (psc->throttle) { 385511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom struct glx_context *gc = __glXGetCurrentContext(); 386511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom struct dri2_context *dri2Ctx = (struct dri2_context *)gc; 387511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __DRIcontext *ctx = 388511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom (dri2Ctx) ? dri2Ctx->driContext : NULL; 389511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 390511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom psc->throttle->throttle(ctx, draw->driDrawable, reason); 391511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom } 392511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom} 393511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 3940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 395511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom__dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, 396511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom int width, int height, 397511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom enum __DRI2throttleReason reason) 3984830809524b20e517e949151957512b14d7e679aKristian Høgsberg{ 399a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 4009e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; 4010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 4020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 4034830809524b20e517e949151957512b14d7e679aKristian Høgsberg 4040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 4050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_back) 4060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 40763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = x; 4090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = priv->height - y - height; 4100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = width; 4110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = height; 4124830809524b20e517e949151957512b14d7e679aKristian Høgsberg 41365562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 4149e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->f) 415271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->f->flush) (priv->driDrawable); 41665562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 41765562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 418511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom dri2Throttle(psc, priv, reason); 419511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 4209e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg region = XFixesCreateRegion(psc->base.dpy, &xrect, 1); 4219e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region, 4220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferBackLeft); 4235ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 4240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Refresh the fake front (if present) after we just damaged the real 4250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * front. 4260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 427bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer if (priv->have_fake_front) 428bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region, 429bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 430bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer 4319e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 4324830809524b20e517e949151957512b14d7e679aKristian Høgsberg} 4334830809524b20e517e949151957512b14d7e679aKristian Høgsberg 4340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 435511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstromdri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, 436511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom int width, int height) 437511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom{ 438511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __dri2CopySubBuffer(pdraw, x, y, width, height, 439511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __DRI2_THROTTLE_COPYSUBBUFFER); 440511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom} 441511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 442511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 443511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstromstatic void 444a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergdri2_copy_drawable(struct dri2_drawable *priv, int dest, int src) 44563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 4460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 4470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 4489e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 44963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 4510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 4520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 4530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 45463b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 45565562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 456308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg if (psc->f) 457271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->f->flush) (priv->driDrawable); 45865562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 45965562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 4609e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg region = XFixesCreateRegion(psc->base.dpy, &xrect, 1); 4619e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, priv->base.xDrawable, region, dest, src); 4629e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 463308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 46463b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 46563b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 467c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2_wait_x(struct glx_context *gc) 46863b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 4697b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) 470eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); 47163b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4727b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg if (priv == NULL || !priv->have_fake_front) 4730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 47463b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 475308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 476308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg} 47763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 478308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergstatic void 479c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2_wait_gl(struct glx_context *gc) 480308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg{ 4817b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) 482eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); 48365562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 4847b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg if (priv == NULL || !priv->have_fake_front) 485308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg return; 486308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 487308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 48863b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 48963b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 49161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) 49282634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick{ 493e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul struct glx_display *priv; 494e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul struct dri2_display *pdp; 495e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul struct glx_context *gc; 496a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 497511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom struct dri2_screen *psc; 498e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul 4993d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin if (!pdraw) 5003d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin return; 5013d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin 5023d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin if (!pdraw->base.psc) 5033d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin return; 5043d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin 505511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom psc = (struct dri2_screen *) pdraw->base.psc; 506511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 507511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom priv = __glXInitialize(psc->base.dpy); 508e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul pdp = (struct dri2_display *) priv->dri2Display; 509e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul gc = __glXGetCurrentContext(); 5104cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 511511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom dri2Throttle(psc, pdraw, __DRI2_THROTTLE_FLUSHFRONT); 512511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 5134cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 5144cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 5159da1c9da139327132dea57b18048a4eb386b6badKristian Høgsberg dri2InvalidateBuffers(priv->dpy, pdraw->base.xDrawable); 5164cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 5179a12a3925a82475fd8f01ba53987581d30dd1128Eric Anholt dri2_wait_gl(gc); 51882634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick} 51982634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 52082634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 5210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 52266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2DestroyScreen(struct glx_screen *base) 523e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 524f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 525f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 5260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Free the direct rendering per screen data */ 52770887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->core->destroyScreen) (psc->driScreen); 528bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg driDestroyConfigs(psc->driver_configs); 5290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf close(psc->fd); 530f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 531e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 532e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 533dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick/** 534dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Process list of buffer received from the server 535dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * 536dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Processes the list of buffers received in a reply from the server to either 537dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat. 538dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick */ 539dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic void 540a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergprocess_buffers(struct dri2_drawable * pdraw, DRI2Buffer * buffers, 5410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned count) 542e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 5430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 5440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = count; 5460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 0; 5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 0; 5480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* This assumes the DRI2 buffer attachment tokens matches the 5500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * __DRIbuffer tokens. */ 5510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; i < count; i++) { 5520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].attachment = buffers[i].attachment; 5530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].name = buffers[i].name; 5540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].pitch = buffers[i].pitch; 5550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].cpp = buffers[i].cpp; 5560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].flags = buffers[i].flags; 5570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) 5580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 1; 5590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) 5600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 1; 5610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 56277c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 563dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 564dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 565a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieriunsigned dri2GetSwapEventType(Display* dpy, XID drawable) 566a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri{ 567a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri struct glx_display *glx_dpy = __glXInitialize(dpy); 568a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri __GLXDRIdrawable *pdraw; 569a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, drawable); 570a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri if (!pdraw || !(pdraw->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) 571a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri return 0; 572a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri return glx_dpy->codes->first_event + GLX_BufferSwapComplete; 573a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri} 574a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri 575daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int64_t 576daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 577daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder) 578a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes{ 579a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 580c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = __glXInitialize(priv->base.psc->dpy); 5819e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 582a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = 583a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg (struct dri2_display *)dpyPriv->dri2Display; 584db011c8141d7b01b67f2ded4e634657b92ed707aCarl Worth CARD64 ret = 0; 585a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 586d8c443ddde5e9734d60b63b3ec3b5a5ba756d022Michel Dänzer /* Check we have the right attachments */ 587d8c443ddde5e9734d60b63b3ec3b5a5ba756d022Michel Dänzer if (!priv->have_back) 588d8c443ddde5e9734d60b63b3ec3b5a5ba756d022Michel Dänzer return ret; 589d8c443ddde5e9734d60b63b3ec3b5a5ba756d022Michel Dänzer 5904a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg /* Old servers can't handle swapbuffers */ 5914a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg if (!pdp->swapAvailable) { 592511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height, 593511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __DRI2_THROTTLE_SWAPBUFFER); 5944a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg } else { 5954a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg#ifdef X_DRI2SwapBuffers 596a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#ifdef __DRI2_FLUSH 59774cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt if (psc->f) { 59874cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt struct glx_context *gc = __glXGetCurrentContext(); 59974cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt 60074cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt if (gc) { 60174cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt (*psc->f->flush)(priv->driDrawable); 60274cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt } 60374cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt } 604a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#endif 605a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 606511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom dri2Throttle(psc, priv, __DRI2_THROTTLE_SWAPBUFFER); 607511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 6084a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg DRI2SwapBuffers(psc->base.dpy, pdraw->xDrawable, 6094a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg target_msc, divisor, remainder, &ret); 6104a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg#endif 6114a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg } 6124a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg 6134cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 6144cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 6159da1c9da139327132dea57b18048a4eb386b6badKristian Høgsberg dri2InvalidateBuffers(dpyPriv->dpy, pdraw->xDrawable); 6164cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 617daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return ret; 618a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes} 619a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 620dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 6210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffers(__DRIdrawable * driDrawable, 6220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 6230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 6240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 625dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 626a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 6270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 628dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 6290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable, 6300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, count, out_count); 6310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 6320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 633dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 6340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 6350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 6360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 637dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 6380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 639dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 6400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 641dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 642dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 643dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 6440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffersWithFormat(__DRIdrawable * driDrawable, 6450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 6460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 6470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 648dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 649a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 6500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 651dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 6520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy, 6530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable, 6540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, 6550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf count, out_count); 6560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 6570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 658dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 6590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 6600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 6610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 662dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 6630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 66477c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 6650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 666e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 667e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 66807c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2SwapInterval 66907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 670089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic int 671efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) 672efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 673a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 67445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 6759e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 67645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 67745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (psc->config) 67870887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->config->configQueryi(psc->driScreen, 6799e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg "vblank_mode", &vblank_mode); 68045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 68145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 68245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 683089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return GLX_BAD_VALUE; 68445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 68545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (interval <= 0) 686089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return GLX_BAD_VALUE; 68745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 68845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 68945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 69045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 691efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 6929e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2SwapInterval(priv->base.psc->dpy, priv->base.xDrawable, interval); 693efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes priv->swap_interval = interval; 694089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg 695089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return 0; 696efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 697efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 6988d0228912bfef173139296a96a097f1a6348c963Kristian Høgsbergstatic int 699efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2GetSwapInterval(__GLXDRIdrawable *pdraw) 700efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 701a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 702efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 703efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes return priv->swap_interval; 704efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 705efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 70607c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2SwapInterval */ 70707c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 708f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergstatic const __DRIdri2LoaderExtension dri2LoaderExtension = { 7090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 7100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 7110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 7120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffersWithFormat, 713dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 714dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 715dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIdri2LoaderExtension dri2LoaderExtension_old = { 7160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 7170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 7180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 7190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL, 720e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 721e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7224258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 7234258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsbergstatic const __DRIuseInvalidateExtension dri2UseInvalidate = { 7244258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION } 725dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 7264258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 727dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 72861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez_X_HIDDEN void 72961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateBuffers(Display *dpy, XID drawable) 73061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{ 7313750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw = 7323750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg dri2GetGlxDrawableFromXDrawableId(dpy, drawable); 733164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt struct dri2_screen *psc; 734271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdp = (struct dri2_drawable *) pdraw; 73561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 736164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt if (!pdraw) 737164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt return; 738164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt 739164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt psc = (struct dri2_screen *) pdraw->psc; 740164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt 74161d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#if __DRI2_FLUSH_VERSION >= 3 742a3e2c8f31f0c5d8d5c1c76e33a572c7be8938573nobled if (pdraw && psc->f && psc->f->base.version >= 3 && psc->f->invalidate) 743271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg psc->f->invalidate(pdp->driDrawable); 74461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#endif 74561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez} 74661d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 747643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 748643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_bind_tex_image(Display * dpy, 749643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg GLXDrawable drawable, 750643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg int buffer, const int *attrib_list) 751643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 752c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *gc = __glXGetCurrentContext(); 753566373967a6a63b6a9c85a2392bc827ac7ef679fEric Anholt struct dri2_context *pcp = (struct dri2_context *) gc; 754eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); 755c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = __glXInitialize(dpy); 756271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdraw = (struct dri2_drawable *) base; 757271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_display *pdp = 758271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (struct dri2_display *) dpyPriv->dri2Display; 7592542d8e0c2ec3eb4de266c0b2ad93dba918cb89cKristian Høgsberg struct dri2_screen *psc; 760643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 761643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg if (pdraw != NULL) { 7622542d8e0c2ec3eb4de266c0b2ad93dba918cb89cKristian Høgsberg psc = (struct dri2_screen *) base->psc; 763ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 764ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#if __DRI2_FLUSH_VERSION >= 3 765a3e2c8f31f0c5d8d5c1c76e33a572c7be8938573nobled if (!pdp->invalidateAvailable && psc->f && 766a3e2c8f31f0c5d8d5c1c76e33a572c7be8938573nobled psc->f->base.version >= 3 && psc->f->invalidate) 7679e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f->invalidate(pdraw->driDrawable); 768ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#endif 769ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 7709e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->texBuffer->base.version >= 2 && 7719e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->texBuffer->setTexBuffer2 != NULL) { 772f679640868ae6ef700d8672702c31ba2515220a7Kristian Høgsberg (*psc->texBuffer->setTexBuffer2) (pcp->driContext, 773271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureTarget, 774271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureFormat, 7759e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->driDrawable); 776643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 777643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg else { 778f679640868ae6ef700d8672702c31ba2515220a7Kristian Høgsberg (*psc->texBuffer->setTexBuffer) (pcp->driContext, 779271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureTarget, 7809e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->driDrawable); 781643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 782643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 783643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 784643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 785643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 786643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) 787643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 788e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao#if __DRI_TEX_BUFFER_VERSION >= 3 789e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct glx_context *gc = __glXGetCurrentContext(); 790e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct dri2_context *pcp = (struct dri2_context *) gc; 791e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); 792e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct glx_display *dpyPriv = __glXInitialize(dpy); 793e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct dri2_drawable *pdraw = (struct dri2_drawable *) base; 794e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct dri2_display *pdp = 795e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao (struct dri2_display *) dpyPriv->dri2Display; 796e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct dri2_screen *psc; 797e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao 798e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao if (pdraw != NULL) { 799e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao psc = (struct dri2_screen *) base->psc; 800e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao 801e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao if (psc->texBuffer->base.version >= 3 && 802e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao psc->texBuffer->releaseTexBuffer != NULL) { 803e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao (*psc->texBuffer->releaseTexBuffer) (pcp->driContext, 804e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao pdraw->base.textureTarget, 805e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao pdraw->driDrawable); 806e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao } 807e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao } 808e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao#endif 809643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 810643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 811643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic const struct glx_context_vtable dri2_context_vtable = { 812c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg dri2_destroy_context, 813c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg dri2_bind_context, 814c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg dri2_unbind_context, 8157b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg dri2_wait_gl, 8167b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg dri2_wait_x, 8177b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg DRI_glXUseXFont, 818643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_bind_tex_image, 819643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_release_tex_image, 820559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston NULL, /* get_proc_address */ 821643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}; 822643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 8239e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsbergstatic void 8249e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsbergdri2BindExtensions(struct dri2_screen *psc, const __DRIextension **extensions) 8259e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg{ 8269e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg int i; 8279e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 8289e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); 8299e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control"); 8309e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control"); 831a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read"); 8329e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 8339e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg /* FIXME: if DRI2 version supports it... */ 8349e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "INTEL_swap_event"); 8359e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 8369e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg for (i = 0; extensions[i]; i++) { 8379e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) { 8389e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->texBuffer = (__DRItexBufferExtension *) extensions[i]; 8399e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap"); 8409e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 8419e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 8429e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) { 8439e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f = (__DRI2flushExtension *) extensions[i]; 8449e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg /* internal driver extension, no GL extension exposed */ 8459e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 8469e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 8479e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0)) 8489e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->config = (__DRI2configQueryExtension *) extensions[i]; 849511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 850511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom if (((strcmp(extensions[i]->name, __DRI2_THROTTLE) == 0))) 851511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom psc->throttle = (__DRI2throttleExtension *) extensions[i]; 8529e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 8539e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg} 8549e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 8556ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsbergstatic const struct glx_screen_vtable dri2_screen_vtable = { 8566ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg dri2_create_context 8576ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg}; 8589e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 85966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergstatic struct glx_screen * 860c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2CreateScreen(int screen, struct glx_display * priv) 861e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 8620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIconfig **driver_configs; 8630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIextension **extensions; 864a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg const struct dri2_display *const pdp = (struct dri2_display *) 865dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick priv->dri2Display; 866f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc; 8670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIscreen *psp; 8680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf char *driverName, *deviceName; 8690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drm_magic_t magic; 8700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 8710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 872f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = Xmalloc(sizeof *psc); 873f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL) 8740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 8750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 876f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg memset(psc, 0, sizeof *psc); 8777d9e0ea7393c14cbf2d58364726951b14e0d4fc7Henri Verbeet psc->fd = -1; 8787d9e0ea7393c14cbf2d58364726951b14e0d4fc7Henri Verbeet 879bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (!glx_screen_init(&psc->base, screen, priv)) { 880bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet Xfree(psc); 881bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet return NULL; 882bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet } 883f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 884f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen), 88581cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes &driverName, &deviceName)) { 886bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_screen_cleanup(&psc->base); 887f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg XFree(psc); 88845e0a7a51d88c397a27317d22b325ec31b3e2e99Andrew Deason InfoMessageF("screen %d does not appear to be DRI2 capable\n", screen); 8890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 89081cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes } 8910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 8920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver = driOpenDriver(driverName); 8930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->driver == NULL) { 8940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver pointer missing\n"); 8950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 8960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 8970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 8980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); 8990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (extensions == NULL) { 9000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); 9010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 9020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 9030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; extensions[i]; i++) { 9050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_CORE) == 0) 906daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->core = (__DRIcoreExtension *) extensions[i]; 9070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_DRI2) == 0) 908daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->dri2 = (__DRIdri2Extension *) extensions[i]; 9090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 9100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->core == NULL || psc->dri2 == NULL) { 9120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("core dri or dri2 extension not found\n"); 9130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 9140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 9150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->fd = open(deviceName, O_RDWR); 9170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->fd < 0) { 9180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to open drm device: %s\n", strerror(errno)); 91981cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 9200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 9210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (drmGetMagic(psc->fd, &magic)) { 9230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to get magic\n"); 92481cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 9250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 9260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 927f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!DRI2Authenticate(priv->dpy, RootWindow(priv->dpy, screen), magic)) { 9280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to authenticate magic %d\n", magic); 92981cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 9300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 9310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9324258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 9330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* If the server does not support the protocol for 9340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * DRI2GetBuffersWithFormat, don't supply that interface to the driver. 9350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 93670887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->driScreen = 9374258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg psc->dri2->createNewScreen(screen, psc->fd, 9384258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg (const __DRIextension **) 9394258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg &pdp->loader_extensions[0], 940daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes &driver_configs, psc); 9410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 94270887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg if (psc->driScreen == NULL) { 9430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to create dri screen\n"); 94481cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 9450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 9460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 94770887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg extensions = psc->core->getExtensions(psc->driScreen); 9489e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg dri2BindExtensions(psc, extensions); 9490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 950f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.configs = 951f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg driConvertConfigs(psc->core, psc->base.configs, driver_configs); 952f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.visuals = 953f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg driConvertConfigs(psc->core, psc->base.visuals, driver_configs); 9540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 955bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg psc->driver_configs = driver_configs; 9560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9576ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg psc->base.vtable = &dri2_screen_vtable; 95870887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psp = &psc->vtable; 959f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.driScreen = psp; 9600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->destroyScreen = dri2DestroyScreen; 9610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createDrawable = dri2CreateDrawable; 9620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->swapBuffers = dri2SwapBuffers; 96301923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getDrawableMSC = NULL; 96401923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForMSC = NULL; 96501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForSBC = NULL; 96601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->setSwapInterval = NULL; 96701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getSwapInterval = NULL; 96801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell 9691cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes if (pdp->driMinor >= 2) { 97001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2GetMSC 9711cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getDrawableMSC = dri2DrawableGetMSC; 97201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 97301923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2WaitMSC 9741cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForMSC = dri2WaitForMSC; 9751cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForSBC = dri2WaitForSBC; 97601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 97701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapInterval 9781cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->setSwapInterval = dri2SetSwapInterval; 9791cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getSwapInterval = dri2GetSwapInterval; 98001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 9811ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#if defined(X_DRI2GetMSC) && defined(X_DRI2WaitMSC) && defined(X_DRI2SwapInterval) 982f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); 9831ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#endif 9841cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes } 9850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always 9870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * available.*/ 9880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->copySubBuffer = dri2CopySubBuffer; 989f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); 9900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 9920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 9930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 994f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return &psc->base; 995e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 996daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barneshandle_error: 9977d9e0ea7393c14cbf2d58364726951b14e0d4fc7Henri Verbeet if (psc->fd >= 0) 998bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet close(psc->fd); 999bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->driver) 1000bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet dlclose(psc->driver); 10010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 10020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 1003bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_screen_cleanup(&psc->base); 1004f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg XFree(psc); 1005e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 10060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1007e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 1008e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1009e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* Called from __glXFreeDisplayPrivate. 1010e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 10110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 10120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDisplay(__GLXDRIdisplay * dpy) 1013e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1014a75de67c51e9124a7c3846b4110552ea28c60349Henri Verbeet struct dri2_display *pdp = (struct dri2_display *) dpy; 1015a75de67c51e9124a7c3846b4110552ea28c60349Henri Verbeet 1016a75de67c51e9124a7c3846b4110552ea28c60349Henri Verbeet __glxHashDestroy(pdp->dri2Hash); 10170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(dpy); 1018e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 1019e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 10203750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg_X_HIDDEN __GLXDRIdrawable * 10213750ebd540510324ef5ada769537ae05309adadbKristian Høgsbergdri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id) 10223750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg{ 1023c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *d = __glXInitialize(dpy); 1024a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = (struct dri2_display *) d->dri2Display; 10253750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw; 10263750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 10273750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashLookup(pdp->dri2Hash, id, (void *) &pdraw) == 0) 10283750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return pdraw; 10293750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 10303750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 10313750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg} 10323750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 1033e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* 1034e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Allocate, initialize and return a __DRIdisplayPrivate object. 1035e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * This is called from __glXInitialize() when we are given a new 1036e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * display pointer. 1037e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 10380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay * 10390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDisplay(Display * dpy) 1040e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1041a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 10424258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg int eventBase, errorBase, i; 1043e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 10440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) 10450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1046e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 10470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp = Xmalloc(sizeof *pdp); 10480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdp == NULL) 10490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1050e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 10510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) { 10520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdp); 10530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 10540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1055e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 10560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->driPatch = 0; 105761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->swapAvailable = (pdp->driMinor >= 2); 105861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->invalidateAvailable = (pdp->driMinor >= 3); 1059e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 10600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.destroyDisplay = dri2DestroyDisplay; 10610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.createScreen = dri2CreateScreen; 1062e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 10634258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg i = 0; 10644258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg if (pdp->driMinor < 1) 10654258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base; 10664258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg else 10674258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension.base; 10684258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 10694258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &systemTimeExtension.base; 10704258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 10714258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 10724cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg pdp->loader_extensions[i++] = &dri2UseInvalidate.base; 10734258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 1074c8f407bcec7619eb2030ea9fe52501ad33075699Kristian Høgsberg pdp->loader_extensions[i++] = NULL; 10754258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 10763750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg pdp->dri2Hash = __glxHashCreate(); 10773750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (pdp->dri2Hash == NULL) { 10783750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdp); 10793750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 10803750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 10813750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 10820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdp->base; 1083e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 1084e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1085e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif /* GLX_DIRECT_RENDERING */ 1086