X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglx%2Fdrisw_glx.c;h=e8cc4c83e06ea25c3333597232f12e703fa66f90;hb=b24f291e429b94ca7de74f8b32279e3a0375cd9c;hp=e9a88e6db0cb3786f457328a582ccc8e61478243;hpb=70887d517290060a80c7f5dd8c0ea0c834c4d91e;p=mesa.git diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index e9a88e6db0c..e8cc4c83e06 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -35,19 +35,21 @@ struct drisw_display struct drisw_context { - __GLXDRIcontext base; + struct glx_context base; __DRIcontext *driContext; - __GLXscreenConfigs *psc; + }; struct drisw_screen { - __GLXscreenConfigs base; + struct glx_screen base; __DRIscreen *driScreen; __GLXDRIscreen vtable; const __DRIcoreExtension *core; const __DRIswrastExtension *swrast; + const __DRIconfig **driver_configs; + void *driver; }; @@ -58,6 +60,7 @@ struct drisw_drawable GC gc; GC swapgc; + __DRIdrawable *driDrawable; XVisualInfo *visinfo; XImage *ximage; }; @@ -125,13 +128,11 @@ swrastGetDrawableInfo(__DRIdrawable * draw, Drawable drawable; Window root; - Status stat; unsigned uw, uh, bw, depth; drawable = pdraw->xDrawable; - stat = XGetGeometry(dpy, drawable, &root, - x, y, &uw, &uh, &bw, &depth); + XGetGeometry(dpy, drawable, &root, x, y, &uw, &uh, &bw, &depth); *w = uw; *h = uh; } @@ -236,44 +237,72 @@ static const __DRIextension *loader_extensions[] = { */ static void -driDestroyContext(__GLXDRIcontext *context, - __GLXscreenConfigs *base, Display *dpy) +drisw_destroy_context(struct glx_context *context) { struct drisw_context *pcp = (struct drisw_context *) context; - struct drisw_screen *psc = (struct drisw_screen *) base; + struct drisw_screen *psc = (struct drisw_screen *) context->psc; + + if (context->xid) + glx_send_destroy_context(psc->base.dpy, context->xid); + + if (context->extensions) + XFree((char *) context->extensions); (*psc->core->destroyContext) (pcp->driContext); Xfree(pcp); } -static Bool -driBindContext(__GLXDRIcontext * context, - __GLXDRIdrawable * draw, __GLXDRIdrawable * read) +static int +drisw_bind_context(struct glx_context *context, struct glx_context *old, + GLXDrawable draw, GLXDrawable read) { struct drisw_context *pcp = (struct drisw_context *) context; - struct drisw_screen *psc = (struct drisw_screen *) pcp->psc; + struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc; + struct drisw_drawable *pdraw, *pread; - return (*psc->core->bindContext) (pcp->driContext, - draw->driDrawable, read->driDrawable); + pdraw = (struct drisw_drawable *) driFetchDrawable(context, draw); + pread = (struct drisw_drawable *) driFetchDrawable(context, read); + + if (pdraw == NULL || pread == NULL) + return GLXBadDrawable; + + if ((*psc->core->bindContext) (pcp->driContext, + pdraw->driDrawable, pread->driDrawable)) + return Success; + + return GLXBadContext; } static void -driUnbindContext(__GLXDRIcontext * context) +drisw_unbind_context(struct glx_context *context, struct glx_context *new) { struct drisw_context *pcp = (struct drisw_context *) context; - struct drisw_screen *psc = (struct drisw_screen *) pcp->psc; + struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc; (*psc->core->unbindContext) (pcp->driContext); + + driReleaseDrawables(&pcp->base); } -static __GLXDRIcontext * -driCreateContext(__GLXscreenConfigs *base, - const __GLcontextModes *mode, - GLXContext gc, GLXContext shareList, int renderType) +static const struct glx_context_vtable drisw_context_vtable = { + drisw_destroy_context, + drisw_bind_context, + drisw_unbind_context, + NULL, + NULL, + DRI_glXUseXFont, + NULL, + NULL, +}; + +static struct glx_context * +drisw_create_context(struct glx_screen *base, + struct glx_config *config_base, + struct glx_context *shareList, int renderType) { struct drisw_context *pcp, *pcp_shared; - __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode; + __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; struct drisw_screen *psc = (struct drisw_screen *) base; __DRIcontext *shared = NULL; @@ -281,7 +310,7 @@ driCreateContext(__GLXscreenConfigs *base, return NULL; if (shareList) { - pcp_shared = (struct drisw_context *) shareList->driContext; + pcp_shared = (struct drisw_context *) shareList; shared = pcp_shared->driContext; } @@ -289,7 +318,12 @@ 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; + } + pcp->driContext = (*psc->core->createNewContext) (psc->driScreen, config->driConfig, shared, pcp); @@ -298,9 +332,7 @@ driCreateContext(__GLXscreenConfigs *base, return NULL; } - pcp->base.destroyContext = driDestroyContext; - pcp->base.bindContext = driBindContext; - pcp->base.unbindContext = driUnbindContext; + pcp->base.vtable = &drisw_context_vtable; return &pcp->base; } @@ -311,17 +343,16 @@ driDestroyDrawable(__GLXDRIdrawable * pdraw) struct drisw_drawable *pdp = (struct drisw_drawable *) pdraw; struct drisw_screen *psc = (struct drisw_screen *) pdp->base.psc; - (*psc->core->destroyDrawable) (pdraw->driDrawable); + (*psc->core->destroyDrawable) (pdp->driDrawable); XDestroyDrawable(pdp, pdraw->psc->dpy, pdraw->drawable); Xfree(pdp); } static __GLXDRIdrawable * -driCreateDrawable(__GLXscreenConfigs *base, XID xDrawable, - GLXDrawable drawable, const __GLcontextModes * modes) +driCreateDrawable(struct glx_screen *base, XID xDrawable, + GLXDrawable drawable, struct glx_config *modes) { - __GLXDRIdrawable *pdraw; struct drisw_drawable *pdp; __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes; struct drisw_screen *psc = (struct drisw_screen *) base; @@ -336,27 +367,26 @@ driCreateDrawable(__GLXscreenConfigs *base, XID xDrawable, if (!pdp) return NULL; - pdraw = &(pdp->base); - pdraw->xDrawable = xDrawable; - pdraw->drawable = drawable; - pdraw->psc = &psc->base; + memset(pdp, 0, sizeof *pdp); + pdp->base.xDrawable = xDrawable; + pdp->base.drawable = drawable; + pdp->base.psc = &psc->base; XCreateDrawable(pdp, psc->base.dpy, xDrawable, modes->visualID); /* Create a new drawable */ - pdraw->driDrawable = - (*swrast->createNewDrawable) (psc->driScreen, - config->driConfig, pdp); + pdp->driDrawable = + (*swrast->createNewDrawable) (psc->driScreen, config->driConfig, pdp); - if (!pdraw->driDrawable) { + if (!pdp->driDrawable) { XDestroyDrawable(pdp, psc->base.dpy, xDrawable); Xfree(pdp); return NULL; } - pdraw->destroyDrawable = driDestroyDrawable; + pdp->base.destroyDrawable = driDestroyDrawable; - return pdraw; + return &pdp->base; } static int64_t @@ -370,18 +400,19 @@ driSwapBuffers(__GLXDRIdrawable * pdraw, (void) divisor; (void) remainder; - (*psc->core->swapBuffers) (pdraw->driDrawable); + (*psc->core->swapBuffers) (pdp->driDrawable); return 0; } static void -driDestroyScreen(__GLXscreenConfigs *base) +driDestroyScreen(struct glx_screen *base) { struct drisw_screen *psc = (struct drisw_screen *) base; /* Free the direct rendering per screen data */ (*psc->core->destroyScreen) (psc->driScreen); + driDestroyConfigs(psc->driver_configs); psc->driScreen = NULL; if (psc->driver) dlclose(psc->driver); @@ -401,8 +432,12 @@ driOpenSwrast(void) return driver; } -static __GLXscreenConfigs * -driCreateScreen(int screen, __GLXdisplayPrivate *priv) +static const struct glx_screen_vtable drisw_screen_vtable = { + drisw_create_context +}; + +static struct glx_screen * +driCreateScreen(int screen, struct glx_display *priv) { __GLXDRIscreen *psp; const __DRIconfig **driver_configs; @@ -415,8 +450,10 @@ driCreateScreen(int screen, __GLXdisplayPrivate *priv) return NULL; memset(psc, 0, sizeof *psc); - if (!glx_screen_init(&psc->base, screen, priv)) - return NULL; + if (!glx_screen_init(&psc->base, screen, priv)) { + Xfree(psc); + return NULL; + } psc->driver = driOpenSwrast(); if (psc->driver == NULL) @@ -448,32 +485,27 @@ driCreateScreen(int screen, __GLXdisplayPrivate *priv) goto handle_error; } - extensions = psc->core->getExtensions(psc->driScreen); - driBindCommonExtensions(&psc->base, extensions); - psc->base.configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs); psc->base.visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs); - psc->base.driver_configs = driver_configs; + psc->driver_configs = driver_configs; + psc->base.vtable = &drisw_screen_vtable; psp = &psc->vtable; psc->base.driScreen = psp; psp->destroyScreen = driDestroyScreen; - psp->createContext = driCreateContext; psp->createDrawable = driCreateDrawable; psp->swapBuffers = driSwapBuffers; - psp->waitX = NULL; - psp->waitGL = NULL; return &psc->base; handle_error: - Xfree(psc); - if (psc->driver) dlclose(psc->driver); + glx_screen_cleanup(&psc->base); + Xfree(psc); ErrorMessageF("reverting to indirect rendering\n");