1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX initialization.  Code based on glxext.c, glx_query.c, and
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glcontextmodes.c under src/glx/.  The major difference is that DRI
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * related code is stripped out.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the maintenance of this file takes too much time, we should consider
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * refactoring glxext.c.
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h>
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/Xlib.h>
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/Xproto.h>
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/Xlibint.h>
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/Xext.h>
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/extutil.h>
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/time.h>
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "GL/glxproto.h"
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "GL/glxtokens.h"
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "GL/gl.h" /* for GL types needed by __GLcontextModes */
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glcore.h"  /* for __GLcontextModes */
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxinit.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef struct GLXGenericGetString
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD8 reqType;
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD8 glxCode;
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD16 length B16;
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD32 for_whom B32;
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD32 name B32;
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} xGLXGenericGetStringReq;
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define sz_xGLXGenericGetStringReq 12
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define X_GLXGenericGetString 0
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Extension required boiler plate */
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char *__glXExtensionName = GLX_EXTENSION_NAME;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XExtensionInfo *__glXExtensionInfo = NULL;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXCloseDisplay(Display * dpy, XExtCodes * codes)
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return XextRemoveDisplay(__glXExtensionInfo, dpy);
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic /* const */ XExtensionHooks __glXExtensionHooks = {
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* create_gc */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* copy_gc */
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* flush_gc */
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* free_gc */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* create_font */
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* free_font */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  __glXCloseDisplay,      /* close_display */
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* wire_to_event */
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* event_to_wire */
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* error */
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* error_string */
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XEXT_GENERATE_FIND_DISPLAY(__glXFindDisplay, __glXExtensionInfo,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  __glXExtensionName, &__glXExtensionHooks,
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  __GLX_NUMBER_EVENTS, NULL)
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_gl_convert_from_x_visual_type(int visualType)
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUM_VISUAL_TYPES   6
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static const int glx_visual_types[NUM_VISUAL_TYPES] = {
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLX_STATIC_GRAY, GLX_GRAY_SCALE,
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLX_TRUE_COLOR, GLX_DIRECT_COLOR
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   };
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ((unsigned) visualType < NUM_VISUAL_TYPES)
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? glx_visual_types[visualType] : GLX_NONE;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_gl_context_modes_destroy(__GLcontextModes * modes)
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (modes != NULL) {
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      __GLcontextModes *const next = modes->next;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree(modes);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      modes = next;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __GLcontextModes *
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_gl_context_modes_create(unsigned count, size_t minimum_size)
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const size_t size = (minimum_size > sizeof(__GLcontextModes))
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? minimum_size : sizeof(__GLcontextModes);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLcontextModes *base = NULL;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLcontextModes **next;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   next = &base;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < count; i++) {
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *next = (__GLcontextModes *) Xmalloc(size);
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*next == NULL) {
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _gl_context_modes_destroy(base);
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         base = NULL;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(*next, 0, size);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->visualID = GLX_DONT_CARE;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->visualType = GLX_DONT_CARE;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->visualRating = GLX_NONE;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->transparentPixel = GLX_NONE;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->transparentRed = GLX_DONT_CARE;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->transparentGreen = GLX_DONT_CARE;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->transparentBlue = GLX_DONT_CARE;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->transparentAlpha = GLX_DONT_CARE;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->transparentIndex = GLX_DONT_CARE;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->xRenderable = GLX_DONT_CARE;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->fbconfigID = GLX_DONT_CARE;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->swapMethod = GLX_SWAP_UNDEFINED_OML;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->bindToTextureRgb = GLX_DONT_CARE;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->bindToTextureRgba = GLX_DONT_CARE;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->bindToMipmapTexture = GLX_DONT_CARE;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->bindToTextureTargets = GLX_DONT_CARE;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*next)->yInverted = GLX_DONT_CARE;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      next = &((*next)->next);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return base;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char *
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXQueryServerString(Display * dpy, int opcode, CARD32 screen, CARD32 name)
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xGLXGenericGetStringReq *req;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xGLXSingleReply reply;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int length;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numbytes;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *buf;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD32 for_whom = screen;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD32 glxCode = X_GLXQueryServerString;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* All of the GLX protocol requests for getting a string from the server
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * look the same.  The exact meaning of the for_whom field is usually
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * either the screen number (for glXQueryServerString) or the context tag
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * (for GLXSingle).
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReq(GLXGenericGetString, req);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = opcode;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->glxCode = glxCode;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->for_whom = for_whom;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->name = name;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _XReply(dpy, (xReply *) & reply, 0, False);
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   length = reply.length * 4;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   numbytes = reply.size;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf = (char *) Xmalloc(numbytes);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buf != NULL) {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _XRead(dpy, buf, numbytes);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      length -= numbytes;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _XEatData(dpy, length);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return buf;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************/
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** Free the per screen configs data as well as the array of
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** __glXScreenConfigs.
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFreeScreenConfigs(__GLXdisplayPrivate * priv)
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLXscreenConfigs *psc;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i, screens;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Free screen configuration information */
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screens = ScreenCount(priv->dpy);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < screens; i++) {
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      psc = priv->screenConfigs[i];
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!psc)
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (psc->configs) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _gl_context_modes_destroy(psc->configs);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         psc->configs = NULL;   /* NOTE: just for paranoia */
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree((char *) psc->serverGLXexts);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XFree((char *) priv->screenConfigs);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   priv->screenConfigs = NULL;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** Release the private memory referred to in a display private
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** structure.  The caller will free the extension structure.
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXFreeDisplayPrivate(XExtData * extension)
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLXdisplayPrivate *priv;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   priv = (__GLXdisplayPrivate *) extension->private_data;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FreeScreenConfigs(priv);
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (priv->serverGLXversion)
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree((char *) priv->serverGLXversion);
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Xfree((char *) priv);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************/
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** Query the version of the GLX extension.  This procedure works even if
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org** the client extension is not completely set up.
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GLX_MAJOR_VERSION 1       /* current version numbers */
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GLX_MINOR_VERSION 4
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgQueryVersion(Display * dpy, int opcode, int *major, int *minor)
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xGLXQueryVersionReq *req;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xGLXQueryVersionReply reply;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Send the glXQueryVersion request */
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReq(GLXQueryVersion, req);
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = opcode;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->glxCode = X_GLXQueryVersion;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->majorVersion = GLX_MAJOR_VERSION;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->minorVersion = GLX_MINOR_VERSION;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _XReply(dpy, (xReply *) & reply, 0, False);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reply.majorVersion != GLX_MAJOR_VERSION) {
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ** The server does not support the same major release as this
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ** client.
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *major = reply.majorVersion;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *minor = min(reply.minorVersion, GLX_MINOR_VERSION);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __GLX_MIN_CONFIG_PROPS	18
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __GLX_MAX_CONFIG_PROPS	500
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __GLX_EXT_CONFIG_PROPS 	10
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __GLX_TOTAL_CONFIG       (__GLX_MIN_CONFIG_PROPS +      \
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    2 * __GLX_EXT_CONFIG_PROPS)
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    const INT32 * bp, Bool tagged_only,
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    Bool fbconfig_style_tags)
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tagged_only) {
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Copy in the first set of properties */
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->visualID = *bp++;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->visualType = _gl_convert_from_x_visual_type(*bp++);
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->rgbMode = *bp++;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->redBits = *bp++;
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->greenBits = *bp++;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->blueBits = *bp++;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->alphaBits = *bp++;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->accumRedBits = *bp++;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->accumGreenBits = *bp++;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->accumBlueBits = *bp++;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->accumAlphaBits = *bp++;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->doubleBufferMode = *bp++;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->stereoMode = *bp++;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->rgbBits = *bp++;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->depthBits = *bp++;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->stencilBits = *bp++;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->numAuxBuffers = *bp++;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config->level = *bp++;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= __GLX_MIN_CONFIG_PROPS;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** Additional properties may be in a list at the end
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** of the reply.  They are in pairs of property type
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** and property value.
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FETCH_OR_SET(tag) \
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    config-> tag = ( fbconfig_style_tags ) ? *bp++ : 1
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < count; i += 2) {
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (*bp++) {
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_RGBA:
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         FETCH_OR_SET(rgbMode);
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BUFFER_SIZE:
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->rgbBits = *bp++;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_LEVEL:
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->level = *bp++;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_DOUBLEBUFFER:
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         FETCH_OR_SET(doubleBufferMode);
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_STEREO:
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         FETCH_OR_SET(stereoMode);
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_AUX_BUFFERS:
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->numAuxBuffers = *bp++;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_RED_SIZE:
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->redBits = *bp++;
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_GREEN_SIZE:
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->greenBits = *bp++;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BLUE_SIZE:
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->blueBits = *bp++;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ALPHA_SIZE:
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->alphaBits = *bp++;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_DEPTH_SIZE:
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->depthBits = *bp++;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_STENCIL_SIZE:
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->stencilBits = *bp++;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ACCUM_RED_SIZE:
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->accumRedBits = *bp++;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ACCUM_GREEN_SIZE:
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->accumGreenBits = *bp++;
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ACCUM_BLUE_SIZE:
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->accumBlueBits = *bp++;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ACCUM_ALPHA_SIZE:
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->accumAlphaBits = *bp++;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VISUAL_CAVEAT_EXT:
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->visualRating = *bp++;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_X_VISUAL_TYPE:
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->visualType = *bp++;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_TYPE:
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->transparentPixel = *bp++;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_INDEX_VALUE:
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->transparentIndex = *bp++;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_RED_VALUE:
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->transparentRed = *bp++;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_GREEN_VALUE:
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->transparentGreen = *bp++;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_BLUE_VALUE:
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->transparentBlue = *bp++;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_ALPHA_VALUE:
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->transparentAlpha = *bp++;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VISUAL_ID:
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->visualID = *bp++;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_DRAWABLE_TYPE:
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->drawableType = *bp++;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_RENDER_TYPE:
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->renderType = *bp++;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_X_RENDERABLE:
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->xRenderable = *bp++;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_FBCONFIG_ID:
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->fbconfigID = *bp++;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_MAX_PBUFFER_WIDTH:
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->maxPbufferWidth = *bp++;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_MAX_PBUFFER_HEIGHT:
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->maxPbufferHeight = *bp++;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_MAX_PBUFFER_PIXELS:
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->maxPbufferPixels = *bp++;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX:
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->optimalPbufferWidth = *bp++;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX:
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->optimalPbufferHeight = *bp++;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VISUAL_SELECT_GROUP_SGIX:
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->visualSelectGroup = *bp++;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_SWAP_METHOD_OML:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->swapMethod = *bp++;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_SAMPLE_BUFFERS_SGIS:
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->sampleBuffers = *bp++;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_SAMPLES_SGIS:
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->samples = *bp++;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BIND_TO_TEXTURE_RGB_EXT:
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->bindToTextureRgb = *bp++;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BIND_TO_TEXTURE_RGBA_EXT:
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->bindToTextureRgba = *bp++;
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BIND_TO_MIPMAP_TEXTURE_EXT:
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->bindToMipmapTexture = *bp++;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BIND_TO_TEXTURE_TARGETS_EXT:
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->bindToTextureTargets = *bp++;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_Y_INVERTED_EXT:
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         config->yInverted = *bp++;
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case None:
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         i = count;
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   config->renderType =
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   config->haveAccumBuffer = ((config->accumRedBits +
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               config->accumGreenBits +
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               config->accumBlueBits +
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               config->accumAlphaBits) > 0);
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   config->haveDepthBuffer = (config->depthBits > 0);
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   config->haveStencilBuffer = (config->stencilBits > 0);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __GLcontextModes *
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreateConfigsFromProperties(Display * dpy, int nvisuals, int nprops,
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            int screen, GLboolean tagged_only)
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT32 buf[__GLX_TOTAL_CONFIG], *props;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned prop_size;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLcontextModes *modes, *m;
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nprops == 0)
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* FIXME: Is the __GLX_MIN_CONFIG_PROPS test correct for FBconfigs? */
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check number of properties */
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nprops < __GLX_MIN_CONFIG_PROPS || nprops > __GLX_MAX_CONFIG_PROPS)
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Allocate memory for our config structure */
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   modes = _gl_context_modes_create(nvisuals, sizeof(__GLcontextModes));
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!modes)
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prop_size = nprops * __GLX_SIZE_INT32;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prop_size <= sizeof(buf))
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      props = buf;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      props = Xmalloc(prop_size);
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Read each config structure and convert it into our format */
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   m = modes;
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < nvisuals; i++) {
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _XRead(dpy, (char *) props, prop_size);
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Older X servers don't send this so we default it here. */
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      m->drawableType = GLX_WINDOW_BIT;
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      __glXInitializeVisualConfigFromTags(m, nprops, props,
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     tagged_only, GL_TRUE);
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      m->screen = screen;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      m = m->next;
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (props != buf)
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree(props);
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return modes;
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggetFBConfigs(__GLXscreenConfigs *psc, __GLXdisplayPrivate *priv, int screen)
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xGLXGetFBConfigsReq *fb_req;
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xGLXGetFBConfigsSGIXReq *sgi_req;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xGLXVendorPrivateWithReplyReq *vpreq;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xGLXGetFBConfigsReply reply;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Display *dpy = priv->dpy;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   psc->serverGLXexts =
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS);
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   psc->configs = NULL;
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (atof(priv->serverGLXversion) >= 1.3) {
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GetReq(GLXGetFBConfigs, fb_req);
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fb_req->reqType = priv->majorOpcode;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fb_req->glxCode = X_GLXGetFBConfigs;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fb_req->screen = screen;
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (strstr(psc->serverGLXexts, "GLX_SGIX_fbconfig") != NULL) {
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GetReqExtra(GLXVendorPrivateWithReply,
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  sz_xGLXGetFBConfigsSGIXReq +
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  sz_xGLXVendorPrivateWithReplyReq, vpreq);
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sgi_req = (xGLXGetFBConfigsSGIXReq *) vpreq;
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sgi_req->reqType = priv->majorOpcode;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sgi_req->glxCode = X_GLXVendorPrivateWithReply;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sgi_req->vendorCode = X_GLXvop_GetFBConfigsSGIX;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sgi_req->screen = screen;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto out;
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_XReply(dpy, (xReply *) & reply, 0, False))
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto out;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   psc->configs = createConfigsFromProperties(dpy,
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              reply.numFBConfigs,
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              reply.numAttribs * 2,
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              screen, GL_TRUE);
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out:
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return psc->configs != NULL;
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAllocAndFetchScreenConfigs(Display * dpy, __GLXdisplayPrivate * priv)
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLXscreenConfigs *psc;
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i, screens;
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** First allocate memory for the array of per screen configs.
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screens = ScreenCount(dpy);
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   priv->screenConfigs = Xmalloc(screens * sizeof *priv->screenConfigs);
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!priv->screenConfigs) {
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   priv->serverGLXversion =
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION);
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (priv->serverGLXversion == NULL) {
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FreeScreenConfigs(priv);
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < screens; i++) {
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      psc = Xcalloc(1, sizeof *psc);
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!psc)
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      getFBConfigs(psc, priv, i);
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      priv->screenConfigs[i] = psc;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_X_HIDDEN __GLXdisplayPrivate *
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXInitialize(Display * dpy)
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = __glXFindDisplay(dpy);
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtData **privList, *private, *found;
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLXdisplayPrivate *dpyPriv;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XEDataObject dataObj;
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int major, minor;
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!XextHasExtension(info))
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* See if a display private already exists.  If so, return it */
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dataObj.display = dpy;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   privList = XEHeadOfExtensionList(dataObj);
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found = XFindOnExtensionList(privList, info->codes->extension);
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (found)
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (__GLXdisplayPrivate *) found->private_data;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* See if the versions are compatible */
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!QueryVersion(dpy, info->codes->major_opcode, &major, &minor))
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** Allocate memory for all the pieces needed for this buffer.
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   private = (XExtData *) Xmalloc(sizeof(XExtData));
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!private)
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dpyPriv = (__GLXdisplayPrivate *) Xcalloc(1, sizeof(__GLXdisplayPrivate));
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dpyPriv) {
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree(private);
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** Init the display private and then read in the screen config
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** structures from the server.
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dpyPriv->majorOpcode = info->codes->major_opcode;
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dpyPriv->dpy = dpy;
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) {
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree(dpyPriv);
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree(private);
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** Fill in the private structure.  This is the actual structure that
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** hangs off of the Display structure.  Our private structure is
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ** referred to by this structure.  Got that?
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   private->number = info->codes->extension;
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   private->next = 0;
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   private->free_private = __glXFreeDisplayPrivate;
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   private->private_data = (char *) dpyPriv;
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XAddToExtensionList(privList, private);
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dpyPriv;
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* GLX_DIRECT_RENDERING */
659