diff options
Diffstat (limited to 'src/glx/drisw_glx.c')
-rw-r--r-- | src/glx/drisw_glx.c | 226 |
1 files changed, 137 insertions, 89 deletions
diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index cdb1d9f4dc3..5f7185de4c8 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -28,35 +28,46 @@ #include <dlfcn.h> #include "dri_common.h" -typedef struct __GLXDRIdisplayPrivateRec __GLXDRIdisplayPrivate; -typedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate; -typedef struct __GLXDRIdrawablePrivateRec __GLXDRIdrawablePrivate; - -struct __GLXDRIdisplayPrivateRec +struct drisw_display { __GLXDRIdisplay base; }; -struct __GLXDRIcontextPrivateRec +struct drisw_context { - __GLXDRIcontext base; + __GLXcontext base; + __GLXDRIcontext dri_vtable; __DRIcontext *driContext; - __GLXscreenConfigs *psc; + }; -struct __GLXDRIdrawablePrivateRec +struct drisw_screen +{ + __GLXscreenConfigs base; + + __DRIscreen *driScreen; + __GLXDRIscreen vtable; + const __DRIcoreExtension *core; + const __DRIswrastExtension *swrast; + const __DRIconfig **driver_configs; + + void *driver; +}; + +struct drisw_drawable { __GLXDRIdrawable base; GC gc; GC swapgc; + __DRIdrawable *driDrawable; XVisualInfo *visinfo; XImage *ximage; }; static Bool -XCreateDrawable(__GLXDRIdrawablePrivate * pdp, +XCreateDrawable(struct drisw_drawable * pdp, Display * dpy, XID drawable, int visualid) { XGCValues gcvalues; @@ -94,7 +105,7 @@ XCreateDrawable(__GLXDRIdrawablePrivate * pdp, } static void -XDestroyDrawable(__GLXDRIdrawablePrivate * pdp, Display * dpy, XID drawable) +XDestroyDrawable(struct drisw_drawable * pdp, Display * dpy, XID drawable) { XDestroyImage(pdp->ximage); XFree(pdp->visinfo); @@ -112,7 +123,7 @@ swrastGetDrawableInfo(__DRIdrawable * draw, int *x, int *y, int *w, int *h, void *loaderPrivate) { - __GLXDRIdrawablePrivate *pdp = loaderPrivate; + struct drisw_drawable *pdp = loaderPrivate; __GLXDRIdrawable *pdraw = &(pdp->base); Display *dpy = pdraw->psc->dpy; Drawable drawable; @@ -156,7 +167,7 @@ swrastPutImage(__DRIdrawable * draw, int op, int x, int y, int w, int h, char *data, void *loaderPrivate) { - __GLXDRIdrawablePrivate *pdp = loaderPrivate; + struct drisw_drawable *pdp = loaderPrivate; __GLXDRIdrawable *pdraw = &(pdp->base); Display *dpy = pdraw->psc->dpy; Drawable drawable; @@ -192,7 +203,7 @@ swrastGetImage(__DRIdrawable * read, int x, int y, int w, int h, char *data, void *loaderPrivate) { - __GLXDRIdrawablePrivate *prp = loaderPrivate; + struct drisw_drawable *prp = loaderPrivate; __GLXDRIdrawable *pread = &(prp->base); Display *dpy = pread->psc->dpy; Drawable readable; @@ -229,54 +240,70 @@ static const __DRIextension *loader_extensions[] = { */ static void -driDestroyContext(__GLXDRIcontext * context, - __GLXscreenConfigs * psc, Display * dpy) +drisw_destroy_context(__GLXcontext *context) { - __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; - const __DRIcoreExtension *core = pcp->psc->core; + struct drisw_context *pcp = (struct drisw_context *) context; + struct drisw_screen *psc = (struct drisw_screen *) context->psc; + + if (context->xid) + glx_send_destroy_context(psc->base.dpy, context->xid); - (*core->destroyContext) (pcp->driContext); + if (context->extensions) + XFree((char *) context->extensions); + + GarbageCollectDRIDrawables(context->psc); + + (*psc->core->destroyContext) (pcp->driContext); Xfree(pcp); } static Bool -driBindContext(__GLXDRIcontext * context, - __GLXDRIdrawable * draw, __GLXDRIdrawable * read) +driBindContext(__GLXcontext * context, + __GLXDRIdrawable * draw, __GLXDRIdrawable * read) { - __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; - const __DRIcoreExtension *core = pcp->psc->core; + struct drisw_context *pcp = (struct drisw_context *) context; + struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc; + struct drisw_drawable *pdr = (struct drisw_drawable *) draw; + struct drisw_drawable *prd = (struct drisw_drawable *) read; - return (*core->bindContext) (pcp->driContext, - draw->driDrawable, read->driDrawable); + return (*psc->core->bindContext) (pcp->driContext, + pdr->driDrawable, prd->driDrawable); } static void -driUnbindContext(__GLXDRIcontext * context) +driUnbindContext(__GLXcontext * context) { - __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; - const __DRIcoreExtension *core = pcp->psc->core; + struct drisw_context *pcp = (struct drisw_context *) context; + struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc; - (*core->unbindContext) (pcp->driContext); + (*psc->core->unbindContext) (pcp->driContext); } -static __GLXDRIcontext * -driCreateContext(__GLXscreenConfigs * psc, - const __GLcontextModes * mode, - GLXContext gc, GLXContext shareList, int renderType) +static const struct glx_context_vtable drisw_context_vtable = { + drisw_destroy_context, + NULL, + NULL, + DRI_glXUseXFont, + NULL, + NULL, +}; + +static __GLXcontext * +drisw_create_context(__GLXscreenConfigs *base, + const __GLcontextModes *mode, + GLXContext shareList, int renderType) { - __GLXDRIcontextPrivate *pcp, *pcp_shared; + struct drisw_context *pcp, *pcp_shared; __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode; - const __DRIcoreExtension *core; + struct drisw_screen *psc = (struct drisw_screen *) base; __DRIcontext *shared = NULL; - if (!psc || !psc->driScreen) + if (!psc->base.driScreen) return NULL; - core = psc->core; - if (shareList) { - pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext; + pcp_shared = (struct drisw_context *) shareList->driContext; shared = pcp_shared->driContext; } @@ -284,18 +311,24 @@ driCreateContext(__GLXscreenConfigs * psc, if (pcp == NULL) return NULL; - pcp->psc = psc; + memset(pcp, 0, sizeof *pcp); + if (!glx_context_init(&pcp->base, &psc->base, mode)) { + Xfree(pcp); + return NULL; + } + pcp->driContext = - (*core->createNewContext) (psc->__driScreen, - config->driConfig, shared, pcp); + (*psc->core->createNewContext) (psc->driScreen, + config->driConfig, shared, pcp); if (pcp->driContext == NULL) { Xfree(pcp); return NULL; } - pcp->base.destroyContext = driDestroyContext; - pcp->base.bindContext = driBindContext; - pcp->base.unbindContext = driUnbindContext; + pcp->base.vtable = &drisw_context_vtable; + pcp->base.driContext = &pcp->dri_vtable; + pcp->dri_vtable.bindContext = driBindContext; + pcp->dri_vtable.unbindContext = driUnbindContext; return &pcp->base; } @@ -303,23 +336,23 @@ driCreateContext(__GLXscreenConfigs * psc, static void driDestroyDrawable(__GLXDRIdrawable * pdraw) { - __GLXDRIdrawablePrivate *pdp = (__GLXDRIdrawablePrivate *) pdraw; - const __DRIcoreExtension *core = pdraw->psc->core; + struct drisw_drawable *pdp = (struct drisw_drawable *) pdraw; + struct drisw_screen *psc = (struct drisw_screen *) pdp->base.psc; - (*core->destroyDrawable) (pdraw->driDrawable); + (*psc->core->destroyDrawable) (pdp->driDrawable); XDestroyDrawable(pdp, pdraw->psc->dpy, pdraw->drawable); Xfree(pdp); } static __GLXDRIdrawable * -driCreateDrawable(__GLXscreenConfigs * psc, - XID xDrawable, - GLXDrawable drawable, const __GLcontextModes * modes) +driCreateDrawable(__GLXscreenConfigs *base, XID xDrawable, + GLXDrawable drawable, const __GLcontextModes * modes) { - __GLXDRIdrawable *pdraw; - __GLXDRIdrawablePrivate *pdp; + struct drisw_drawable *pdp; __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes; + struct drisw_screen *psc = (struct drisw_screen *) base; + const __DRIswrastExtension *swrast = psc->swrast; /* Old dri can't handle GLX 1.3+ drawable constructors. */ @@ -330,47 +363,53 @@ driCreateDrawable(__GLXscreenConfigs * psc, if (!pdp) return NULL; - pdraw = &(pdp->base); - pdraw->xDrawable = xDrawable; - pdraw->drawable = drawable; - pdraw->psc = psc; + memset(pdp, 0, sizeof *pdp); + pdp->base.xDrawable = xDrawable; + pdp->base.drawable = drawable; + pdp->base.psc = &psc->base; - XCreateDrawable(pdp, psc->dpy, xDrawable, modes->visualID); + 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) { - XDestroyDrawable(pdp, psc->dpy, xDrawable); + 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 driSwapBuffers(__GLXDRIdrawable * pdraw, int64_t target_msc, int64_t divisor, int64_t remainder) { + struct drisw_drawable *pdp = (struct drisw_drawable *) pdraw; + struct drisw_screen *psc = (struct drisw_screen *) pdp->base.psc; + (void) target_msc; (void) divisor; (void) remainder; - (*pdraw->psc->core->swapBuffers) (pdraw->driDrawable); + (*psc->core->swapBuffers) (pdp->driDrawable); return 0; } static void -driDestroyScreen(__GLXscreenConfigs * psc) +driDestroyScreen(__GLXscreenConfigs *base) { + struct drisw_screen *psc = (struct drisw_screen *) base; + /* Free the direct rendering per screen data */ - (*psc->core->destroyScreen) (psc->__driScreen); - psc->__driScreen = NULL; + (*psc->core->destroyScreen) (psc->driScreen); + driDestroyConfigs(psc->driver_configs); + psc->driScreen = NULL; if (psc->driver) dlclose(psc->driver); } @@ -389,19 +428,27 @@ driOpenSwrast(void) return driver; } -static __GLXDRIscreen * -driCreateScreen(__GLXscreenConfigs * psc, int screen, - __GLXdisplayPrivate * priv) +static const struct glx_screen_vtable drisw_screen_vtable = { + drisw_create_context +}; + +static __GLXscreenConfigs * +driCreateScreen(int screen, __GLXdisplayPrivate *priv) { __GLXDRIscreen *psp; const __DRIconfig **driver_configs; const __DRIextension **extensions; + struct drisw_screen *psc; int i; - psp = Xcalloc(1, sizeof *psp); - if (psp == NULL) + psc = Xcalloc(1, sizeof *psc); + if (psc == NULL) return NULL; + memset(psc, 0, sizeof *psc); + if (!glx_screen_init(&psc->base, screen, priv)) + return NULL; + psc->driver = driOpenSwrast(); if (psc->driver == NULL) goto handle_error; @@ -414,9 +461,9 @@ driCreateScreen(__GLXscreenConfigs * psc, int screen, for (i = 0; extensions[i]; i++) { if (strcmp(extensions[i]->name, __DRI_CORE) == 0) - psc->core = (__DRIcoreExtension *) extensions[i]; + psc->core = (__DRIcoreExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_SWRAST) == 0) - psc->swrast = (__DRIswrastExtension *) extensions[i]; + psc->swrast = (__DRIswrastExtension *) extensions[i]; } if (psc->core == NULL || psc->swrast == NULL) { @@ -424,33 +471,34 @@ driCreateScreen(__GLXscreenConfigs * psc, int screen, goto handle_error; } - psc->__driScreen = - psc->swrast->createNewScreen(screen, - loader_extensions, &driver_configs, psc); - if (psc->__driScreen == NULL) { + psc->driScreen = + psc->swrast->createNewScreen(screen, loader_extensions, + &driver_configs, psc); + if (psc->driScreen == NULL) { ErrorMessageF("failed to create dri screen\n"); goto handle_error; } - driBindExtensions(psc); - driBindCommonExtensions(psc); + extensions = psc->core->getExtensions(psc->driScreen); - psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs); - psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs); + psc->base.configs = + driConvertConfigs(psc->core, psc->base.configs, driver_configs); + psc->base.visuals = + driConvertConfigs(psc->core, psc->base.visuals, 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 psp; + return &psc->base; handle_error: - Xfree(psp); + Xfree(psc); if (psc->driver) dlclose(psc->driver); @@ -476,7 +524,7 @@ driDestroyDisplay(__GLXDRIdisplay * dpy) _X_HIDDEN __GLXDRIdisplay * driswCreateDisplay(Display * dpy) { - __GLXDRIdisplayPrivate *pdpyp; + struct drisw_display *pdpyp; pdpyp = Xmalloc(sizeof *pdpyp); if (pdpyp == NULL) |