Merge branch 'master' into glsl2
[mesa.git] / src / glx / dri_glx.c
index 7afdc86682dc836f7892c4381f3abe793cad40cc..43a2aa495a71dfde04c225c24eea881017ee3e49 100644 (file)
@@ -61,7 +61,7 @@ struct dri_display
 
 struct dri_screen
 {
-   __GLXscreenConfigs base;
+   struct glx_screen base;
 
    __DRIscreen *driScreen;
    __GLXDRIscreen vtable;
@@ -78,8 +78,7 @@ struct dri_screen
 
 struct dri_context
 {
-   __GLXcontext base;
-   __GLXDRIcontext dri_vtable;
+   struct glx_context base;
    __DRIcontext *driContext;
    XID hwContextID;
 };
@@ -226,7 +225,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;
 
@@ -278,7 +277,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,
@@ -499,7 +498,7 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
 }
 
 static void
-dri_destroy_context(__GLXcontext * context)
+dri_destroy_context(struct glx_context * context)
 {
    struct dri_context *pcp = (struct dri_context *) context;
    struct dri_screen *psc = (struct dri_screen *) context->psc;
@@ -518,21 +517,29 @@ dri_destroy_context(__GLXcontext * context)
    Xfree(pcp);
 }
 
-static Bool
-driBindContext(__GLXcontext *context,
-              __GLXDRIdrawable *draw, __GLXDRIdrawable *read)
+static int
+dri_bind_context(struct glx_context *context, struct glx_context *old,
+                GLXDrawable draw, GLXDrawable read)
 {
    struct dri_context *pcp = (struct dri_context *) context;
    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;
+   struct dri_drawable *pdraw, *pread;
+
+   pdraw = (struct dri_drawable *) driFetchDrawable(context, draw);
+   pread = (struct dri_drawable *) driFetchDrawable(context, read);
+
+   if (pdraw == NULL || pread == NULL)
+      return GLXBadDrawable;
 
-   return (*psc->core->bindContext) (pcp->driContext,
-                                    pdr->driDrawable, prd->driDrawable);
+   if ((*psc->core->bindContext) (pcp->driContext,
+                                 pdraw->driDrawable, pread->driDrawable))
+      return Success;
+
+   return GLXBadContext;
 }
 
 static void
-driUnbindContext(__GLXcontext * context)
+dri_unbind_context(struct glx_context *context, struct glx_context *new)
 {
    struct dri_context *pcp = (struct dri_context *) context;
    struct dri_screen *psc = (struct dri_screen *) pcp->base.psc;
@@ -542,6 +549,8 @@ driUnbindContext(__GLXcontext * context)
 
 static const struct glx_context_vtable dri_context_vtable = {
    dri_destroy_context,
+   dri_bind_context,
+   dri_unbind_context,
    NULL,
    NULL,
    DRI_glXUseXFont,
@@ -549,10 +558,10 @@ static const struct glx_context_vtable dri_context_vtable = {
    NULL,
 };
 
-static __GLXcontext *
-dri_create_context(__GLXscreenConfigs *base,
+static struct glx_context *
+dri_create_context(struct glx_screen *base,
                   struct glx_config *config_base,
-                  GLXContext shareList, int renderType)
+                  struct glx_context *shareList, int renderType)
 {
    struct dri_context *pcp, *pcp_shared;
    struct dri_screen *psc = (struct dri_screen *) base;
@@ -564,7 +573,7 @@ dri_create_context(__GLXscreenConfigs *base,
       return NULL;
 
    if (shareList) {
-      pcp_shared = (struct dri_context *) shareList->driContext;
+      pcp_shared = (struct dri_context *) shareList;
       shared = pcp_shared->driContext;
    }
 
@@ -596,9 +605,6 @@ dri_create_context(__GLXscreenConfigs *base,
    }
 
    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;
 }
@@ -615,7 +621,7 @@ driDestroyDrawable(__GLXDRIdrawable * pdraw)
 }
 
 static __GLXDRIdrawable *
-driCreateDrawable(__GLXscreenConfigs *base,
+driCreateDrawable(struct glx_screen *base,
                   XID xDrawable,
                   GLXDrawable drawable, struct glx_config *config_base)
 {
@@ -685,7 +691,7 @@ driCopySubBuffer(__GLXDRIdrawable * pdraw,
 }
 
 static void
-driDestroyScreen(__GLXscreenConfigs *base)
+driDestroyScreen(struct glx_screen *base)
 {
    struct dri_screen *psc = (struct dri_screen *) base;
 
@@ -701,7 +707,7 @@ driDestroyScreen(__GLXscreenConfigs *base)
 #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;
@@ -756,17 +762,12 @@ driWaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust,
 static int
 driSetSwapInterval(__GLXDRIdrawable *pdraw, int interval)
 {
-   GLXContext gc = __glXGetCurrentContext();
    struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
-   struct dri_screen *psc;
-
-   if (gc->driContext) {
-      psc = (struct dri_screen *) pdraw->psc;
+   struct dri_screen *psc = (struct dri_screen *) pdraw->psc;
 
-      if (psc->swapControl != NULL && pdraw != NULL) {
-        psc->swapControl->setSwapInterval(pdp->driDrawable, interval);
-        return 0;
-      }
+   if (psc->swapControl != NULL && pdraw != NULL) {
+      psc->swapControl->setSwapInterval(pdp->driDrawable, interval);
+      return 0;
    }
 
    return GLX_BAD_CONTEXT;
@@ -775,17 +776,11 @@ driSetSwapInterval(__GLXDRIdrawable *pdraw, int interval)
 static int
 driGetSwapInterval(__GLXDRIdrawable *pdraw)
 {
-   GLXContext gc = __glXGetCurrentContext();
    struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
-   struct dri_screen *psc;
-
-   if (gc != NULL && gc->driContext) {
-      psc = (struct dri_screen *) pdraw->psc;
+   struct dri_screen *psc = (struct dri_screen *) pdraw->psc;
 
-      if (psc->swapControl != NULL && pdraw != NULL) {
-        return psc->swapControl->getSwapInterval(pdp->driDrawable);
-      }
-   }
+   if (psc->swapControl != NULL && pdraw != NULL)
+      return psc->swapControl->getSwapInterval(pdp->driDrawable);
 
    return 0;
 }
@@ -826,8 +821,8 @@ static const struct glx_screen_vtable dri_screen_vtable = {
    dri_create_context
 };
 
-static __GLXscreenConfigs *
-driCreateScreen(int screen, __GLXdisplayPrivate *priv)
+static struct glx_screen *
+driCreateScreen(int screen, struct glx_display *priv)
 {
    struct dri_display *pdp;
    __GLXDRIscreen *psp;