glx: Rename __GLXcontext and __GLXdisplayPrivate to struct types.
[mesa.git] / src / glx / dri_glx.c
index d3facca84342d5c519782999c1b6398269625d0c..70281f663efc832e32334191cdb8dde97a55e635 100644 (file)
@@ -61,7 +61,7 @@ struct dri_display
 
 struct dri_screen
 {
-   __GLXscreenConfigs base;
+   struct glx_screen base;
 
    __DRIscreen *driScreen;
    __GLXDRIscreen vtable;
@@ -69,6 +69,8 @@ struct dri_screen
    const __DRIcoreExtension *core;
    const __DRIswapControlExtension *swapControl;
    const __DRImediaStreamCounterExtension *msc;
+   const __DRIconfig **driver_configs;
+   const __DRIcopySubBufferExtension *driCopySubBuffer;
 
    void *driver;
    int fd;
@@ -76,10 +78,10 @@ struct dri_screen
 
 struct dri_context
 {
-   __GLXDRIcontext base;
+   struct glx_context base;
+   __GLXDRIcontext dri_vtable;
    __DRIcontext *driContext;
    XID hwContextID;
-   __GLXscreenConfigs *psc;
 };
 
 struct dri_drawable
@@ -89,6 +91,8 @@ struct dri_drawable
    __DRIdrawable *driDrawable;
 };
 
+static const struct glx_context_vtable dri_context_vtable;
+
 /*
  * Given a display pointer and screen number, determine the name of
  * the DRI driver for the screen. (I.e. "r128", "tdfx", etc).
@@ -147,7 +151,7 @@ driGetDriverName(Display * dpy, int scrNum, char **driverName)
  * The returned char pointer points to a static array that will be
  * overwritten by subsequent calls.
  */
-PUBLIC const char *
+_X_EXPORT const char *
 glXGetScreenDriver(Display * dpy, int scrNum)
 {
    static char ret[32];
@@ -177,7 +181,7 @@ glXGetScreenDriver(Display * dpy, int scrNum)
  *
  * Note: The driver remains opened after this function returns.
  */
-PUBLIC const char *
+_X_EXPORT const char *
 glXGetDriverConfig(const char *driverName)
 {
    void *handle = driOpenDriver(driverName);
@@ -222,7 +226,7 @@ __glXReportDamage(__DRIdrawable * driDraw,
    int i;
    int x_off, y_off;
    __GLXDRIdrawable *glxDraw = loaderPrivate;
-   __GLXscreenConfigs *psc = glxDraw->psc;
+   struct glx_screen *psc = glxDraw->psc;
    Display *dpy = psc->dpy;
    Drawable drawable;
 
@@ -274,7 +278,7 @@ __glXDRIGetDrawableInfo(__DRIdrawable * drawable,
                         void *loaderPrivate)
 {
    __GLXDRIdrawable *glxDraw = loaderPrivate;
-   __GLXscreenConfigs *psc = glxDraw->psc;
+   struct glx_screen *psc = glxDraw->psc;
    Display *dpy = psc->dpy;
 
    return XF86DRIGetDrawableInfo(dpy, psc->scr, glxDraw->drawable,
@@ -333,7 +337,7 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
    drm_handle_t hFB;
    int junk;
    const __DRIconfig **driver_configs;
-   __GLcontextModes *visual;
+   struct glx_config *visual;
 
    /* DRI protocol version. */
    dri_version.major = driDpy->driMajor;
@@ -448,7 +452,7 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
    psc->base.visuals =
       driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
 
-   psc->base.driver_configs = driver_configs;
+   psc->driver_configs = driver_configs;
 
    /* Visuals with depth != screen depth are subject to automatic compositing
     * in the X server, so DRI1 can't render to them properly. Mark them as
@@ -495,11 +499,18 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
 }
 
 static void
-driDestroyContext(__GLXDRIcontext * context,
-                  __GLXscreenConfigs *base, Display * dpy)
+dri_destroy_context(struct glx_context * context)
 {
    struct dri_context *pcp = (struct dri_context *) context;
-   struct dri_screen *psc = (struct dri_screen *) base;
+   struct dri_screen *psc = (struct dri_screen *) context->psc;
+
+   if (context->xid)
+      glx_send_destroy_context(psc->base.dpy, context->xid);
+
+   if (context->extensions)
+      XFree((char *) context->extensions);
+
+   GarbageCollectDRIDrawables(context->psc);
 
    (*psc->core->destroyContext) (pcp->driContext);
 
@@ -508,11 +519,11 @@ driDestroyContext(__GLXDRIcontext * context,
 }
 
 static Bool
-driBindContext(__GLXDRIcontext *context,
+driBindContext(struct glx_context *context,
               __GLXDRIdrawable *draw, __GLXDRIdrawable *read)
 {
    struct dri_context *pcp = (struct dri_context *) context;
-   struct dri_screen *psc = (struct dri_screen *) pcp->psc;
+   struct dri_screen *psc = (struct dri_screen *) pcp->base.psc;
    struct dri_drawable *pdr = (struct dri_drawable *) draw;
    struct dri_drawable *prd = (struct dri_drawable *) read;
 
@@ -521,24 +532,33 @@ driBindContext(__GLXDRIcontext *context,
 }
 
 static void
-driUnbindContext(__GLXDRIcontext * context)
+driUnbindContext(struct glx_context * context)
 {
    struct dri_context *pcp = (struct dri_context *) context;
-   struct dri_screen *psc = (struct dri_screen *) pcp->psc;
+   struct dri_screen *psc = (struct dri_screen *) pcp->base.psc;
 
    (*psc->core->unbindContext) (pcp->driContext);
 }
 
-static __GLXDRIcontext *
-driCreateContext(__GLXscreenConfigs *base,
-                 const __GLcontextModes * mode,
-                 GLXContext gc, GLXContext shareList, int renderType)
+static const struct glx_context_vtable dri_context_vtable = {
+   dri_destroy_context,
+   NULL,
+   NULL,
+   DRI_glXUseXFont,
+   NULL,
+   NULL,
+};
+
+static struct glx_context *
+dri_create_context(struct glx_screen *base,
+                  struct glx_config *config_base,
+                  struct glx_context *shareList, int renderType)
 {
    struct dri_context *pcp, *pcp_shared;
    struct dri_screen *psc = (struct dri_screen *) base;
    drm_context_t hwContext;
    __DRIcontext *shared = NULL;
-   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode;
+   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
 
    if (!psc->base.driScreen)
       return NULL;
@@ -552,9 +572,14 @@ driCreateContext(__GLXscreenConfigs *base,
    if (pcp == NULL)
       return NULL;
 
-   pcp->psc = &psc->base;
+   memset(pcp, 0, sizeof *pcp);
+   if (!glx_context_init(&pcp->base, &psc->base, &config->base)) {
+      Xfree(pcp);
+      return NULL;
+   }
+
    if (!XF86DRICreateContextWithConfig(psc->base.dpy, psc->base.scr,
-                                       mode->visualID,
+                                       config->base.visualID,
                                        &pcp->hwContextID, &hwContext)) {
       Xfree(pcp);
       return NULL;
@@ -570,9 +595,10 @@ driCreateContext(__GLXscreenConfigs *base,
       return NULL;
    }
 
-   pcp->base.destroyContext = driDestroyContext;
-   pcp->base.bindContext = driBindContext;
-   pcp->base.unbindContext = driUnbindContext;
+   pcp->base.vtable = &dri_context_vtable;
+   pcp->base.driContext = &pcp->dri_vtable;
+   pcp->dri_vtable.bindContext = driBindContext;
+   pcp->dri_vtable.unbindContext = driUnbindContext;
 
    return &pcp->base;
 }
@@ -589,13 +615,13 @@ driDestroyDrawable(__GLXDRIdrawable * pdraw)
 }
 
 static __GLXDRIdrawable *
-driCreateDrawable(__GLXscreenConfigs *base,
+driCreateDrawable(struct glx_screen *base,
                   XID xDrawable,
-                  GLXDrawable drawable, const __GLcontextModes * modes)
+                  GLXDrawable drawable, struct glx_config *config_base)
 {
    drm_drawable_t hwDrawable;
    void *empty_attribute_list = NULL;
-   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
+   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
    struct dri_screen *psc = (struct dri_screen *) base;
    struct dri_drawable *pdp;
 
@@ -607,6 +633,7 @@ driCreateDrawable(__GLXscreenConfigs *base,
    if (!pdp)
       return NULL;
 
+   memset(pdp, 0, sizeof *pdp);
    pdp->base.drawable = drawable;
    pdp->base.psc = &psc->base;
 
@@ -651,33 +678,30 @@ driCopySubBuffer(__GLXDRIdrawable * pdraw,
                  int x, int y, int width, int height)
 {
    struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
+   struct dri_screen *psc = (struct dri_screen *) pdp->base.psc;
 
-   (*pdp->base.psc->driCopySubBuffer->copySubBuffer) (pdp->driDrawable,
-                                                     x, y, width, height);
+   (*psc->driCopySubBuffer->copySubBuffer) (pdp->driDrawable,
+                                           x, y, width, height);
 }
 
 static void
-driDestroyScreen(__GLXscreenConfigs *base)
+driDestroyScreen(struct glx_screen *base)
 {
    struct dri_screen *psc = (struct dri_screen *) base;
 
    /* Free the direct rendering per screen data */
    if (psc->driScreen)
       (*psc->core->destroyScreen) (psc->driScreen);
+   driDestroyConfigs(psc->driver_configs);
    psc->driScreen = NULL;
    if (psc->driver)
       dlclose(psc->driver);
 }
 
-static const struct glx_context_vtable dri_context_vtable = {
-   NULL,
-   NULL,
-};
-
 #ifdef __DRI_SWAP_BUFFER_COUNTER
 
 static int
-driDrawableGetMSC(__GLXscreenConfigs *base, __GLXDRIdrawable *pdraw,
+driDrawableGetMSC(struct glx_screen *base, __GLXDRIdrawable *pdraw,
                   int64_t *ust, int64_t *msc, int64_t *sbc)
 {
    struct dri_screen *psc = (struct dri_screen *) base;
@@ -732,7 +756,7 @@ driWaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust,
 static int
 driSetSwapInterval(__GLXDRIdrawable *pdraw, int interval)
 {
-   GLXContext gc = __glXGetCurrentContext();
+   struct glx_context *gc = __glXGetCurrentContext();
    struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
    struct dri_screen *psc;
 
@@ -751,7 +775,7 @@ driSetSwapInterval(__GLXDRIdrawable *pdraw, int interval)
 static int
 driGetSwapInterval(__GLXDRIdrawable *pdraw)
 {
-   GLXContext gc = __glXGetCurrentContext();
+   struct glx_context *gc = __glXGetCurrentContext();
    struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
    struct dri_screen *psc;
 
@@ -786,12 +810,24 @@ driBindExtensions(struct dri_screen *psc, const __DRIextension **extensions)
          __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync");
       }
 
+      if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
+        psc->driCopySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
+        __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer");
+      }
+
+      if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
+        __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read");
+      }
       /* Ignore unknown extensions */
    }
 }
 
-static __GLXscreenConfigs *
-driCreateScreen(int screen, __GLXdisplayPrivate *priv)
+static const struct glx_screen_vtable dri_screen_vtable = {
+   dri_create_context
+};
+
+static struct glx_screen *
+driCreateScreen(int screen, struct glx_display *priv)
 {
    struct dri_display *pdp;
    __GLXDRIscreen *psp;
@@ -850,19 +886,16 @@ driCreateScreen(int screen, __GLXdisplayPrivate *priv)
 
    extensions = psc->core->getExtensions(psc->driScreen);
    driBindExtensions(psc, extensions);
-   driBindCommonExtensions(&psc->base, extensions);
 
+   psc->base.vtable = &dri_screen_vtable;
    psp = &psc->vtable;
    psc->base.driScreen = psp;
-   if (psc->base.driCopySubBuffer)
+   if (psc->driCopySubBuffer)
       psp->copySubBuffer = driCopySubBuffer;
 
    psp->destroyScreen = driDestroyScreen;
-   psp->createContext = driCreateContext;
    psp->createDrawable = driCreateDrawable;
    psp->swapBuffers = driSwapBuffers;
-   psp->waitX = NULL;
-   psp->waitGL = NULL;
 
 #ifdef __DRI_SWAP_BUFFER_COUNTER
    psp->getDrawableMSC = driDrawableGetMSC;
@@ -873,8 +906,6 @@ driCreateScreen(int screen, __GLXdisplayPrivate *priv)
    psp->setSwapInterval = driSetSwapInterval;
    psp->getSwapInterval = driGetSwapInterval;
 
-   psc->base.direct_context_vtable = &dri_context_vtable;
-
    return &psc->base;
 }