11087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis/*
21087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * Copyright 2008 George Sapountzis
31087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis *
41087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * Permission is hereby granted, free of charge, to any person obtaining a
51087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * copy of this software and associated documentation files (the "Software"),
61087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * to deal in the Software without restriction, including without limitation
71087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * the rights to use, copy, modify, merge, publish, distribute, sublicense,
81087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * and/or sell copies of the Software, and to permit persons to whom the
91087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * Software is furnished to do so, subject to the following conditions:
101087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis *
111087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * The above copyright notice and this permission notice (including the next
121087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * paragraph) shall be included in all copies or substantial portions of the
131087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * Software.
141087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis *
151087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
161087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
171087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
181087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
191087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
201087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
211087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * SOFTWARE.
221087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis */
231087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
2480b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
251087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
261087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis#include <X11/Xlib.h>
271087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis#include "glxclient.h"
281087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis#include <dlfcn.h>
291087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis#include "dri_common.h"
301087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
31a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct drisw_display
3260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf{
3360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   __GLXDRIdisplay base;
341087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis};
351087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
36a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct drisw_context
3760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf{
38c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context base;
3960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   __DRIcontext *driContext;
404d58b5b482d06ab8d4c4b2db33d0b48b7c82d064Kristian Høgsberg
411087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis};
421087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
43f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsbergstruct drisw_screen
44f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg{
4566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen base;
46f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
4770887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   __DRIscreen *driScreen;
4870887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   __GLXDRIscreen vtable;
49f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   const __DRIcoreExtension *core;
50f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   const __DRIswrastExtension *swrast;
5155e763c86da1aa2042d50d190d797574d6fb6fa8nobled   const __DRItexBufferExtension *texBuffer;
5255e763c86da1aa2042d50d190d797574d6fb6fa8nobled
53bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   const __DRIconfig **driver_configs;
54bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg
55f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   void *driver;
56f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg};
57f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
58a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsbergstruct drisw_drawable
5960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf{
6060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   __GLXDRIdrawable base;
611087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
6260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   GC gc;
6360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   GC swapgc;
641087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
65271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   __DRIdrawable *driDrawable;
6660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XVisualInfo *visinfo;
6760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XImage *ximage;
681087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis};
691087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
7060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristófstatic Bool
71a296d96de45d38a6ed0b3c817334d443facc169bKristian HøgsbergXCreateDrawable(struct drisw_drawable * pdp,
7260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf                Display * dpy, XID drawable, int visualid)
731087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
7460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XGCValues gcvalues;
7560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   long visMask;
7660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XVisualInfo visTemp;
7760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   int num_visuals;
7860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
7960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   /* create GC's */
8060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   pdp->gc = XCreateGC(dpy, drawable, 0, NULL);
8160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   pdp->swapgc = XCreateGC(dpy, drawable, 0, NULL);
8260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
8360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   gcvalues.function = GXcopy;
8460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   gcvalues.graphics_exposures = False;
8560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XChangeGC(dpy, pdp->gc, GCFunction, &gcvalues);
8660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XChangeGC(dpy, pdp->swapgc, GCFunction, &gcvalues);
8760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XChangeGC(dpy, pdp->swapgc, GCGraphicsExposures, &gcvalues);
8860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
89a7109625aa221eb765cf8e0ee6abfe617f9515baGeorge Sapountzis   /* visual */
9060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   visTemp.visualid = visualid;
912af17433b5b037af99198acfac567c57618286c3Adam Jackson   visMask = VisualIDMask;
9260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   pdp->visinfo = XGetVisualInfo(dpy, visMask, &visTemp, &num_visuals);
9360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
942c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie   if (!pdp->visinfo || num_visuals == 0)
952c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie      return False;
962c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie
97a7109625aa221eb765cf8e0ee6abfe617f9515baGeorge Sapountzis   /* create XImage */
982b5a6e083c1e6e45757a2192721d8675309835c1George Sapountzis   pdp->ximage = XCreateImage(dpy,
992b5a6e083c1e6e45757a2192721d8675309835c1George Sapountzis                              pdp->visinfo->visual,
1002b5a6e083c1e6e45757a2192721d8675309835c1George Sapountzis                              pdp->visinfo->depth,
1012b5a6e083c1e6e45757a2192721d8675309835c1George Sapountzis                              ZPixmap, 0,             /* format, offset */
1022b5a6e083c1e6e45757a2192721d8675309835c1George Sapountzis                              NULL,                   /* data */
103f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis                              0, 0,                   /* width, height */
1043bfa23317c6b1b52ec637a03a0b623228ffc95efGeorge Sapountzis                              32,                     /* bitmap_pad */
1052b5a6e083c1e6e45757a2192721d8675309835c1George Sapountzis                              0);                     /* bytes_per_line */
10660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
107cfec000e7514342fd51859906e173ba2d474a55cMarc Pignat  /**
108cfec000e7514342fd51859906e173ba2d474a55cMarc Pignat   * swrast does not handle 24-bit depth with 24 bpp, so let X do the
109cfec000e7514342fd51859906e173ba2d474a55cMarc Pignat   * the conversion for us.
110cfec000e7514342fd51859906e173ba2d474a55cMarc Pignat   */
111cfec000e7514342fd51859906e173ba2d474a55cMarc Pignat  if (pdp->ximage->bits_per_pixel == 24)
112cfec000e7514342fd51859906e173ba2d474a55cMarc Pignat     pdp->ximage->bits_per_pixel = 32;
113cfec000e7514342fd51859906e173ba2d474a55cMarc Pignat
11460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   return True;
1151087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
1161087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
11760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristófstatic void
118a296d96de45d38a6ed0b3c817334d443facc169bKristian HøgsbergXDestroyDrawable(struct drisw_drawable * pdp, Display * dpy, XID drawable)
1191087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
12060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XDestroyImage(pdp->ximage);
12160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XFree(pdp->visinfo);
1221087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
12360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XFreeGC(dpy, pdp->gc);
12460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XFreeGC(dpy, pdp->swapgc);
1251087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
1261087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
127a7109625aa221eb765cf8e0ee6abfe617f9515baGeorge Sapountzis/**
128a7109625aa221eb765cf8e0ee6abfe617f9515baGeorge Sapountzis * swrast loader functions
129a7109625aa221eb765cf8e0ee6abfe617f9515baGeorge Sapountzis */
130a7109625aa221eb765cf8e0ee6abfe617f9515baGeorge Sapountzis
1311087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzisstatic void
13260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, KristófswrastGetDrawableInfo(__DRIdrawable * draw,
133f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis                      int *x, int *y, int *w, int *h,
134f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis                      void *loaderPrivate)
1351087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
136a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_drawable *pdp = loaderPrivate;
137436024561aa6d78f78601f690803bd3845d225e7Matthieu Herrb   __GLXDRIdrawable *pdraw = &(pdp->base);
13860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   Display *dpy = pdraw->psc->dpy;
13960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   Drawable drawable;
1401087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
14160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   Window root;
142f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   unsigned uw, uh, bw, depth;
1431087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
14460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   drawable = pdraw->xDrawable;
1451087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
146b24f291e429b94ca7de74f8b32279e3a0375cd9cAdam Jackson   XGetGeometry(dpy, drawable, &root, x, y, &uw, &uh, &bw, &depth);
147f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   *w = uw;
148f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   *h = uh;
1491087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
1501087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
151a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis/**
152a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * Align renderbuffer pitch.
153a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis *
154a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * This should be chosen by the driver and the loader (libGL, xserver/glx)
155a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * should use the driver provided pitch.
156a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis *
157a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * It seems that the xorg loader (that is the xserver loading swrast_dri for
158a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * indirect rendering, not client-side libGL) requires that the pitch is
159a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * exactly the image width padded to 32 bits. XXX
160a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis *
161a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * The above restriction can probably be overcome by using ScratchPixmap and
162a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * CopyArea in the xserver, similar to ShmPutImage, and setting the width of
163a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis * the scratch pixmap to 'pitch / cpp'.
164a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis */
165a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzisstatic inline int
166a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzisbytes_per_line(unsigned pitch_bits, unsigned mul)
167a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis{
168a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis   unsigned mask = mul - 1;
169a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis
170a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis   return ((pitch_bits + mask) & ~mask) / 8;
171a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis}
172a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis
1731087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzisstatic void
174a24fc90703f62d286031cb2ee8f625ef728243fdGeorge SapountzisswrastPutImage(__DRIdrawable * draw, int op,
175a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis               int x, int y, int w, int h,
176a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis               char *data, void *loaderPrivate)
1771087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
178a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_drawable *pdp = loaderPrivate;
179436024561aa6d78f78601f690803bd3845d225e7Matthieu Herrb   __GLXDRIdrawable *pdraw = &(pdp->base);
18060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   Display *dpy = pdraw->psc->dpy;
18160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   Drawable drawable;
18260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XImage *ximage;
18360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   GC gc;
18460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
18560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   switch (op) {
18660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   case __DRI_SWRAST_IMAGE_OP_DRAW:
18760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      gc = pdp->gc;
18860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      break;
18960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   case __DRI_SWRAST_IMAGE_OP_SWAP:
19060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      gc = pdp->swapgc;
19160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      break;
19260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   default:
19360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      return;
19460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   }
19560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
19660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   drawable = pdraw->xDrawable;
19760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
19860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage = pdp->ximage;
19960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage->data = data;
20060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage->width = w;
20160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage->height = h;
202a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis   ximage->bytes_per_line = bytes_per_line(w * ximage->bits_per_pixel, 32);
20360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
20460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XPutImage(dpy, drawable, gc, ximage, 0, 0, x, y, w, h);
20560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
20660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage->data = NULL;
2071087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
2081087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
2091087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzisstatic void
210a24fc90703f62d286031cb2ee8f625ef728243fdGeorge SapountzisswrastGetImage(__DRIdrawable * read,
211a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis               int x, int y, int w, int h,
212a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis               char *data, void *loaderPrivate)
2131087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
214a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_drawable *prp = loaderPrivate;
215f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   __GLXDRIdrawable *pread = &(prp->base);
216f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   Display *dpy = pread->psc->dpy;
217f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   Drawable readable;
21860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XImage *ximage;
2191087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
220f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   readable = pread->xDrawable;
2211087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
222f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   ximage = prp->ximage;
22360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage->data = data;
22460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage->width = w;
22560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage->height = h;
226a24fc90703f62d286031cb2ee8f625ef728243fdGeorge Sapountzis   ximage->bytes_per_line = bytes_per_line(w * ximage->bits_per_pixel, 32);
2271087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
228f4e561ce127cf484d7c76c29b8cd026c9ad5cebcGeorge Sapountzis   XGetSubImage(dpy, readable, x, y, w, h, ~0L, ZPixmap, ximage, 0, 0);
2291087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
23060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   ximage->data = NULL;
2311087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
2321087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
2331087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzisstatic const __DRIswrastLoaderExtension swrastLoaderExtension = {
23460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   {__DRI_SWRAST_LOADER, __DRI_SWRAST_LOADER_VERSION},
23560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   swrastGetDrawableInfo,
23660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   swrastPutImage,
23760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   swrastGetImage
2381087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis};
2391087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
2401087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzisstatic const __DRIextension *loader_extensions[] = {
24160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   &systemTimeExtension.base,
24260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   &swrastLoaderExtension.base,
24360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   NULL
2441087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis};
2451087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
2461087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis/**
2471087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * GLXDRI functions
2481087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis */
2491087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
25060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristófstatic void
251c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergdrisw_destroy_context(struct glx_context *context)
2521087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
253a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_context *pcp = (struct drisw_context *) context;
25431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   struct drisw_screen *psc = (struct drisw_screen *) context->psc;
2551087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
256bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin   driReleaseDrawables(&pcp->base);
257bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin
258c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   if (context->extensions)
259c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg      XFree((char *) context->extensions);
260c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
261f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   (*psc->core->destroyContext) (pcp->driContext);
2621087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
26360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   Xfree(pcp);
2641087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
2651087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
266c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsbergstatic int
267c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsbergdrisw_bind_context(struct glx_context *context, struct glx_context *old,
268c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg		   GLXDrawable draw, GLXDrawable read)
2691087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
270a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_context *pcp = (struct drisw_context *) context;
2714d58b5b482d06ab8d4c4b2db33d0b48b7c82d064Kristian Høgsberg   struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc;
272c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   struct drisw_drawable *pdraw, *pread;
273c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
274c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   pdraw = (struct drisw_drawable *) driFetchDrawable(context, draw);
275c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   pread = (struct drisw_drawable *) driFetchDrawable(context, read);
276c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
277bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin   driReleaseDrawables(&pcp->base);
278bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin
279c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (pdraw == NULL || pread == NULL)
280c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      return GLXBadDrawable;
281c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
282c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if ((*psc->core->bindContext) (pcp->driContext,
283c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg				  pdraw->driDrawable, pread->driDrawable))
284c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      return Success;
2851087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
286c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   return GLXBadContext;
2871087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
2881087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
28960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristófstatic void
290c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsbergdrisw_unbind_context(struct glx_context *context, struct glx_context *new)
2911087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
292a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_context *pcp = (struct drisw_context *) context;
2934d58b5b482d06ab8d4c4b2db33d0b48b7c82d064Kristian Høgsberg   struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc;
2941087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
295f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   (*psc->core->unbindContext) (pcp->driContext);
2961087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
2971087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
29855e763c86da1aa2042d50d190d797574d6fb6fa8nobledstatic void
29955e763c86da1aa2042d50d190d797574d6fb6fa8nobleddrisw_bind_tex_image(Display * dpy,
30055e763c86da1aa2042d50d190d797574d6fb6fa8nobled		    GLXDrawable drawable,
30155e763c86da1aa2042d50d190d797574d6fb6fa8nobled		    int buffer, const int *attrib_list)
30255e763c86da1aa2042d50d190d797574d6fb6fa8nobled{
30355e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct glx_context *gc = __glXGetCurrentContext();
30455e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct drisw_context *pcp = (struct drisw_context *) gc;
30555e763c86da1aa2042d50d190d797574d6fb6fa8nobled   __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable);
30655e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct drisw_drawable *pdraw = (struct drisw_drawable *) base;
30755e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct drisw_screen *psc;
30855e763c86da1aa2042d50d190d797574d6fb6fa8nobled
3095016b09f897dd9d93ee1fc86949e0c3d7bd3b36fMarek Olšák   __glXInitialize(dpy);
3105016b09f897dd9d93ee1fc86949e0c3d7bd3b36fMarek Olšák
31155e763c86da1aa2042d50d190d797574d6fb6fa8nobled   if (pdraw != NULL) {
31255e763c86da1aa2042d50d190d797574d6fb6fa8nobled      psc = (struct drisw_screen *) base->psc;
31355e763c86da1aa2042d50d190d797574d6fb6fa8nobled
31455e763c86da1aa2042d50d190d797574d6fb6fa8nobled      if (!psc->texBuffer)
31555e763c86da1aa2042d50d190d797574d6fb6fa8nobled         return;
31655e763c86da1aa2042d50d190d797574d6fb6fa8nobled
31755e763c86da1aa2042d50d190d797574d6fb6fa8nobled      if (psc->texBuffer->base.version >= 2 &&
31855e763c86da1aa2042d50d190d797574d6fb6fa8nobled        psc->texBuffer->setTexBuffer2 != NULL) {
31955e763c86da1aa2042d50d190d797574d6fb6fa8nobled	      (*psc->texBuffer->setTexBuffer2) (pcp->driContext,
32055e763c86da1aa2042d50d190d797574d6fb6fa8nobled					   pdraw->base.textureTarget,
32155e763c86da1aa2042d50d190d797574d6fb6fa8nobled					   pdraw->base.textureFormat,
32255e763c86da1aa2042d50d190d797574d6fb6fa8nobled					   pdraw->driDrawable);
32355e763c86da1aa2042d50d190d797574d6fb6fa8nobled      }
32455e763c86da1aa2042d50d190d797574d6fb6fa8nobled      else {
32555e763c86da1aa2042d50d190d797574d6fb6fa8nobled	      (*psc->texBuffer->setTexBuffer) (pcp->driContext,
32655e763c86da1aa2042d50d190d797574d6fb6fa8nobled					  pdraw->base.textureTarget,
32755e763c86da1aa2042d50d190d797574d6fb6fa8nobled					  pdraw->driDrawable);
32855e763c86da1aa2042d50d190d797574d6fb6fa8nobled      }
32955e763c86da1aa2042d50d190d797574d6fb6fa8nobled   }
33055e763c86da1aa2042d50d190d797574d6fb6fa8nobled}
33155e763c86da1aa2042d50d190d797574d6fb6fa8nobled
33255e763c86da1aa2042d50d190d797574d6fb6fa8nobledstatic void
33355e763c86da1aa2042d50d190d797574d6fb6fa8nobleddrisw_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
33455e763c86da1aa2042d50d190d797574d6fb6fa8nobled{
33555e763c86da1aa2042d50d190d797574d6fb6fa8nobled#if __DRI_TEX_BUFFER_VERSION >= 3
33655e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct glx_context *gc = __glXGetCurrentContext();
33755e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct dri2_context *pcp = (struct dri2_context *) gc;
33855e763c86da1aa2042d50d190d797574d6fb6fa8nobled   __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable);
33955e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct glx_display *dpyPriv = __glXInitialize(dpy);
34055e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct dri2_drawable *pdraw = (struct dri2_drawable *) base;
34155e763c86da1aa2042d50d190d797574d6fb6fa8nobled   struct dri2_screen *psc;
34255e763c86da1aa2042d50d190d797574d6fb6fa8nobled
34355e763c86da1aa2042d50d190d797574d6fb6fa8nobled   if (pdraw != NULL) {
34455e763c86da1aa2042d50d190d797574d6fb6fa8nobled      psc = (struct dri2_screen *) base->psc;
34555e763c86da1aa2042d50d190d797574d6fb6fa8nobled
34655e763c86da1aa2042d50d190d797574d6fb6fa8nobled      if (!psc->texBuffer)
34755e763c86da1aa2042d50d190d797574d6fb6fa8nobled         return;
34855e763c86da1aa2042d50d190d797574d6fb6fa8nobled
34955e763c86da1aa2042d50d190d797574d6fb6fa8nobled      if (psc->texBuffer->base.version >= 3 &&
35055e763c86da1aa2042d50d190d797574d6fb6fa8nobled          psc->texBuffer->releaseTexBuffer != NULL) {
35155e763c86da1aa2042d50d190d797574d6fb6fa8nobled         (*psc->texBuffer->releaseTexBuffer) (pcp->driContext,
35255e763c86da1aa2042d50d190d797574d6fb6fa8nobled                                           pdraw->base.textureTarget,
35355e763c86da1aa2042d50d190d797574d6fb6fa8nobled                                           pdraw->driDrawable);
35455e763c86da1aa2042d50d190d797574d6fb6fa8nobled      }
35555e763c86da1aa2042d50d190d797574d6fb6fa8nobled   }
35655e763c86da1aa2042d50d190d797574d6fb6fa8nobled#endif
35755e763c86da1aa2042d50d190d797574d6fb6fa8nobled}
35855e763c86da1aa2042d50d190d797574d6fb6fa8nobled
3597b7845a076c933e096ac511b4184141ba194449aKristian Høgsbergstatic const struct glx_context_vtable drisw_context_vtable = {
360c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   drisw_destroy_context,
361c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   drisw_bind_context,
362c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   drisw_unbind_context,
3637b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   NULL,
3647b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   NULL,
3657b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   DRI_glXUseXFont,
36655e763c86da1aa2042d50d190d797574d6fb6fa8nobled   drisw_bind_tex_image,
36755e763c86da1aa2042d50d190d797574d6fb6fa8nobled   drisw_release_tex_image,
368559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston   NULL, /* get_proc_address */
3697b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg};
3707b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
371c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic struct glx_context *
37266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergdrisw_create_context(struct glx_screen *base,
3736ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg		     struct glx_config *config_base,
374c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg		     struct glx_context *shareList, int renderType)
3751087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
376a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_context *pcp, *pcp_shared;
3776ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
378f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct drisw_screen *psc = (struct drisw_screen *) base;
37960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   __DRIcontext *shared = NULL;
38060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
381f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   if (!psc->base.driScreen)
38260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      return NULL;
38360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
38460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (shareList) {
385c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick      /* If the shareList context is not a DRISW context, we cannot possibly
386c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick       * create a DRISW context that shares it.
387c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick       */
388c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick      if (shareList->vtable->destroy != drisw_destroy_context) {
389c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick	 return NULL;
390c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick      }
391c4a8c54c3bb31547cba57702ffea99293afef522Ian Romanick
392c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      pcp_shared = (struct drisw_context *) shareList;
39360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      shared = pcp_shared->driContext;
39460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   }
39560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
39660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   pcp = Xmalloc(sizeof *pcp);
39760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (pcp == NULL)
39860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      return NULL;
39960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
40031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   memset(pcp, 0, sizeof *pcp);
4016ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if (!glx_context_init(&pcp->base, &psc->base, &config->base)) {
40231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg      Xfree(pcp);
40331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg      return NULL;
40431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   }
40531819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg
40660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   pcp->driContext =
40770887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg      (*psc->core->createNewContext) (psc->driScreen,
408f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg				      config->driConfig, shared, pcp);
40960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (pcp->driContext == NULL) {
41060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      Xfree(pcp);
41160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      return NULL;
41260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   }
41360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
4147b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   pcp->base.vtable = &drisw_context_vtable;
41560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
41660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   return &pcp->base;
4171087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
4181087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
419296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanickstatic struct glx_context *
420296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanickdrisw_create_context_attribs(struct glx_screen *base,
421296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick			     struct glx_config *config_base,
422296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick			     struct glx_context *shareList,
423296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick			     unsigned num_attribs,
424296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick			     const uint32_t *attribs,
425296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick			     unsigned *error)
426296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick{
427296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   struct drisw_context *pcp, *pcp_shared;
428296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
429296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   struct drisw_screen *psc = (struct drisw_screen *) base;
430296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   __DRIcontext *shared = NULL;
431296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
432296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   uint32_t minor_ver = 1;
433296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   uint32_t major_ver = 0;
434296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   uint32_t flags = 0;
435296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   unsigned api;
43668bccc40f55aee7f4af8eb64b15a95f0b49d6a17Kenneth Graunke   int reset = __DRI_CTX_RESET_NO_NOTIFICATION;
437296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   uint32_t ctx_attribs[2 * 4];
438296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   unsigned num_ctx_attribs = 0;
439296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
440296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (!psc->base.driScreen)
441296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      return NULL;
442296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
443296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (psc->swrast->base.version < 3)
444296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      return NULL;
445296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
446296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   /* Remap the GLX tokens to DRI2 tokens.
447296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick    */
448296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (!dri2_convert_glx_attribs(num_attribs, attribs,
449a8724d85f8cb2f0fb73b9c6c1f268f9084c6d473Ian Romanick				 &major_ver, &minor_ver, &flags, &api, &reset,
450296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick				 error))
451296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      return NULL;
452296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
453a8724d85f8cb2f0fb73b9c6c1f268f9084c6d473Ian Romanick   if (reset != __DRI_CTX_RESET_NO_NOTIFICATION)
454a8724d85f8cb2f0fb73b9c6c1f268f9084c6d473Ian Romanick      return NULL;
455a8724d85f8cb2f0fb73b9c6c1f268f9084c6d473Ian Romanick
456296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (shareList) {
457296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      pcp_shared = (struct drisw_context *) shareList;
458296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      shared = pcp_shared->driContext;
459296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   }
460296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
461296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   pcp = Xmalloc(sizeof *pcp);
462296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (pcp == NULL)
463296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      return NULL;
464296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
465296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   memset(pcp, 0, sizeof *pcp);
466296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (!glx_context_init(&pcp->base, &psc->base, &config->base)) {
467296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      Xfree(pcp);
468296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      return NULL;
469296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   }
470296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
471296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION;
472296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   ctx_attribs[num_ctx_attribs++] = major_ver;
473296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MINOR_VERSION;
474296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   ctx_attribs[num_ctx_attribs++] = minor_ver;
475296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
476296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (flags != 0) {
477296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_FLAGS;
478296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
479296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      /* The current __DRI_CTX_FLAG_* values are identical to the
480296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick       * GLX_CONTEXT_*_BIT values.
481296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick       */
482296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      ctx_attribs[num_ctx_attribs++] = flags;
483296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   }
484296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
485296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   pcp->driContext =
486296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      (*psc->swrast->createContextAttribs) (psc->driScreen,
487296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick					    api,
488296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick					    config->driConfig,
489296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick					    shared,
490296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick					    num_ctx_attribs / 2,
491296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick					    ctx_attribs,
492296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick					    error,
493296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick					    pcp);
494296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (pcp->driContext == NULL) {
495296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      Xfree(pcp);
496296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      return NULL;
497296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   }
498296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
499296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   pcp->base.vtable = &drisw_context_vtable;
500296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
501296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   return &pcp->base;
502296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick}
503296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
50460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristófstatic void
5055a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam JacksondriswDestroyDrawable(__GLXDRIdrawable * pdraw)
5061087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
507a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_drawable *pdp = (struct drisw_drawable *) pdraw;
508f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct drisw_screen *psc = (struct drisw_screen *) pdp->base.psc;
5091087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
510271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   (*psc->core->destroyDrawable) (pdp->driDrawable);
5111087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
51260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   XDestroyDrawable(pdp, pdraw->psc->dpy, pdraw->drawable);
51360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   Xfree(pdp);
5141087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
5151087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
51660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristófstatic __GLXDRIdrawable *
5175a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam JacksondriswCreateDrawable(struct glx_screen *base, XID xDrawable,
5185a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam Jackson		    GLXDrawable drawable, struct glx_config *modes)
5191087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
520a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_drawable *pdp;
52160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
522f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct drisw_screen *psc = (struct drisw_screen *) base;
5232c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie   Bool ret;
52460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   const __DRIswrastExtension *swrast = psc->swrast;
5251087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
52660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   pdp = Xmalloc(sizeof(*pdp));
52760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (!pdp)
52860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      return NULL;
5291087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
5306393a33944ec9983426cecd5f6c9f05ac089e1aeKristian Høgsberg   memset(pdp, 0, sizeof *pdp);
531271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp->base.xDrawable = xDrawable;
532271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp->base.drawable = drawable;
533271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp->base.psc = &psc->base;
5341087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
5352c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie   ret = XCreateDrawable(pdp, psc->base.dpy, xDrawable, modes->visualID);
5362c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie   if (!ret) {
5372c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie      Xfree(pdp);
5382c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie      return NULL;
5392c778375a1356ffb8db1522bc3fc64c568c35cb1Dave Airlie   }
5401087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
54160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   /* Create a new drawable */
542271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   pdp->driDrawable =
543271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg      (*swrast->createNewDrawable) (psc->driScreen, config->driConfig, pdp);
5441087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
545271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   if (!pdp->driDrawable) {
546f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      XDestroyDrawable(pdp, psc->base.dpy, xDrawable);
54760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      Xfree(pdp);
54860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      return NULL;
54960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   }
5501087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
5515a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam Jackson   pdp->base.destroyDrawable = driswDestroyDrawable;
5521087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
553271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   return &pdp->base;
5541087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
5551087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
5562d1641b1917309d6397a6c9c773b801eb83838f8George Sapountzisstatic int64_t
5575a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam JacksondriswSwapBuffers(__GLXDRIdrawable * pdraw,
5585a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam Jackson                 int64_t target_msc, int64_t divisor, int64_t remainder)
559d3dc95e26a0da2b89e7a3cdf5bacbfc66ed17c95George Sapountzis{
560f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct drisw_drawable *pdp = (struct drisw_drawable *) pdraw;
561f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct drisw_screen *psc = (struct drisw_screen *) pdp->base.psc;
562f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
5632d1641b1917309d6397a6c9c773b801eb83838f8George Sapountzis   (void) target_msc;
5642d1641b1917309d6397a6c9c773b801eb83838f8George Sapountzis   (void) divisor;
5652d1641b1917309d6397a6c9c773b801eb83838f8George Sapountzis   (void) remainder;
5662d1641b1917309d6397a6c9c773b801eb83838f8George Sapountzis
567271c3c3a90ccfd01da9d7ac7fa451518f4e6a27cKristian Høgsberg   (*psc->core->swapBuffers) (pdp->driDrawable);
5682d1641b1917309d6397a6c9c773b801eb83838f8George Sapountzis
5692d1641b1917309d6397a6c9c773b801eb83838f8George Sapountzis   return 0;
570d3dc95e26a0da2b89e7a3cdf5bacbfc66ed17c95George Sapountzis}
571d3dc95e26a0da2b89e7a3cdf5bacbfc66ed17c95George Sapountzis
57260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristófstatic void
5735a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam JacksondriswDestroyScreen(struct glx_screen *base)
5741087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
575f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct drisw_screen *psc = (struct drisw_screen *) base;
576f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
57760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   /* Free the direct rendering per screen data */
57870887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   (*psc->core->destroyScreen) (psc->driScreen);
579bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   driDestroyConfigs(psc->driver_configs);
58070887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   psc->driScreen = NULL;
58160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (psc->driver)
58260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      dlclose(psc->driver);
5831087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
5841087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
58526de5273acf1ebe6730b5e72b55b3bcceba167c6Carl Worth#define SWRAST_DRIVER_NAME "swrast"
58626de5273acf1ebe6730b5e72b55b3bcceba167c6Carl Worth
58729ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzisstatic void *
58829ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George SapountzisdriOpenSwrast(void)
58929ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis{
59029ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis   void *driver = NULL;
59129ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis
59229ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis   if (driver == NULL)
59326de5273acf1ebe6730b5e72b55b3bcceba167c6Carl Worth      driver = driOpenDriver(SWRAST_DRIVER_NAME);
59429ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis
59529ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis   return driver;
59629ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis}
59729ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis
5986ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsbergstatic const struct glx_screen_vtable drisw_screen_vtable = {
599296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   drisw_create_context,
600296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   drisw_create_context_attribs
6016ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg};
6026ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
60355e763c86da1aa2042d50d190d797574d6fb6fa8nobledstatic void
60455e763c86da1aa2042d50d190d797574d6fb6fa8nobleddriswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions)
60555e763c86da1aa2042d50d190d797574d6fb6fa8nobled{
60655e763c86da1aa2042d50d190d797574d6fb6fa8nobled   int i;
60755e763c86da1aa2042d50d190d797574d6fb6fa8nobled
6086d3d0ca9e9ef0d0a1e3ba0940f7127298e078a7dAdam Jackson   __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read");
6096d3d0ca9e9ef0d0a1e3ba0940f7127298e078a7dAdam Jackson
610296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   if (psc->swrast->base.version >= 3) {
611296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context");
612296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick      __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile");
613e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick
614e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick      /* DRISW version >= 2 implies support for OpenGL ES 2.0.
615e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick       */
616e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick      __glXEnableDirectExtension(&psc->base,
617e6280c3ba9579bf01f8b82e19497ba8f142a8d09Ian Romanick				 "GLX_EXT_create_context_es2_profile");
618296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick   }
619296fe21ae5be838268e51fdd9a4a3009ab961265Ian Romanick
62055e763c86da1aa2042d50d190d797574d6fb6fa8nobled   /* FIXME: Figure out what other extensions can be ported here from dri2. */
62155e763c86da1aa2042d50d190d797574d6fb6fa8nobled   for (i = 0; extensions[i]; i++) {
62255e763c86da1aa2042d50d190d797574d6fb6fa8nobled      if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) {
62355e763c86da1aa2042d50d190d797574d6fb6fa8nobled	 psc->texBuffer = (__DRItexBufferExtension *) extensions[i];
62455e763c86da1aa2042d50d190d797574d6fb6fa8nobled	 __glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap");
62555e763c86da1aa2042d50d190d797574d6fb6fa8nobled      }
62655e763c86da1aa2042d50d190d797574d6fb6fa8nobled   }
62755e763c86da1aa2042d50d190d797574d6fb6fa8nobled}
62855e763c86da1aa2042d50d190d797574d6fb6fa8nobled
62966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergstatic struct glx_screen *
6305a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam JacksondriswCreateScreen(int screen, struct glx_display *priv)
6311087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
63260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   __GLXDRIscreen *psp;
63360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   const __DRIconfig **driver_configs;
63460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   const __DRIextension **extensions;
635f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   struct drisw_screen *psc;
63663a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   struct glx_config *configs = NULL, *visuals = NULL;
63760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   int i;
63860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
639f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   psc = Xcalloc(1, sizeof *psc);
640f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   if (psc == NULL)
64160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      return NULL;
64260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
643f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   memset(psc, 0, sizeof *psc);
6440b47d59e5be0fb5eb0277f02646914f4a55d35d5Henri Verbeet   if (!glx_screen_init(&psc->base, screen, priv)) {
6450b47d59e5be0fb5eb0277f02646914f4a55d35d5Henri Verbeet      Xfree(psc);
6460b47d59e5be0fb5eb0277f02646914f4a55d35d5Henri Verbeet      return NULL;
6470b47d59e5be0fb5eb0277f02646914f4a55d35d5Henri Verbeet   }
648f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg
64929ec84b0a80e1fe2e6f58f91ab63f2f9ebd012a6George Sapountzis   psc->driver = driOpenSwrast();
65060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (psc->driver == NULL)
65160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      goto handle_error;
65260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
65360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
65460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (extensions == NULL) {
65560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
65660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      goto handle_error;
65760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   }
65860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
65960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   for (i = 0; extensions[i]; i++) {
66060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
661f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg	 psc->core = (__DRIcoreExtension *) extensions[i];
66260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      if (strcmp(extensions[i]->name, __DRI_SWRAST) == 0)
663f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg	 psc->swrast = (__DRIswrastExtension *) extensions[i];
66460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   }
66560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
66660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (psc->core == NULL || psc->swrast == NULL) {
66760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      ErrorMessageF("core dri extension not found\n");
66860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      goto handle_error;
66960aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   }
67060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
67170887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   psc->driScreen =
672f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg      psc->swrast->createNewScreen(screen, loader_extensions,
673f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg				   &driver_configs, psc);
67470887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   if (psc->driScreen == NULL) {
67560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      ErrorMessageF("failed to create dri screen\n");
67660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      goto handle_error;
67760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   }
67860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
67955e763c86da1aa2042d50d190d797574d6fb6fa8nobled   extensions = psc->core->getExtensions(psc->driScreen);
68055e763c86da1aa2042d50d190d797574d6fb6fa8nobled   driswBindExtensions(psc, extensions);
68155e763c86da1aa2042d50d190d797574d6fb6fa8nobled
68263a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs);
68363a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
68463a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner
68563a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   if (!configs || !visuals)
68663a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner       goto handle_error;
68763a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner
68863a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   glx_config_destroy_list(psc->base.configs);
68963a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   psc->base.configs = configs;
69063a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   glx_config_destroy_list(psc->base.visuals);
69163a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   psc->base.visuals = visuals;
69260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
693bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   psc->driver_configs = driver_configs;
694fa5b0364f90be19bb0e1915f1eea691d06fb8929Kristof Ralovich
6956ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   psc->base.vtable = &drisw_screen_vtable;
69670887d517290060a80c7f5dd8c0ea0c834c4d91eKristian Høgsberg   psp = &psc->vtable;
697f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   psc->base.driScreen = psp;
6985a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam Jackson   psp->destroyScreen = driswDestroyScreen;
6995a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam Jackson   psp->createDrawable = driswCreateDrawable;
7005a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam Jackson   psp->swapBuffers = driswSwapBuffers;
70160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf
702f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg   return &psc->base;
7031087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
7041087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis handle_error:
70563a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   if (configs)
70663a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner       glx_config_destroy_list(configs);
70763a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   if (visuals)
70863a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner       glx_config_destroy_list(visuals);
70963a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   if (psc->driScreen)
71063a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner       psc->core->destroyScreen(psc->driScreen);
71163a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner   psc->driScreen = NULL;
71263a6fd6603574c1c01324fbeb0863e39d3864c16Aaron Plattner
71360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (psc->driver)
71460aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      dlclose(psc->driver);
7150b47d59e5be0fb5eb0277f02646914f4a55d35d5Henri Verbeet   glx_screen_cleanup(&psc->base);
716e3a0e468bc67e4169406bb4c96b5ab483dc48a28Kristian Høgsberg   Xfree(psc);
7171087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
71826de5273acf1ebe6730b5e72b55b3bcceba167c6Carl Worth   CriticalErrorMessageF("failed to load driver: %s\n", SWRAST_DRIVER_NAME);
7191087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
72060aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   return NULL;
7211087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
7221087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
7231087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis/* Called from __glXFreeDisplayPrivate.
7241087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis */
72560aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristófstatic void
7265a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam JacksondriswDestroyDisplay(__GLXDRIdisplay * dpy)
7271087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
72860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   Xfree(dpy);
7291087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
7301087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
7311087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis/*
7321087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * Allocate, initialize and return a __DRIdisplayPrivate object.
7331087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * This is called from __glXInitialize() when we are given a new
7341087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis * display pointer.
7351087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis */
73660aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf_X_HIDDEN __GLXDRIdisplay *
73760aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, KristófdriswCreateDisplay(Display * dpy)
7381087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis{
739a296d96de45d38a6ed0b3c817334d443facc169bKristian Høgsberg   struct drisw_display *pdpyp;
7401087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
74160aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   pdpyp = Xmalloc(sizeof *pdpyp);
74260aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   if (pdpyp == NULL)
74360aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf      return NULL;
7441087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
7455a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam Jackson   pdpyp->base.destroyDisplay = driswDestroyDisplay;
7465a6897ff0b62c6ec3ec49663a7e6a00550194bb9Adam Jackson   pdpyp->base.createScreen = driswCreateScreen;
7471087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
74860aa0918a120a9f971cd1f1fca5ce84e2c2e8297RALOVICH, Kristóf   return &pdpyp->base;
7491087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis}
7501087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis
7511087cc61b3776f4cdc991dcd95ee59dbd26307f3George Sapountzis#endif /* GLX_DIRECT_RENDERING */
752