dri_glx.c revision a7292f2920a28a190ca39ce530454a852ec36d59
1cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**************************************************************************
2cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
4cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonAll Rights Reserved.
5cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonPermission is hereby granted, free of charge, to any person obtaining a
7cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksoncopy of this software and associated documentation files (the
8cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson"Software"), to deal in the Software without restriction, including
9cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonwithout limitation the rights to use, copy, modify, merge, publish,
10cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksondistribute, sub license, and/or sell copies of the Software, and to
11cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonpermit persons to whom the Software is furnished to do so, subject to
12cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonthe following conditions:
13cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
14cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonThe above copyright notice and this permission notice (including the
15cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonnext paragraph) shall be included in all copies or substantial portions
16cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonof the Software.
17cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
22cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
26cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson**************************************************************************/
27cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
28cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
29cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Authors:
30cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *   Kevin E. Martin <kevin@precisioninsight.com>
31cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *   Brian Paul <brian@precisioninsight.com>
32cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
33cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
34cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3580b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
36cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
376497d50924230e6b96929c8da0c2bd7287b70d8aAlan Hourihane#include <X11/Xlib.h>
3842c279a03b4d3529efc0d552c37ace2c82306822Xiang, Haihao#include <X11/extensions/Xfixes.h>
3942c279a03b4d3529efc0d552c37ace2c82306822Xiang, Haihao#include <X11/extensions/Xdamage.h>
40cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "glxclient.h"
41cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "xf86dri.h"
42a3c3c1f1437de0186d70de9017a6a8e404ecf482Adam Jackson#include "dri2.h"
43cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "sarea.h"
44cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <dlfcn.h>
45cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <sys/types.h>
46890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg#include <sys/mman.h>
47890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg#include "xf86drm.h"
48079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#include "dri_common.h"
49cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
50a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri_display
510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIdisplay base;
53425f9ed44e576aef27f7ab98968043f7f180d0fdKristian Høgsberg
540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
55425f9ed44e576aef27f7ab98968043f7f180d0fdKristian Høgsberg    ** XFree86-DRI version information
56425f9ed44e576aef27f7ab98968043f7f180d0fdKristian Høgsberg    */
570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int driMajor;
580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int driMinor;
590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int driPatch;
60425f9ed44e576aef27f7ab98968043f7f180d0fdKristian Høgsberg};
61cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
62f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergstruct dri_screen
63f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg{
64f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   __GLXscreenConfigs base;
65f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
6670887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   __DRIscreen *driScreen;
6770887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   __GLXDRIscreen vtable;
68f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   const __DRIlegacyExtension *legacy;
69f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   const __DRIcoreExtension *core;
70089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   const __DRIswapControlExtension *swapControl;
71089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   const __DRImediaStreamCounterExtension *msc;
72bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   const __DRIconfig **driver_configs;
73a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg   const __DRIcopySubBufferExtension *driCopySubBuffer;
74089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
75f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   void *driver;
76f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   int fd;
77f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg};
78f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
79a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct dri_context
800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIcontext base;
820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __DRIcontext *driContext;
830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XID hwContextID;
840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXscreenConfigs *psc;
85e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
86e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
87271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsbergstruct dri_drawable
88271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg{
89271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   __GLXDRIdrawable base;
90271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg
91271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   __DRIdrawable *driDrawable;
92271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg};
93271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg
94cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
95cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Given a display pointer and screen number, determine the name of
96cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * the DRI driver for the screen. (I.e. "r128", "tdfx", etc).
97cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Return True for success, False for failure.
98cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
1000896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriGetDriverName(Display * dpy, int scrNum, char **driverName)
101cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int directCapable;
1030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Bool b;
1040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int event, error;
1050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int driverMajor, driverMinor, driverPatch;
1060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *driverName = NULL;
1080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (XF86DRIQueryExtension(dpy, &event, &error)) {    /* DRI1 */
1100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!XF86DRIQueryDirectRenderingCapable(dpy, scrNum, &directCapable)) {
1110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         ErrorMessageF("XF86DRIQueryDirectRenderingCapable failed\n");
1120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return False;
1130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!directCapable) {
1150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         ErrorMessageF("XF86DRIQueryDirectRenderingCapable returned false\n");
1160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return False;
1170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      b = XF86DRIGetClientDriverName(dpy, scrNum, &driverMajor, &driverMinor,
1200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     &driverPatch, driverName);
1210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!b) {
1220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         ErrorMessageF("Cannot determine driver name for screen %d\n",
1230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       scrNum);
1240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return False;
1250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      InfoMessageF("XF86DRIGetClientDriverName: %d.%d.%d %s (screen %d)\n",
1280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   driverMajor, driverMinor, driverPatch, *driverName,
1290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   scrNum);
1300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return True;
1320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else if (DRI2QueryExtension(dpy, &event, &error)) {  /* DRI2 */
1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      char *dev;
1350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      Bool ret = DRI2Connect(dpy, RootWindow(dpy, scrNum), driverName, &dev);
1360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (ret)
1380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         Xfree(dev);
1390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return ret;
1410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return False;
144cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Exported function for querying the DRI driver for a given screen.
148cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
149cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * The returned char pointer points to a static array that will be
150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * overwritten by subsequent calls.
151cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1520896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófPUBLIC const char *
1530896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetScreenDriver(Display * dpy, int scrNum)
1540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   static char ret[32];
156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   char *driverName;
157079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   if (driGetDriverName(dpy, scrNum, &driverName)) {
158cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      int len;
159cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      if (!driverName)
1600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return NULL;
1610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      len = strlen(driverName);
162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      if (len >= 31)
1630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return NULL;
1640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      memcpy(ret, driverName, len + 1);
165cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      Xfree(driverName);
166cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return ret;
167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
168cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return NULL;
169cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
170cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
171cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
172cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Exported function for obtaining a driver's option list (UTF-8 encoded XML).
173cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
174cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * The returned char pointer points directly into the driver. Therefore
175cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * it should be treated as a constant.
176cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
177cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * If the driver was not found or does not support configuration NULL is
178cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * returned.
179cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
180cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Note: The driver remains opened after this function returns.
181cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófPUBLIC const char *
1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetDriverConfig(const char *driverName)
184e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
1850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   void *handle = driOpenDriver(driverName);
1860f2723cacbaf9b27ecb8d13581f4b72ff86dd911Kristian Høgsberg   if (handle)
1870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return dlsym(handle, "__driConfigOptions");
188cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   else
189cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return NULL;
190cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
191cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
192890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg#ifdef XDAMAGE_1_1_INTERFACE
193e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
1940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic GLboolean
1950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófhas_damage_post(Display * dpy)
196890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg{
1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   static GLboolean inited = GL_FALSE;
1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   static GLboolean has_damage;
1990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!inited) {
2010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      int major, minor;
2020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (XDamageQueryVersion(dpy, &major, &minor) &&
2040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          major == 1 && minor >= 1) {
2050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         has_damage = GL_TRUE;
2060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
2070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {
2080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         has_damage = GL_FALSE;
2090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
2100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      inited = GL_TRUE;
2110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return has_damage;
214890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg}
215890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg
2160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
2170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXReportDamage(__DRIdrawable * driDraw,
2180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  int x, int y,
2190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  drm_clip_rect_t * rects, int num_rects,
2200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  GLboolean front_buffer, void *loaderPrivate)
221890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg{
2220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XRectangle *xrects;
2230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XserverRegion region;
2240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
2250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int x_off, y_off;
2260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIdrawable *glxDraw = loaderPrivate;
2270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXscreenConfigs *psc = glxDraw->psc;
2280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Display *dpy = psc->dpy;
2290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Drawable drawable;
2300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!has_damage_post(dpy))
2320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
2330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (front_buffer) {
2350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      x_off = x;
2360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      y_off = y;
2370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drawable = RootWindow(dpy, psc->scr);
2380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
2400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      x_off = 0;
2410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      y_off = 0;
2420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drawable = glxDraw->xDrawable;
2430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xrects = malloc(sizeof(XRectangle) * num_rects);
2460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (xrects == NULL)
2470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
2480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < num_rects; i++) {
2500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xrects[i].x = rects[i].x1 + x_off;
2510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xrects[i].y = rects[i].y1 + y_off;
2520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xrects[i].width = rects[i].x2 - rects[i].x1;
2530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xrects[i].height = rects[i].y2 - rects[i].y1;
2540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   region = XFixesCreateRegion(dpy, xrects, num_rects);
2560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   free(xrects);
2570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XDamageAdd(dpy, drawable, region);
2580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XFixesDestroyRegion(dpy, region);
259890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg}
260890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg
261e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIdamageExtension damageExtension = {
2620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {__DRI_DAMAGE, __DRI_DAMAGE_VERSION},
2630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXReportDamage,
264e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
265e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
266e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif
267e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
268890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsbergstatic GLboolean
2690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXDRIGetDrawableInfo(__DRIdrawable * drawable,
2700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                        unsigned int *index, unsigned int *stamp,
2710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                        int *X, int *Y, int *W, int *H,
2720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                        int *numClipRects, drm_clip_rect_t ** pClipRects,
2730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                        int *backX, int *backY,
2740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                        int *numBackClipRects,
2750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                        drm_clip_rect_t ** pBackClipRects,
2760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                        void *loaderPrivate)
277890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg{
2780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIdrawable *glxDraw = loaderPrivate;
2790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXscreenConfigs *psc = glxDraw->psc;
2800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Display *dpy = psc->dpy;
2810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return XF86DRIGetDrawableInfo(dpy, psc->scr, glxDraw->drawable,
2830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                 index, stamp, X, Y, W, H,
2840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                 numClipRects, pClipRects,
2850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                 backX, backY,
2860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                 numBackClipRects, pBackClipRects);
287890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg}
288890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg
289890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsbergstatic const __DRIgetDrawableInfoExtension getDrawableInfoExtension = {
2900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {__DRI_GET_DRAWABLE_INFO, __DRI_GET_DRAWABLE_INFO_VERSION},
2910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXDRIGetDrawableInfo
292890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg};
293890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg
294890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsbergstatic const __DRIextension *loader_extensions[] = {
2950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   &systemTimeExtension.base,
2960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   &getDrawableInfoExtension.base,
297e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#ifdef XDAMAGE_1_1_INTERFACE
2980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   &damageExtension.base,
299e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#endif
3000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   NULL
301890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg};
302890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg
303890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg/**
304890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg * Perform the required libGL-side initialization and call the client-side
305890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg * driver's \c __driCreateNewScreen function.
306890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg *
307890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg * \param dpy    Display pointer.
308890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg * \param scrn   Screen number on the display.
309890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg * \param psc    DRI screen information.
310890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg * \param driDpy DRI display information.
311890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg * \param createNewScreen  Pointer to the client-side driver's
312890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg *               \c __driCreateNewScreen function.
313d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg * \returns A pointer to the \c __DRIscreen structure returned by
314890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg *          the client-side driver on success, or \c NULL on failure.
315890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg */
316890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsbergstatic void *
317f972115d33e391499e049b83a1559959f2ca9f72Kristian HøgsbergCallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
318a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg                    struct dri_display * driDpy)
319890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg{
3200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   void *psp = NULL;
3210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drm_handle_t hSAREA;
3220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drmAddress pSAREA = MAP_FAILED;
3230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   char *BusID;
3240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __DRIversion ddx_version;
3250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __DRIversion dri_version;
3260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __DRIversion drm_version;
3270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __DRIframebuffer framebuffer;
3280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int fd = -1;
3290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int status;
3300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drm_magic_t magic;
3320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drmVersionPtr version;
3330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int newlyopened;
3340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   char *driverName;
3350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drm_handle_t hFB;
3360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int junk;
3370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   const __DRIconfig **driver_configs;
3380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLcontextModes *visual;
3390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* DRI protocol version. */
3410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   dri_version.major = driDpy->driMajor;
3420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   dri_version.minor = driDpy->driMinor;
3430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   dri_version.patch = driDpy->driPatch;
3440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   framebuffer.base = MAP_FAILED;
3460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   framebuffer.dev_priv = NULL;
34786d98fa4a2dfdae75e6ecd9a7e6e73d4183075a0Vinson Lee   framebuffer.size = 0;
3480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!XF86DRIOpenConnection(dpy, scrn, &hSAREA, &BusID)) {
3500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("XF86DRIOpenConnection failed\n");
3510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
3520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   fd = drmOpenOnce(NULL, BusID, &newlyopened);
3550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(BusID);                /* No longer needed */
3570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (fd < 0) {
3590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("drmOpenOnce failed (%s)\n", strerror(-fd));
3600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
3610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (drmGetMagic(fd, &magic)) {
3640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("drmGetMagic failed\n");
3650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
3660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   version = drmGetVersion(fd);
3690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (version) {
3700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drm_version.major = version->version_major;
3710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drm_version.minor = version->version_minor;
3720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drm_version.patch = version->version_patchlevel;
3730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drmFreeVersion(version);
3740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
3760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drm_version.major = -1;
3770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drm_version.minor = -1;
3780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drm_version.patch = -1;
3790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (newlyopened && !XF86DRIAuthConnection(dpy, scrn, magic)) {
3820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("XF86DRIAuthConnection failed\n");
3830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
3840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Get device name (like "tdfx") and the ddx version numbers.
3870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * We'll check the version in each DRI driver's "createNewScreen"
3880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * function. */
3890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!XF86DRIGetClientDriverName(dpy, scrn,
3900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   &ddx_version.major,
3910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   &ddx_version.minor,
3920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   &ddx_version.patch, &driverName)) {
3930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("XF86DRIGetClientDriverName failed\n");
3940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
3950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(driverName);           /* No longer needed. */
3980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
4000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * Get device-specific info.  pDevPriv will point to a struct
4010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
4020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * has information about the screen size, depth, pitch, ancilliary
4030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * buffers, DRM mmap handles, etc.
4040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
4050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!XF86DRIGetDeviceInfo(dpy, scrn, &hFB, &junk,
4060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                             &framebuffer.size, &framebuffer.stride,
4070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                             &framebuffer.dev_priv_size,
4080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                             &framebuffer.dev_priv)) {
4090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("XF86DRIGetDeviceInfo failed");
4100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
4110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   framebuffer.width = DisplayWidth(dpy, scrn);
4140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   framebuffer.height = DisplayHeight(dpy, scrn);
4150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Map the framebuffer region. */
4170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   status = drmMap(fd, hFB, framebuffer.size,
4180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   (drmAddressPtr) & framebuffer.base);
4190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (status != 0) {
4200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("drmMap of framebuffer failed (%s)", strerror(-status));
4210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
4220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Map the SAREA region.  Further mmap regions may be setup in
4250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * each DRI driver's "createNewScreen" function.
4260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
4270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   status = drmMap(fd, hSAREA, SAREA_MAX, &pSAREA);
4280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (status != 0) {
4290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("drmMap of SAREA failed (%s)", strerror(-status));
4300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
4310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psp = (*psc->legacy->createNewScreen) (scrn,
4340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                          &ddx_version,
4350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                          &dri_version,
4360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                          &drm_version,
4370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                          &framebuffer,
4380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                          pSAREA,
4390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                          fd,
4400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                          loader_extensions,
4410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                          &driver_configs, psc);
4420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (psp == NULL) {
4440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("Calling driver entry point failed");
4450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      goto handle_error;
4460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
448f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   psc->base.configs =
449f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      driConvertConfigs(psc->core, psc->base.configs, driver_configs);
450f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   psc->base.visuals =
451f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
4520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
453bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   psc->driver_configs = driver_configs;
4540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Visuals with depth != screen depth are subject to automatic compositing
4560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * in the X server, so DRI1 can't render to them properly. Mark them as
4570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * non-conformant to prevent apps from picking them up accidentally.
4580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
459f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   for (visual = psc->base.visuals; visual; visual = visual->next) {
4600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      XVisualInfo template;
4610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      XVisualInfo *visuals;
4620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      int num_visuals;
4630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      long mask;
4640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      template.visualid = visual->visualID;
4660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      mask = VisualIDMask;
4670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      visuals = XGetVisualInfo(dpy, mask, &template, &num_visuals);
4680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (visuals) {
4700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (num_visuals > 0 && visuals->depth != DefaultDepth(dpy, scrn))
4710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            visual->visualRating = GLX_NON_CONFORMANT_CONFIG;
4720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XFree(visuals);
4740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
4750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return psp;
478906e189bd362399f1ffc4d5421ae0d0abd586977George Sapountzis
479906e189bd362399f1ffc4d5421ae0d0abd586977George Sapountzis handle_error:
4800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (pSAREA != MAP_FAILED)
4810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drmUnmap(pSAREA, SAREA_MAX);
482906e189bd362399f1ffc4d5421ae0d0abd586977George Sapountzis
4830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (framebuffer.base != MAP_FAILED)
4840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drmUnmap((drmAddress) framebuffer.base, framebuffer.size);
485906e189bd362399f1ffc4d5421ae0d0abd586977George Sapountzis
4860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (framebuffer.dev_priv != NULL)
4870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      Xfree(framebuffer.dev_priv);
488906e189bd362399f1ffc4d5421ae0d0abd586977George Sapountzis
4890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (fd >= 0)
4900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      drmCloseOnce(fd);
491906e189bd362399f1ffc4d5421ae0d0abd586977George Sapountzis
4920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XF86DRICloseConnection(dpy, scrn);
493906e189bd362399f1ffc4d5421ae0d0abd586977George Sapountzis
4940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   ErrorMessageF("reverting to software direct rendering\n");
495906e189bd362399f1ffc4d5421ae0d0abd586977George Sapountzis
4960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return NULL;
497890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg}
498890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg
4990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
5000896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriDestroyContext(__GLXDRIcontext * context,
501f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg                  __GLXscreenConfigs *base, Display * dpy)
502020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg{
503a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct dri_context *pcp = (struct dri_context *) context;
504f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) base;
505020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg
5060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   (*psc->core->destroyContext) (pcp->driContext);
5070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
508f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   XF86DRIDestroyContext(psc->base.dpy, psc->base.scr, pcp->hwContextID);
5090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(pcp);
510020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg}
51153dc86363665b9b22f042c5d950b7de0ed02b4c8Kristian Høgsberg
5120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
513f972115d33e391499e049b83a1559959f2ca9f72Kristian HøgsbergdriBindContext(__GLXDRIcontext *context,
514f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg	       __GLXDRIdrawable *draw, __GLXDRIdrawable *read)
51553dc86363665b9b22f042c5d950b7de0ed02b4c8Kristian Høgsberg{
516a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct dri_context *pcp = (struct dri_context *) context;
517f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) pcp->psc;
518271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdr = (struct dri_drawable *) draw;
519271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *prd = (struct dri_drawable *) read;
520020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg
521f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   return (*psc->core->bindContext) (pcp->driContext,
522271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg				     pdr->driDrawable, prd->driDrawable);
523020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg}
524020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg
5250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
5260896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriUnbindContext(__GLXDRIcontext * context)
527020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg{
528a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct dri_context *pcp = (struct dri_context *) context;
529f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) pcp->psc;
530020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg
531f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   (*psc->core->unbindContext) (pcp->driContext);
532020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg}
533020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg
5340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIcontext *
535f972115d33e391499e049b83a1559959f2ca9f72Kristian HøgsbergdriCreateContext(__GLXscreenConfigs *base,
5360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                 const __GLcontextModes * mode,
5370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                 GLXContext gc, GLXContext shareList, int renderType)
538020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg{
539a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct dri_context *pcp, *pcp_shared;
540f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) base;
5410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drm_context_t hwContext;
5420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __DRIcontext *shared = NULL;
5430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode;
5440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
545f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   if (!psc->base.driScreen)
5460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (shareList) {
549a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg      pcp_shared = (struct dri_context *) shareList->driContext;
5500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      shared = pcp_shared->driContext;
5510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
5520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pcp = Xmalloc(sizeof *pcp);
5540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (pcp == NULL)
5550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
5560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
557f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   pcp->psc = &psc->base;
558f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   if (!XF86DRICreateContextWithConfig(psc->base.dpy, psc->base.scr,
5590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       mode->visualID,
5600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       &pcp->hwContextID, &hwContext)) {
5610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      Xfree(pcp);
5620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
5630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
5640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pcp->driContext =
56670887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg      (*psc->legacy->createNewContext) (psc->driScreen,
5670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                        config->driConfig,
5680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                        renderType, shared, hwContext, pcp);
5690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (pcp->driContext == NULL) {
570f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      XF86DRIDestroyContext(psc->base.dpy, psc->base.scr, pcp->hwContextID);
5710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      Xfree(pcp);
5720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
5730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
5740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pcp->base.destroyContext = driDestroyContext;
5760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pcp->base.bindContext = driBindContext;
5770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pcp->base.unbindContext = driUnbindContext;
5780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return &pcp->base;
58053dc86363665b9b22f042c5d950b7de0ed02b4c8Kristian Høgsberg}
58153dc86363665b9b22f042c5d950b7de0ed02b4c8Kristian Høgsberg
5820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
5830896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriDestroyDrawable(__GLXDRIdrawable * pdraw)
5849110425c72e45f618131b559eba883fd6c5536b4Kristian Høgsberg{
585f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) pdraw->psc;
586271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
5879110425c72e45f618131b559eba883fd6c5536b4Kristian Høgsberg
588271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   (*psc->core->destroyDrawable) (pdp->driDrawable);
589f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   XF86DRIDestroyDrawable(psc->base.dpy, psc->base.scr, pdraw->drawable);
5900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(pdraw);
5919110425c72e45f618131b559eba883fd6c5536b4Kristian Høgsberg}
59220b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg
5930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic __GLXDRIdrawable *
594f972115d33e391499e049b83a1559959f2ca9f72Kristian HøgsbergdriCreateDrawable(__GLXscreenConfigs *base,
5950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  XID xDrawable,
5960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  GLXDrawable drawable, const __GLcontextModes * modes)
59720b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg{
5980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drm_drawable_t hwDrawable;
5990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   void *empty_attribute_list = NULL;
6000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
601f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) base;
602271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp;
6030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
6040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Old dri can't handle GLX 1.3+ drawable constructors. */
6050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (xDrawable != drawable)
6060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
6070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
608271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp = Xmalloc(sizeof *pdp);
609271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   if (!pdp)
6100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
6110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
612271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp->base.drawable = drawable;
613271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp->base.psc = &psc->base;
6140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
615f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   if (!XF86DRICreateDrawable(psc->base.dpy, psc->base.scr,
616f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg			      drawable, &hwDrawable)) {
617271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg      Xfree(pdp);
6180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
619e0556657526a7fe53d6e17cf70ffa6a8ee35e0a9Vinson Lee   }
6200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
6210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Create a new drawable */
622271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp->driDrawable =
62370887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg      (*psc->legacy->createNewDrawable) (psc->driScreen,
6240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                         config->driConfig,
6250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                         hwDrawable,
6260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                         GLX_WINDOW_BIT,
627271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg                                         empty_attribute_list, pdp);
6280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
629271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   if (!pdp->driDrawable) {
630f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      XF86DRIDestroyDrawable(psc->base.dpy, psc->base.scr, drawable);
631271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg      Xfree(pdp);
6320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
6330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
6340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
635271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp->base.destroyDrawable = driDestroyDrawable;
6360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
637271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   return &pdp->base;
63820b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg}
63920b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg
640daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic int64_t
641daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse BarnesdriSwapBuffers(__GLXDRIdrawable * pdraw, int64_t unused1, int64_t unused2,
642daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes	       int64_t unused3)
643f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg{
644f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) pdraw->psc;
645271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
646f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
647271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   (*psc->core->swapBuffers) (pdp->driDrawable);
648daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   return 0;
649f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}
650f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg
6510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
6520896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriCopySubBuffer(__GLXDRIdrawable * pdraw,
6530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                 int x, int y, int width, int height)
6544830809524b20e517e949151957512b14d7e679aKristian Høgsberg{
655271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
656a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) pdp->base.psc;
657271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg
658a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg   (*psc->driCopySubBuffer->copySubBuffer) (pdp->driDrawable,
659a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg					    x, y, width, height);
6604830809524b20e517e949151957512b14d7e679aKristian Høgsberg}
6614830809524b20e517e949151957512b14d7e679aKristian Høgsberg
6620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
663f972115d33e391499e049b83a1559959f2ca9f72Kristian HøgsbergdriDestroyScreen(__GLXscreenConfigs *base)
664a1ea6f6198d80f716936a308cfab235f18a014e1Kristian Høgsberg{
665f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) base;
666f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
6670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Free the direct rendering per screen data */
66870887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   if (psc->driScreen)
66970887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg      (*psc->core->destroyScreen) (psc->driScreen);
670bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   driDestroyConfigs(psc->driver_configs);
67170887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   psc->driScreen = NULL;
6720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (psc->driver)
6730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      dlclose(psc->driver);
674a1ea6f6198d80f716936a308cfab235f18a014e1Kristian Høgsberg}
675a1ea6f6198d80f716936a308cfab235f18a014e1Kristian Høgsberg
676643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic const struct glx_context_vtable dri_context_vtable = {
677643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   NULL,
678643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   NULL,
679643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg};
680643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
681089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#ifdef __DRI_SWAP_BUFFER_COUNTER
682089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
683089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic int
684089fc37c6fa158824279e08e3b378ced94d6f803Kristian HøgsbergdriDrawableGetMSC(__GLXscreenConfigs *base, __GLXDRIdrawable *pdraw,
685089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg		   int64_t *ust, int64_t *msc, int64_t *sbc)
686089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg{
687089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) base;
688271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
689089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
690271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   if (pdp && psc->sbc && psc->msc)
691089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      return ( (*psc->msc->getMSC)(psc->driScreen, msc) == 0 &&
692271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg	       (*psc->sbc->getSBC)(pdp->driDrawable, sbc) == 0 &&
693089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	       __glXGetUST(ust) == 0 );
694089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg}
695089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
696089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic int
697089fc37c6fa158824279e08e3b378ced94d6f803Kristian HøgsbergdriWaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor,
698089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	       int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc)
699089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg{
700089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   struct dri_screen *psc = (struct dri_screen *) pdraw->psc;
701271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
702089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
703271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   if (pdp != NULL && psc->msc != NULL) {
704271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg      ret = (*psc->msc->waitForMSC) (pdp->driDrawable, target_msc,
705089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg				     divisor, remainder, msc, sbc);
706089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
707089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      /* __glXGetUST returns zero on success and non-zero on failure.
708089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg       * This function returns True on success and False on failure.
709089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg       */
710089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      return ret == 0 && __glXGetUST(ust) == 0;
711089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   }
712089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg}
713089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
714089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic int
715089fc37c6fa158824279e08e3b378ced94d6f803Kristian HøgsbergdriWaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust,
716089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	       int64_t *msc, int64_t *sbc)
717089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg{
718271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
719271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg
720271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   if (pdp != NULL && psc->sbc != NULL) {
721089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      ret =
722271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg         (*psc->sbc->waitForSBC) (pdp->driDrawable, target_sbc, msc, sbc);
723089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
724089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      /* __glXGetUST returns zero on success and non-zero on failure.
725089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg       * This function returns True on success and False on failure.
726089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg       */
727089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      return ((ret == 0) && (__glXGetUST(ust) == 0));
728089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   }
729089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
730271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   return DRI2WaitSBC(pdp->base.psc->dpy,
731271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg		      pdp->base.xDrawable, target_sbc, ust, msc, sbc);
732089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg}
733089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
734089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#endif
735089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
736089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic int
737089fc37c6fa158824279e08e3b378ced94d6f803Kristian HøgsbergdriSetSwapInterval(__GLXDRIdrawable *pdraw, int interval)
738089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg{
739089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   GLXContext gc = __glXGetCurrentContext();
740271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
741089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   struct dri_screen *psc;
742089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
743089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   if (gc->driContext) {
744089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      psc = (struct dri_screen *) pdraw->psc;
745089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
746089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      if (psc->swapControl != NULL && pdraw != NULL) {
747271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg	 psc->swapControl->setSwapInterval(pdp->driDrawable, interval);
748089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	 return 0;
749089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      }
750089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   }
751089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
752089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   return GLX_BAD_CONTEXT;
753089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg}
754089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
755089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic int
756089fc37c6fa158824279e08e3b378ced94d6f803Kristian HøgsbergdriGetSwapInterval(__GLXDRIdrawable *pdraw)
757089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg{
758089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   GLXContext gc = __glXGetCurrentContext();
759271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
760089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   struct dri_screen *psc;
761089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
762089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   if (gc != NULL && gc->driContext) {
763089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      psc = (struct dri_screen *) pdraw->psc;
764089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
765089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      if (psc->swapControl != NULL && pdraw != NULL) {
766271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg	 return psc->swapControl->getSwapInterval(pdp->driDrawable);
767089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      }
768089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   }
769089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
770089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   return 0;
771089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg}
772089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
773089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg/* Bind DRI1 specific extensions */
774089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsbergstatic void
775089fc37c6fa158824279e08e3b378ced94d6f803Kristian HøgsbergdriBindExtensions(struct dri_screen *psc, const __DRIextension **extensions)
776089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg{
777089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   int i;
778089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
779089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   for (i = 0; extensions[i]; i++) {
780089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      /* No DRI2 support for swap_control at the moment, since SwapBuffers
781089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg       * is done by the X server */
782089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0) {
783089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	 psc->swapControl = (__DRIswapControlExtension *) extensions[i];
784089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	 __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control");
785089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	 __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control");
786089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      }
787089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
788089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      if (strcmp(extensions[i]->name, __DRI_MEDIA_STREAM_COUNTER) == 0) {
789089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg         psc->msc = (__DRImediaStreamCounterExtension *) extensions[i];
790089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg         __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync");
791089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      }
792089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
793a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg      if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
794a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg	 psc->driCopySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
795a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg	 __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer");
796a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg      }
797a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg
798a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg      if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
799a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg	 __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read");
800a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg      }
801089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg      /* Ignore unknown extensions */
802089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   }
803089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg}
804089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
805f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergstatic __GLXscreenConfigs *
806f972115d33e391499e049b83a1559959f2ca9f72Kristian HøgsbergdriCreateScreen(int screen, __GLXdisplayPrivate *priv)
807890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg{
808a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct dri_display *pdp;
8090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIscreen *psp;
8100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   const __DRIextension **extensions;
811f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct dri_screen *psc;
8120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   char *driverName;
8130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
8140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
815f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   psc = Xcalloc(1, sizeof *psc);
816f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   if (psc == NULL)
8170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
8180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
819f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   memset(psc, 0, sizeof *psc);
820f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   if (!glx_screen_init(&psc->base, screen, priv))
821f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg       return NULL;
822f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
8230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!driGetDriverName(priv->dpy, screen, &driverName)) {
824f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      Xfree(psc);
8250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
8260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psc->driver = driOpenDriver(driverName);
8290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(driverName);
8300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (psc->driver == NULL) {
831f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      Xfree(psc);
8320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
8330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
8360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (extensions == NULL) {
8370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
838f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      Xfree(psc);
8390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
8400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; extensions[i]; i++) {
8430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
844daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes	 psc->core = (__DRIcoreExtension *) extensions[i];
8450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (strcmp(extensions[i]->name, __DRI_LEGACY) == 0)
846daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes	 psc->legacy = (__DRIlegacyExtension *) extensions[i];
8470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (psc->core == NULL || psc->legacy == NULL) {
850f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      Xfree(psc);
8510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
8520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
854a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   pdp = (struct dri_display *) priv->driDisplay;
85570887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   psc->driScreen =
856f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      CallCreateNewScreen(psc->base.dpy, screen, psc, pdp);
85770887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   if (psc->driScreen == NULL) {
8580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      dlclose(psc->driver);
859f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      Xfree(psc);
8600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
8610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
86370887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   extensions = psc->core->getExtensions(psc->driScreen);
864089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   driBindExtensions(psc, extensions);
865daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
86670887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   psp = &psc->vtable;
867f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   psc->base.driScreen = psp;
868a7292f2920a28a190ca39ce530454a852ec36d59Kristian Høgsberg   if (psc->driCopySubBuffer)
8690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      psp->copySubBuffer = driCopySubBuffer;
8700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psp->destroyScreen = driDestroyScreen;
8720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psp->createContext = driCreateContext;
8730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psp->createDrawable = driCreateDrawable;
8740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psp->swapBuffers = driSwapBuffers;
8750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psp->waitX = NULL;
8760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psp->waitGL = NULL;
8770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
878089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#ifdef __DRI_SWAP_BUFFER_COUNTER
879089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   psp->getDrawableMSC = driDrawableGetMSC;
880089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   psp->waitForMSC = driWaitForMSC;
881089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   psp->waitForSBC = driWaitForSBC;
882089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#endif
883089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
884089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   psp->setSwapInterval = driSetSwapInterval;
885089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg   psp->getSwapInterval = driGetSwapInterval;
886089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg
887f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   psc->base.direct_context_vtable = &dri_context_vtable;
888643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
889f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   return &psc->base;
890890d44e54f2c800f066f59eb074ad09e14d54483Kristian Høgsberg}
891cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8928628b382e4ac492d829fe720219187b758add003Michel Dänzer/* Called from __glXFreeDisplayPrivate.
893cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
8940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
8950896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriDestroyDisplay(__GLXDRIdisplay * dpy)
896cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
8970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(dpy);
898cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
899cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
900cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
901cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Allocate, initialize and return a __DRIdisplayPrivate object.
902cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This is called from __glXInitialize() when we are given a new
903cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * display pointer.
904cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
9050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay *
9060896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriCreateDisplay(Display * dpy)
907cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
908a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct dri_display *pdpyp;
9090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int eventBase, errorBase;
9100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int major, minor, patch;
911cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
9120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!XF86DRIQueryExtension(dpy, &eventBase, &errorBase)) {
9130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
9140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
915cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
9160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!XF86DRIQueryVersion(dpy, &major, &minor, &patch)) {
9170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
9180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
919cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
9200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pdpyp = Xmalloc(sizeof *pdpyp);
9210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!pdpyp) {
9220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
9230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
924cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
9250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pdpyp->driMajor = major;
9260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pdpyp->driMinor = minor;
9270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pdpyp->driPatch = patch;
928cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
9290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pdpyp->base.destroyDisplay = driDestroyDisplay;
9300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   pdpyp->base.createScreen = driCreateScreen;
931cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
9320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return &pdpyp->base;
933cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
934cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
935cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif /* GLX_DIRECT_RENDERING */
936