dri2_glx.c revision e6280c3ba9579bf01f8b82e19497ba8f142a8d09
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 123c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg if (context->extensions) 124c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg XFree((char *) context->extensions); 125c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg 126f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyContext) (pcp->driContext); 127e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 129e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 130e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool 132c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsbergdri2_bind_context(struct glx_context *context, struct glx_context *old, 133c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg GLXDrawable draw, GLXDrawable read) 134e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 135a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 13631819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; 137c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg struct dri2_drawable *pdraw, *pread; 13886a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg struct dri2_display *pdp; 139e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 140c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg pdraw = (struct dri2_drawable *) driFetchDrawable(context, draw); 141c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg pread = (struct dri2_drawable *) driFetchDrawable(context, read); 142c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg 143bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin driReleaseDrawables(&pcp->base); 144bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin 145c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg if (pdraw == NULL || pread == NULL) 146c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg return GLXBadDrawable; 147c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg 14886a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg if (!(*psc->core->bindContext) (pcp->driContext, 14986a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg pdraw->driDrawable, pread->driDrawable)) 15086a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg return GLXBadContext; 15186a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg 15286a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg /* If the server doesn't send invalidate events, we may miss a 15386a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg * resize before the rendering starts. Invalidate the buffers now 15486a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg * so the driver will recheck before rendering starts. */ 15586a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg pdp = (struct dri2_display *) psc->base.display; 15686a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg if (!pdp->invalidateAvailable) { 15786a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg dri2InvalidateBuffers(psc->base.dpy, pdraw->base.xDrawable); 15886a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg if (pread != pdraw) 15986a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg dri2InvalidateBuffers(psc->base.dpy, pread->base.xDrawable); 16086a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg } 161c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg 16286a1938aa56c02d7da137b09e579d24d7da50d9eKristian Høgsberg return Success; 163e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 164e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 166c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsbergdri2_unbind_context(struct glx_context *context, struct glx_context *new) 167e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 168a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp = (struct dri2_context *) context; 16931819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; 170e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 171f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->unbindContext) (pcp->driContext); 172e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 173e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 174c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic struct glx_context * 17566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2_create_context(struct glx_screen *base, 1766ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg struct glx_config *config_base, 177c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *shareList, int renderType) 178e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 179a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_context *pcp, *pcp_shared; 180f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 1816ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; 1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __DRIcontext *shared = NULL; 1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (shareList) { 185c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick /* If the shareList context is not a DRI2 context, we cannot possibly 186c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick * create a DRI2 context that shares it. 187c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick */ 188c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick if (shareList->vtable->destroy != dri2_destroy_context) { 189c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick return NULL; 190c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick } 191c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick 192af6a2aede696ad3c45798d6c28aa04e8f5035e6eEric Anholt pcp_shared = (struct dri2_context *) shareList; 1930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf shared = pcp_shared->driContext; 1940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp = Xmalloc(sizeof *pcp); 1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp == NULL) 1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 20031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg memset(pcp, 0, sizeof *pcp); 2016ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg if (!glx_context_init(&pcp->base, &psc->base, &config->base)) { 20231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg Xfree(pcp); 20331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg return NULL; 20431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg } 20531819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg 2060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pcp->driContext = 20770887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->dri2->createNewContext) (psc->driScreen, 2080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, shared, pcp); 2090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pcp->driContext == NULL) { 2110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pcp); 2120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 2130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 2140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 21531819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg pcp->base.vtable = &dri2_context_vtable; 2160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pcp->base; 218e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 219e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 22048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanickstatic struct glx_context * 22148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanickdri2_create_context_attribs(struct glx_screen *base, 22248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick struct glx_config *config_base, 22348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick struct glx_context *shareList, 22448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick unsigned num_attribs, 22548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick const uint32_t *attribs, 22648ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick unsigned *error) 22748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick{ 22848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick struct dri2_context *pcp = NULL; 22948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick struct dri2_context *pcp_shared = NULL; 23048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick struct dri2_screen *psc = (struct dri2_screen *) base; 23148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; 23248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick __DRIcontext *shared = NULL; 23348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 23448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick uint32_t minor_ver = 1; 23548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick uint32_t major_ver = 2; 23648ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick uint32_t flags = 0; 23748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick unsigned api; 23848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick uint32_t ctx_attribs[2 * 4]; 23948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick unsigned num_ctx_attribs = 0; 24048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 24148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (psc->dri2->base.version < 3) { 24248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 24348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick goto error_exit; 24448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick } 24548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 24648ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick /* Remap the GLX tokens to DRI2 tokens. 24748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick */ 24848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (!dri2_convert_glx_attribs(num_attribs, attribs, 24948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick &major_ver, &minor_ver, &flags, &api, error)) 25048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick goto error_exit; 25148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 25248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (shareList) { 25348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick pcp_shared = (struct dri2_context *) shareList; 25448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick shared = pcp_shared->driContext; 25548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick } 25648ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 25748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick pcp = Xmalloc(sizeof *pcp); 25848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (pcp == NULL) { 25948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 26048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick goto error_exit; 26148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick } 26248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 26348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick memset(pcp, 0, sizeof *pcp); 26448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (!glx_context_init(&pcp->base, &psc->base, &config->base)) 26548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick goto error_exit; 26648ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 26748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION; 26848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick ctx_attribs[num_ctx_attribs++] = major_ver; 26948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MINOR_VERSION; 27048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick ctx_attribs[num_ctx_attribs++] = minor_ver; 27148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 27248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (flags != 0) { 27348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_FLAGS; 27448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 27548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick /* The current __DRI_CTX_FLAG_* values are identical to the 27648ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick * GLX_CONTEXT_*_BIT values. 27748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick */ 27848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick ctx_attribs[num_ctx_attribs++] = flags; 27948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick } 28048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 28148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick pcp->driContext = 28248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick (*psc->dri2->createContextAttribs) (psc->driScreen, 28348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick api, 28448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick config->driConfig, 28548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick shared, 28648ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick num_ctx_attribs / 2, 28748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick ctx_attribs, 28848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick error, 28948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick pcp); 29048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 29148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (pcp->driContext == NULL) 29248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick goto error_exit; 29348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 29448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick pcp->base.vtable = &dri2_context_vtable; 29548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 29648ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick return &pcp->base; 29748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 29848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanickerror_exit: 29948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (pcp != NULL) 30048ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick Xfree(pcp); 30148ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 30248ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick return NULL; 30348ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick} 30448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 3050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 306271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsbergdri2DestroyDrawable(__GLXDRIdrawable *base) 307e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 308271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base->psc; 309271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdraw = (struct dri2_drawable *) base; 310c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = psc->base.display; 311037755122e9011c768e5caa4d4cb83aba783d3e9Kristian Høgsberg struct dri2_display *pdp = (struct dri2_display *)dpyPriv->dri2Display; 3123750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 313271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg __glxHashDelete(pdp->dri2Hash, pdraw->base.xDrawable); 314f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg (*psc->core->destroyDrawable) (pdraw->driDrawable); 3154ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg 3164ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg /* If it's a GLX 1.3 drawables, we can destroy the DRI2 drawable 3174ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * now, as the application explicitly asked to destroy the GLX 3184ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * drawable. Otherwise, for legacy drawables, we let the DRI2 3194ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * drawable linger on the server, since there's no good way of 3204ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * knowing when the application is done with it. The server will 3214ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * destroy the DRI2 drawable when it destroys the X drawable or the 3224ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg * client exits anyway. */ 3234ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg if (pdraw->base.xDrawable != pdraw->base.drawable) 3244ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, pdraw->base.xDrawable); 3254ebf07a426771b62123e5fcb5a8be0de24037af1Kristian Høgsberg 3260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 327e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 328e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 3290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIdrawable * 33066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2CreateDrawable(struct glx_screen *base, XID xDrawable, 3316ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLXDrawable drawable, struct glx_config *config_base) 332e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 333a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw; 334f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 3356ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; 336c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv; 337a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 33845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 339e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 3400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw = Xmalloc(sizeof(*pdraw)); 3410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pdraw) 3420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 343e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 3446393a33944ec9983426cecd5f6c9f05ac089e1aeKristian Høgsberg memset(pdraw, 0, sizeof *pdraw); 3450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.destroyDrawable = dri2DestroyDrawable; 3460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable = xDrawable; 3470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.drawable = drawable; 348f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg pdraw->base.psc = &psc->base; 3490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = 0; 35045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; /* default may be overridden below */ 351d20fce057ee94fc3441c01a9e54cb5e19f7ddfd3Pierre Willenbrock pdraw->have_back = 0; 35245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 3539e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->config) 35470887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->config->configQueryi(psc->driScreen, 3559e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg "vblank_mode", &vblank_mode); 35645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 35745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 35845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 35945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_0: 36045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 0; 36145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 36245e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_DEF_INTERVAL_1: 36345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 36445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 36545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes pdraw->swap_interval = 1; 36645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 36745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 368e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 369f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2CreateDrawable(psc->base.dpy, xDrawable); 370e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 371f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg dpyPriv = __glXInitialize(psc->base.dpy); 372a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg pdp = (struct dri2_display *)dpyPriv->dri2Display;; 3730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Create a new drawable */ 374271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->driDrawable = 37570887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->dri2->createNewDrawable) (psc->driScreen, 3760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf config->driConfig, pdraw); 377f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 378271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg if (!pdraw->driDrawable) { 379f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, xDrawable); 3800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdraw); 3810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 3820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 383e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 3843750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashInsert(pdp->dri2Hash, xDrawable, pdraw)) { 385271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->core->destroyDrawable) (pdraw->driDrawable); 386f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2DestroyDrawable(psc->base.dpy, xDrawable); 3873750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdraw); 3883750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return None; 3893750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 3903750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 3913750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 392c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#ifdef X_DRI2SwapInterval 393385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes /* 394385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * Make sure server has the same swap interval we do for the new 395385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes * drawable. 396385e2896ebf54ac0b016132fe513f21a5b67ba4fJesse Barnes */ 3970a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes if (pdp->swapAvailable) 398f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg DRI2SwapInterval(psc->base.dpy, xDrawable, pdraw->swap_interval); 399c37e275e778e8c944e3dfad159b1eb94c601af60Michel Dänzer#endif 4000a18cdb0ed2f4b747688f653d9947d174fae77ffJesse Barnes 4010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdraw->base; 402f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg} 403f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg 40407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2GetMSC 40507c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 406daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 40766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2DrawableGetMSC(struct glx_screen *psc, __GLXDRIdrawable *pdraw, 408daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *ust, int64_t *msc, int64_t *sbc) 409daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 4108d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 4118d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 4128d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 4138d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2GetMSC(psc->dpy, pdraw->xDrawable, 4148d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg &dri2_ust, &dri2_msc, &dri2_sbc); 4158d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 4168d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 4178d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 4188d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 4198d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 420daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 421daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 42207c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif 42307c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 42407c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 42507c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2WaitMSC 42607c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 427daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 428daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 429daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) 430daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 4318d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 4328d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 4338d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 4348d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2WaitMSC(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, 4358d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg remainder, &dri2_ust, &dri2_msc, &dri2_sbc); 4368d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 4378d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 4388d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 4398d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 4408d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 441daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 442daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 443daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int 444daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, 445daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t *msc, int64_t *sbc) 446daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes{ 4478d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg CARD64 dri2_ust, dri2_msc, dri2_sbc; 4488d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg int ret; 4498d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 4508d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg ret = DRI2WaitSBC(pdraw->psc->dpy, pdraw->xDrawable, 4518d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg target_sbc, &dri2_ust, &dri2_msc, &dri2_sbc); 4528d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *ust = dri2_ust; 4538d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *msc = dri2_msc; 4548d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg *sbc = dri2_sbc; 4558d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg 4568d0228912bfef173139296a96a097f1a6348c963Kristian Høgsberg return ret; 457daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 458daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 45907c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2WaitMSC */ 46007c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 461511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom/** 462511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * dri2Throttle - Request driver throttling 463511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * 464511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * This function uses the DRI2 throttle extension to give the 465511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * driver the opportunity to throttle on flush front, copysubbuffer 466511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom * and swapbuffers. 467511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom */ 468511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstromstatic void 469511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstromdri2Throttle(struct dri2_screen *psc, 470511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom struct dri2_drawable *draw, 471511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom enum __DRI2throttleReason reason) 472511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom{ 473511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom if (psc->throttle) { 474511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom struct glx_context *gc = __glXGetCurrentContext(); 475511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom struct dri2_context *dri2Ctx = (struct dri2_context *)gc; 476511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __DRIcontext *ctx = 477511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom (dri2Ctx) ? dri2Ctx->driContext : NULL; 478511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 479511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom psc->throttle->throttle(ctx, draw->driDrawable, reason); 480511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom } 481511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom} 482511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 4830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 484511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom__dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, 485511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom int width, int height, 486511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom enum __DRI2throttleReason reason) 4874830809524b20e517e949151957512b14d7e679aKristian Høgsberg{ 488a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 4899e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; 4900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 4910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 4924830809524b20e517e949151957512b14d7e679aKristian Høgsberg 4930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Check we have the right attachments */ 4940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!priv->have_back) 4950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 49663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 4970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = x; 4980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = priv->height - y - height; 4990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = width; 5000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = height; 5014830809524b20e517e949151957512b14d7e679aKristian Høgsberg 50265562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 5039e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->f) 504271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->f->flush) (priv->driDrawable); 50565562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 50665562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 507511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom dri2Throttle(psc, priv, reason); 508511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 5099e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg region = XFixesCreateRegion(psc->base.dpy, &xrect, 1); 5109e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region, 5110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2BufferFrontLeft, DRI2BufferBackLeft); 5125ca800e1006555ea1c5dcbbc56c35838c9f04994Eric Anholt 5130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Refresh the fake front (if present) after we just damaged the real 5140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * front. 5150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 516bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer if (priv->have_fake_front) 517bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region, 518bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 519bd3d2724f51a44b7fc814a5bc43d8ddafa8e3cbaMichel Dänzer 5209e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 5214830809524b20e517e949151957512b14d7e679aKristian Høgsberg} 5224830809524b20e517e949151957512b14d7e679aKristian Høgsberg 5230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 524511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstromdri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y, 525511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom int width, int height) 526511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom{ 527511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __dri2CopySubBuffer(pdraw, x, y, width, height, 528511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __DRI2_THROTTLE_COPYSUBBUFFER); 529511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom} 530511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 531511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 532511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstromstatic void 533a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergdri2_copy_drawable(struct dri2_drawable *priv, int dest, int src) 53463b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 5350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XRectangle xrect; 5360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf XserverRegion region; 5379e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 53863b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 5390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.x = 0; 5400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.y = 0; 5410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.width = priv->width; 5420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xrect.height = priv->height; 54363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 54465562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#ifdef __DRI2_FLUSH 545308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg if (psc->f) 546271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (*psc->f->flush) (priv->driDrawable); 54765562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane#endif 54865562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 5499e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg region = XFixesCreateRegion(psc->base.dpy, &xrect, 1); 5509e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2CopyRegion(psc->base.dpy, priv->base.xDrawable, region, dest, src); 5519e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg XFixesDestroyRegion(psc->base.dpy, region); 552308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 55363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 55463b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 5550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 556c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2_wait_x(struct glx_context *gc) 55763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane{ 5587b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) 559eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); 56063b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 5617b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg if (priv == NULL || !priv->have_fake_front) 5620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 56363b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 564308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft); 565308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg} 56663b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 567308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsbergstatic void 568c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2_wait_gl(struct glx_context *gc) 569308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg{ 5707b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) 571eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); 57265562453fba69e862d5e3b381d18db9c40d9353cAlan Hourihane 5737b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg if (priv == NULL || !priv->have_fake_front) 574308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg return; 575308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg 576308e13ecd12a2fd894e5b509d5756bffc2035ec6Kristian Høgsberg dri2_copy_drawable(priv, DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft); 57763b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane} 57863b51b5cf17ddde09b72a2811296f37b9a4c5ad2Alan Hourihane 5790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 58061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) 58182634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick{ 582e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul struct glx_display *priv; 583e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul struct dri2_display *pdp; 584e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul struct glx_context *gc; 585a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 586511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom struct dri2_screen *psc; 587e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul 5883d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin if (!pdraw) 5893d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin return; 5903d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin 5913d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin if (!pdraw->base.psc) 5923d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin return; 5933d3ecb8520ccca0863026a94e7fda9840aff6c0aStéphane Marchesin 594511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom psc = (struct dri2_screen *) pdraw->base.psc; 595511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 596511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom priv = __glXInitialize(psc->base.dpy); 597e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul pdp = (struct dri2_display *) priv->dri2Display; 598e0496b63ff0d41a36812b78e9062e92590fcdd55Brian Paul gc = __glXGetCurrentContext(); 5994cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 600511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom dri2Throttle(psc, pdraw, __DRI2_THROTTLE_FLUSHFRONT); 601511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 6024cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 6034cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 6049da1c9da139327132dea57b18048a4eb386b6badKristian Høgsberg dri2InvalidateBuffers(priv->dpy, pdraw->base.xDrawable); 6054cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 6069a12a3925a82475fd8f01ba53987581d30dd1128Eric Anholt dri2_wait_gl(gc); 60782634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick} 60882634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 60982634ee8df7328b9235abd8352d33b0b3d953600Ian Romanick 6100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 61166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdri2DestroyScreen(struct glx_screen *base) 612e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 613f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) base; 614f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 6150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Free the direct rendering per screen data */ 61670887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg (*psc->core->destroyScreen) (psc->driScreen); 617bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg driDestroyConfigs(psc->driver_configs); 6180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf close(psc->fd); 619f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 620e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 621e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 622dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick/** 623dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Process list of buffer received from the server 624dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * 625dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * Processes the list of buffers received in a reply from the server to either 626dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat. 627dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick */ 628dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic void 629a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergprocess_buffers(struct dri2_drawable * pdraw, DRI2Buffer * buffers, 6300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned count) 631e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 6320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 6330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->bufferCount = count; 6350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 0; 6360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 0; 6370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* This assumes the DRI2 buffer attachment tokens matches the 6390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * __DRIbuffer tokens. */ 6400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; i < count; i++) { 6410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].attachment = buffers[i].attachment; 6420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].name = buffers[i].name; 6430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].pitch = buffers[i].pitch; 6440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].cpp = buffers[i].cpp; 6450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->buffers[i].flags = buffers[i].flags; 6460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) 6470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_fake_front = 1; 6480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) 6490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->have_back = 1; 6500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 65177c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 652dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 653dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 654a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieriunsigned dri2GetSwapEventType(Display* dpy, XID drawable) 655a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri{ 656a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri struct glx_display *glx_dpy = __glXInitialize(dpy); 657a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri __GLXDRIdrawable *pdraw; 658a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, drawable); 659a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri if (!pdraw || !(pdraw->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) 660a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri return 0; 661a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri return glx_dpy->codes->first_event + GLX_BufferSwapComplete; 662a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri} 663a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri 664daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int64_t 665daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesdri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, 666daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes int64_t remainder) 667a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes{ 668a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 669c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = __glXInitialize(priv->base.psc->dpy); 6709e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 671a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = 672a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg (struct dri2_display *)dpyPriv->dri2Display; 673db011c8141d7b01b67f2ded4e634657b92ed707aCarl Worth CARD64 ret = 0; 674a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 675d8c443ddde5e9734d60b63b3ec3b5a5ba756d022Michel Dänzer /* Check we have the right attachments */ 676d8c443ddde5e9734d60b63b3ec3b5a5ba756d022Michel Dänzer if (!priv->have_back) 677d8c443ddde5e9734d60b63b3ec3b5a5ba756d022Michel Dänzer return ret; 678d8c443ddde5e9734d60b63b3ec3b5a5ba756d022Michel Dänzer 6794a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg /* Old servers can't handle swapbuffers */ 6804a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg if (!pdp->swapAvailable) { 681511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height, 682511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom __DRI2_THROTTLE_SWAPBUFFER); 6834a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg } else { 6844a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg#ifdef X_DRI2SwapBuffers 685a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#ifdef __DRI2_FLUSH 68674cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt if (psc->f) { 68774cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt struct glx_context *gc = __glXGetCurrentContext(); 68874cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt 68974cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt if (gc) { 69074cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt (*psc->f->flush)(priv->driDrawable); 69174cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt } 69274cde6505c233f388e902d1daa0e9f186dd012a9Eric Anholt } 693a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes#endif 694a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 695511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom dri2Throttle(psc, priv, __DRI2_THROTTLE_SWAPBUFFER); 696511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 6974a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg DRI2SwapBuffers(psc->base.dpy, pdraw->xDrawable, 6984a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg target_msc, divisor, remainder, &ret); 6994a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg#endif 7004a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg } 7014a7667b96b7bd7cdffbe929182c15935b74facd2Kristian Høgsberg 7024cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg /* Old servers don't send invalidate events */ 7034cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg if (!pdp->invalidateAvailable) 7049da1c9da139327132dea57b18048a4eb386b6badKristian Høgsberg dri2InvalidateBuffers(dpyPriv->dpy, pdraw->xDrawable); 7054cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg 706daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return ret; 707a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes} 708a35f6bb207efe3c959bbd16a37f2049e5aceeea9Jesse Barnes 709dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 7100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffers(__DRIdrawable * driDrawable, 7110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 7120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 7130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 714dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 715a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 7160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 717dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 7180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable, 7190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, count, out_count); 7200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 7210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 722dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 7230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 7240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 7250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 726dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 7270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 728dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 7290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 730dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick} 731dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 732dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic __DRIbuffer * 7330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2GetBuffersWithFormat(__DRIdrawable * driDrawable, 7340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *width, int *height, 7350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned int *attachments, int count, 7360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int *out_count, void *loaderPrivate) 737dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick{ 738a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *pdraw = loaderPrivate; 7390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf DRI2Buffer *buffers; 740dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 7410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy, 7420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->base.xDrawable, 7430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, attachments, 7440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf count, out_count); 7450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (buffers == NULL) 7460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 747dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 7480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->width = *width; 7490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdraw->height = *height; 7500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf process_buffers(pdraw, buffers, *out_count); 751dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 7520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(buffers); 75377c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg 7540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return pdraw->buffers; 755e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 756e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 75707c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#ifdef X_DRI2SwapInterval 75807c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 759089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic int 760efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) 761efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 762a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 76345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; 7649e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; 76545e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 76645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (psc->config) 76770887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->config->configQueryi(psc->driScreen, 7689e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg "vblank_mode", &vblank_mode); 76945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes 77045e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes switch (vblank_mode) { 77145e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_NEVER: 772089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return GLX_BAD_VALUE; 77345e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes case DRI_CONF_VBLANK_ALWAYS_SYNC: 77445e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes if (interval <= 0) 775089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return GLX_BAD_VALUE; 77645e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 77745e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes default: 77845e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes break; 77945e2b51c853471b79004a954ce3092a253b20b77Jesse Barnes } 780efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 7819e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg DRI2SwapInterval(priv->base.psc->dpy, priv->base.xDrawable, interval); 782efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes priv->swap_interval = interval; 783089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg 784089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg return 0; 785efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 786efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 7878d0228912bfef173139296a96a097f1a6348c963Kristian Høgsbergstatic int 788efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnesdri2GetSwapInterval(__GLXDRIdrawable *pdraw) 789efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 790a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; 791efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 792efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes return priv->swap_interval; 793efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes} 794efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes 79507c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer#endif /* X_DRI2SwapInterval */ 79607c6d94cd7272524ef06b2a787667e5d626137d2Michel Dänzer 797f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsbergstatic const __DRIdri2LoaderExtension dri2LoaderExtension = { 7980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 7990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 8000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 8010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffersWithFormat, 802dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 803dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 804dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanickstatic const __DRIdri2LoaderExtension dri2LoaderExtension_old = { 8050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION}, 8060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2GetBuffers, 8070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf dri2FlushFrontBuffer, 8080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL, 809e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 810e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8114258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 8124258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsbergstatic const __DRIuseInvalidateExtension dri2UseInvalidate = { 8134258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION } 814dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick}; 8154258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 816dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick 81761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez_X_HIDDEN void 81861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezdri2InvalidateBuffers(Display *dpy, XID drawable) 81961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez{ 8203750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw = 8213750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg dri2GetGlxDrawableFromXDrawableId(dpy, drawable); 822164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt struct dri2_screen *psc; 823271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdp = (struct dri2_drawable *) pdraw; 82461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 825164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt if (!pdraw) 826164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt return; 827164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt 828164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt psc = (struct dri2_screen *) pdraw->psc; 829164108e3db5ba09d8e0605f88aa17dab83b68742Eric Anholt 83061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#if __DRI2_FLUSH_VERSION >= 3 831a3e2c8f31f0c5d8d5c1c76e33a572c7be8938573nobled if (pdraw && psc->f && psc->f->base.version >= 3 && psc->f->invalidate) 832271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg psc->f->invalidate(pdp->driDrawable); 83361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#endif 83461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez} 83561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 836643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 837643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_bind_tex_image(Display * dpy, 838643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg GLXDrawable drawable, 839643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg int buffer, const int *attrib_list) 840643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 841c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *gc = __glXGetCurrentContext(); 842566373967a6a63b6a9c85a2392bc827ac7ef679fEric Anholt struct dri2_context *pcp = (struct dri2_context *) gc; 843eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); 844c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *dpyPriv = __glXInitialize(dpy); 845271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_drawable *pdraw = (struct dri2_drawable *) base; 846271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg struct dri2_display *pdp = 847271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg (struct dri2_display *) dpyPriv->dri2Display; 8482542d8e0c2ec3eb4de266c0b2ad93dba918cb89cKristian Høgsberg struct dri2_screen *psc; 849643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 850643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg if (pdraw != NULL) { 8512542d8e0c2ec3eb4de266c0b2ad93dba918cb89cKristian Høgsberg psc = (struct dri2_screen *) base->psc; 852ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 853ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#if __DRI2_FLUSH_VERSION >= 3 854a3e2c8f31f0c5d8d5c1c76e33a572c7be8938573nobled if (!pdp->invalidateAvailable && psc->f && 855a3e2c8f31f0c5d8d5c1c76e33a572c7be8938573nobled psc->f->base.version >= 3 && psc->f->invalidate) 8569e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f->invalidate(pdraw->driDrawable); 857ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg#endif 858ab780bccb737e0dc25a55b5e54faad9c4a790ac0Kristian Høgsberg 8599e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if (psc->texBuffer->base.version >= 2 && 8609e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->texBuffer->setTexBuffer2 != NULL) { 861f679640868ae6ef700d8672702c31ba2515220a7Kristian Høgsberg (*psc->texBuffer->setTexBuffer2) (pcp->driContext, 862271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureTarget, 863271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureFormat, 8649e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->driDrawable); 865643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 866643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg else { 867f679640868ae6ef700d8672702c31ba2515220a7Kristian Høgsberg (*psc->texBuffer->setTexBuffer) (pcp->driContext, 868271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg pdraw->base.textureTarget, 8699e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg pdraw->driDrawable); 870643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 871643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg } 872643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 873643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 874643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 875643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergdri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) 876643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{ 877e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao#if __DRI_TEX_BUFFER_VERSION >= 3 878e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct glx_context *gc = __glXGetCurrentContext(); 879e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct dri2_context *pcp = (struct dri2_context *) gc; 880e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); 881e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct glx_display *dpyPriv = __glXInitialize(dpy); 882e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct dri2_drawable *pdraw = (struct dri2_drawable *) base; 883e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct dri2_display *pdp = 884e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao (struct dri2_display *) dpyPriv->dri2Display; 885e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao struct dri2_screen *psc; 886e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao 887e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao if (pdraw != NULL) { 888e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao psc = (struct dri2_screen *) base->psc; 889e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao 890e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao if (psc->texBuffer->base.version >= 3 && 891e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao psc->texBuffer->releaseTexBuffer != NULL) { 892e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao (*psc->texBuffer->releaseTexBuffer) (pcp->driContext, 893e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao pdraw->base.textureTarget, 894e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao pdraw->driDrawable); 895e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao } 896e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao } 897e59fa4c46c8857f2e04447777dd197464c95b2cbJuan Zhao#endif 898643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg} 899643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 900643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic const struct glx_context_vtable dri2_context_vtable = { 901c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg dri2_destroy_context, 902c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg dri2_bind_context, 903c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg dri2_unbind_context, 9047b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg dri2_wait_gl, 9057b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg dri2_wait_x, 9067b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg DRI_glXUseXFont, 907643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_bind_tex_image, 908643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg dri2_release_tex_image, 909559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston NULL, /* get_proc_address */ 910643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}; 911643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 9129e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsbergstatic void 9139e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsbergdri2BindExtensions(struct dri2_screen *psc, const __DRIextension **extensions) 9149e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg{ 9159e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg int i; 9169e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 9179e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); 9189e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control"); 9199e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control"); 920a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read"); 9219e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 9229e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg /* FIXME: if DRI2 version supports it... */ 9239e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "INTEL_swap_event"); 9249e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 92548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick if (psc->dri2->base.version >= 3) { 926e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick const unsigned mask = psc->dri2->getAPIMask(psc->driScreen); 927e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick 92848ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context"); 92948ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile"); 930e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick 931e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick if ((mask & (1 << __DRI_API_GLES2)) != 0) 932e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick __glXEnableDirectExtension(&psc->base, 933e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick "GLX_EXT_create_context_es2_profile"); 93448ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick } 93548ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick 9369e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg for (i = 0; extensions[i]; i++) { 9379e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) { 9389e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->texBuffer = (__DRItexBufferExtension *) extensions[i]; 9399e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap"); 9409e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 9419e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 9429e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) { 9439e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->f = (__DRI2flushExtension *) extensions[i]; 9449e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg /* internal driver extension, no GL extension exposed */ 9459e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 9469e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 9479e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0)) 9489e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg psc->config = (__DRI2configQueryExtension *) extensions[i]; 949511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom 950511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom if (((strcmp(extensions[i]->name, __DRI2_THROTTLE) == 0))) 951511dc295f82c61acefe026d0f4de43d4a31dbf90Thomas Hellstrom psc->throttle = (__DRI2throttleExtension *) extensions[i]; 9529e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg } 9539e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg} 9549e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 9556ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsbergstatic const struct glx_screen_vtable dri2_screen_vtable = { 95643409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick dri2_create_context, 95748ffc6a1553083280c217640629cc6ebed1bf982Ian Romanick dri2_create_context_attribs 9586ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg}; 9599e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg 96066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergstatic struct glx_screen * 961c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdri2CreateScreen(int screen, struct glx_display * priv) 962e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 9630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIconfig **driver_configs; 9640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf const __DRIextension **extensions; 965a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg const struct dri2_display *const pdp = (struct dri2_display *) 966dbf87f23126cc869637575e9ea2cb58774efe888Ian Romanick priv->dri2Display; 967f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg struct dri2_screen *psc; 9680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __GLXDRIscreen *psp; 96963a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner struct glx_config *configs = NULL, *visuals = NULL; 9700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf char *driverName, *deviceName; 9710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drm_magic_t magic; 9720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int i; 9730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 974f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = Xmalloc(sizeof *psc); 975f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL) 9760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 9770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 978f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg memset(psc, 0, sizeof *psc); 9797d9e0ea7393c14cbf2d58364726951b14e0d4fc7Henri Verbeet psc->fd = -1; 9807d9e0ea7393c14cbf2d58364726951b14e0d4fc7Henri Verbeet 981bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (!glx_screen_init(&psc->base, screen, priv)) { 982bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet Xfree(psc); 983bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet return NULL; 984bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet } 985f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 986f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen), 98781cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes &driverName, &deviceName)) { 988bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_screen_cleanup(&psc->base); 989f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg XFree(psc); 99045e0a7a51d88c397a27317d22b325ec31b3e2e99Andrew Deason InfoMessageF("screen %d does not appear to be DRI2 capable\n", screen); 9910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 99281cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes } 9930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 9940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->driver = driOpenDriver(driverName); 9950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->driver == NULL) { 9960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver pointer missing\n"); 9970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 9980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 9990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); 10010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (extensions == NULL) { 10020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); 10030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 10040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 10050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf for (i = 0; extensions[i]; i++) { 10070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_CORE) == 0) 1008daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->core = (__DRIcoreExtension *) extensions[i]; 10090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (strcmp(extensions[i]->name, __DRI_DRI2) == 0) 1010daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes psc->dri2 = (__DRIdri2Extension *) extensions[i]; 10110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 10120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->core == NULL || psc->dri2 == NULL) { 10140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("core dri or dri2 extension not found\n"); 10150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto handle_error; 10160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 10170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->fd = open(deviceName, O_RDWR); 10190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (psc->fd < 0) { 10200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to open drm device: %s\n", strerror(errno)); 102181cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 10220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 10230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (drmGetMagic(psc->fd, &magic)) { 10250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to get magic\n"); 102681cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 10270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 10280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1029f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (!DRI2Authenticate(priv->dpy, RootWindow(priv->dpy, screen), magic)) { 10300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to authenticate magic %d\n", magic); 103181cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 10320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 10330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10344258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 10350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* If the server does not support the protocol for 10360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * DRI2GetBuffersWithFormat, don't supply that interface to the driver. 10370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 103870887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psc->driScreen = 10394258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg psc->dri2->createNewScreen(screen, psc->fd, 10404258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg (const __DRIextension **) 10414258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg &pdp->loader_extensions[0], 1042daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes &driver_configs, psc); 10430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 104470887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg if (psc->driScreen == NULL) { 10450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ErrorMessageF("failed to create dri screen\n"); 104681cca6d4538bdde1661ce868af2a5de47cd251abRodolfo Ribeiro Gomes goto handle_error; 10470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 10480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 104970887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg extensions = psc->core->getExtensions(psc->driScreen); 10509e546ecfd446abf1236cdb0b9469157de5d084ceKristian Høgsberg dri2BindExtensions(psc, extensions); 10510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 105263a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs); 105363a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs); 105463a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner 105563a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner if (!configs || !visuals) 105663a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner goto handle_error; 105763a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner 105863a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner glx_config_destroy_list(psc->base.configs); 105963a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner psc->base.configs = configs; 106063a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner glx_config_destroy_list(psc->base.visuals); 106163a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner psc->base.visuals = visuals; 10620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1063bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg psc->driver_configs = driver_configs; 10640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10656ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg psc->base.vtable = &dri2_screen_vtable; 106670887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg psp = &psc->vtable; 1067f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->base.driScreen = psp; 10680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->destroyScreen = dri2DestroyScreen; 10690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->createDrawable = dri2CreateDrawable; 10700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->swapBuffers = dri2SwapBuffers; 107101923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getDrawableMSC = NULL; 107201923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForMSC = NULL; 107301923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->waitForSBC = NULL; 107401923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->setSwapInterval = NULL; 107501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell psp->getSwapInterval = NULL; 107601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell 10771cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes if (pdp->driMinor >= 2) { 107801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2GetMSC 10791cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getDrawableMSC = dri2DrawableGetMSC; 108001923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 108101923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2WaitMSC 10821cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForMSC = dri2WaitForMSC; 10831cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->waitForSBC = dri2WaitForSBC; 108401923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 108501923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapInterval 10861cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->setSwapInterval = dri2SetSwapInterval; 10871cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes psp->getSwapInterval = dri2GetSwapInterval; 108801923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif 10891ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#if defined(X_DRI2GetMSC) && defined(X_DRI2WaitMSC) && defined(X_DRI2SwapInterval) 1090f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); 10911ca968363dd55e919bd91c8fc31c34d207af3958Jesse Barnes#endif 10921cfd769c2ec0b605cacd75c0e9c89346e1f9518dJesse Barnes } 10930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always 10950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * available.*/ 10960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psp->copySubBuffer = dri2CopySubBuffer; 1097f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); 10980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 10990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 11000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 11010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1102f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return &psc->base; 1103e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1104daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barneshandle_error: 110563a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner if (configs) 110663a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner glx_config_destroy_list(configs); 110763a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner if (visuals) 110863a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner glx_config_destroy_list(visuals); 110963a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner if (psc->driScreen) 111063a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner psc->core->destroyScreen(psc->driScreen); 111163a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner psc->driScreen = NULL; 11127d9e0ea7393c14cbf2d58364726951b14e0d4fc7Henri Verbeet if (psc->fd >= 0) 1113bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet close(psc->fd); 1114bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->driver) 1115bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet dlclose(psc->driver); 111663a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner 11170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(driverName); 11180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(deviceName); 1119bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_screen_cleanup(&psc->base); 1120f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg XFree(psc); 1121e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1123e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 1124e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1125e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* Called from __glXFreeDisplayPrivate. 1126e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 11270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 11280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2DestroyDisplay(__GLXDRIdisplay * dpy) 1129e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1130a75de67c51e9124a7c3846b4110552ea28c60349Henri Verbeet struct dri2_display *pdp = (struct dri2_display *) dpy; 1131a75de67c51e9124a7c3846b4110552ea28c60349Henri Verbeet 1132a75de67c51e9124a7c3846b4110552ea28c60349Henri Verbeet __glxHashDestroy(pdp->dri2Hash); 11330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(dpy); 1134e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 1135e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11363750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg_X_HIDDEN __GLXDRIdrawable * 11373750ebd540510324ef5ada769537ae05309adadbKristian Høgsbergdri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id) 11383750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg{ 1139c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *d = __glXInitialize(dpy); 1140a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp = (struct dri2_display *) d->dri2Display; 11413750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg __GLXDRIdrawable *pdraw; 11423750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 11433750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (__glxHashLookup(pdp->dri2Hash, id, (void *) &pdraw) == 0) 11443750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return pdraw; 11453750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 11463750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 11473750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg} 11483750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 1149e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/* 1150e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Allocate, initialize and return a __DRIdisplayPrivate object. 1151e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * This is called from __glXInitialize() when we are given a new 1152e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * display pointer. 1153e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */ 11540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay * 11550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófdri2CreateDisplay(Display * dpy) 1156e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 1157a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg struct dri2_display *pdp; 11584258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg int eventBase, errorBase, i; 1159e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) 11610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1162e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp = Xmalloc(sizeof *pdp); 11640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pdp == NULL) 11650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1166e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) { 11680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf Xfree(pdp); 11690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 11700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 1171e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->driPatch = 0; 117361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->swapAvailable = (pdp->driMinor >= 2); 117461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez pdp->invalidateAvailable = (pdp->driMinor >= 3); 1175e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.destroyDisplay = dri2DestroyDisplay; 11770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pdp->base.createScreen = dri2CreateScreen; 1178e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11794258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg i = 0; 11804258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg if (pdp->driMinor < 1) 11814258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base; 11824258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg else 11834258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &dri2LoaderExtension.base; 11844258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 11854258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg pdp->loader_extensions[i++] = &systemTimeExtension.base; 11864258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 11874258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#ifdef __DRI_USE_INVALIDATE 11884cd259ca59128ff2712c42ff2d2340b01a3b74a8Kristian Høgsberg pdp->loader_extensions[i++] = &dri2UseInvalidate.base; 11894258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg#endif 1190c8f407bcec7619eb2030ea9fe52501ad33075699Kristian Høgsberg pdp->loader_extensions[i++] = NULL; 11914258e3a2e1c3278694ed10f7fc544d2154d91a96Kristian Høgsberg 11923750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg pdp->dri2Hash = __glxHashCreate(); 11933750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg if (pdp->dri2Hash == NULL) { 11943750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg Xfree(pdp); 11953750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg return NULL; 11963750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg } 11973750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg 11980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return &pdp->base; 1199e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 1200e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 1201e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif /* GLX_DIRECT_RENDERING */ 1202