Copied the implementation from dri2_glx.c. --- Sorry, accidentally sent an old version that didn't apply and was missing the release() code that got added between then and now. This one should work.
src/glx/drisw_glx.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 74 insertions(+), 3 deletions(-) diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 5c7f40c..04c68e2 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -46,8 +46,10 @@ struct drisw_screen __DRIscreen *driScreen; __GLXDRIscreen vtable; - const __DRIcoreExtension *core; const __DRIswrastExtension *swrast; + const __DRIcoreExtension *core; + + const __DRItexBufferExtension *texBuffer; const __DRIconfig **driver_configs; void *driver; @@ -287,6 +289,75 @@ drisw_unbind_context(struct glx_context *context, struct glx_context *new) driReleaseDrawables(&pcp->base); } +static void +drisw_bind_tex_image(Display * dpy, + GLXDrawable drawable, + int buffer, const int *attrib_list) +{ + struct glx_context *gc = __glXGetCurrentContext(); + struct drisw_context *pcp = (struct drisw_context *) gc; + __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); + struct glx_display *dpyPriv = __glXInitialize(dpy); + struct drisw_drawable *pdraw = (struct drisw_drawable *) base; + struct drisw_display *pdp = + (struct drisw_display *) dpyPriv->dri2Display; + struct drisw_screen *psc; + + if (pdraw != NULL) { + psc = (struct drisw_screen *) base->psc; + + if (!psc->texBuffer) + return; + +/* FIXME: copied from dri2_glx.c. Can, should drisw do something like this? */ +#if 0 && __DRI2_FLUSH_VERSION >= 3 + if (!pdp->invalidateAvailable && psc->f + && psc->f->base.version >= 3 && psc->f->invalidate) + psc->f->invalidate(pdraw->driDrawable); +#endif + + if (psc->texBuffer->base.version >= 2 && + psc->texBuffer->setTexBuffer2 != NULL) { + (*psc->texBuffer->setTexBuffer2) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->base.textureFormat, + pdraw->driDrawable); + } + else { + (*psc->texBuffer->setTexBuffer) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->driDrawable); + } + } +} + +static void +drisw_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) +{ +#if __DRI_TEX_BUFFER_VERSION >= 3 + struct glx_context *gc = __glXGetCurrentContext(); + struct dri2_context *pcp = (struct dri2_context *) gc; + __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); + struct glx_display *dpyPriv = __glXInitialize(dpy); + struct dri2_drawable *pdraw = (struct dri2_drawable *) base; + struct dri2_screen *psc; + + if (pdraw != NULL) { + psc = (struct dri2_screen *) base->psc; + + if (!psc->texBuffer) + return; + + if (psc->texBuffer->base.version >= 3 && + psc->texBuffer->releaseTexBuffer != NULL) { + (*psc->texBuffer->releaseTexBuffer) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->driDrawable); + } + } +#endif +} + static const struct glx_context_vtable drisw_context_vtable = { drisw_destroy_context, drisw_bind_context, @@ -294,8 +365,8 @@ static const struct glx_context_vtable drisw_context_vtable = { NULL, NULL, DRI_glXUseXFont, - NULL, - NULL, + drisw_bind_tex_image, + drisw_release_tex_image, }; static struct glx_context * -- 1.7.0.4
From b4ebb03ac6d9d50d9184609a72f16f7343f9ff6b Mon Sep 17 00:00:00 2001 From: nobled <nob...@dreamwidth.org> Date: Sun, 5 Sep 2010 16:14:01 +0000 Subject: [PATCH 2/3] glx: Add teximage vfuncs to drisw Copied the implementation from dri2_glx.c. --- src/glx/drisw_glx.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 74 insertions(+), 3 deletions(-) diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 5c7f40c..04c68e2 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -46,8 +46,10 @@ struct drisw_screen __DRIscreen *driScreen; __GLXDRIscreen vtable; - const __DRIcoreExtension *core; const __DRIswrastExtension *swrast; + const __DRIcoreExtension *core; + + const __DRItexBufferExtension *texBuffer; const __DRIconfig **driver_configs; void *driver; @@ -287,6 +289,75 @@ drisw_unbind_context(struct glx_context *context, struct glx_context *new) driReleaseDrawables(&pcp->base); } +static void +drisw_bind_tex_image(Display * dpy, + GLXDrawable drawable, + int buffer, const int *attrib_list) +{ + struct glx_context *gc = __glXGetCurrentContext(); + struct drisw_context *pcp = (struct drisw_context *) gc; + __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); + struct glx_display *dpyPriv = __glXInitialize(dpy); + struct drisw_drawable *pdraw = (struct drisw_drawable *) base; + struct drisw_display *pdp = + (struct drisw_display *) dpyPriv->dri2Display; + struct drisw_screen *psc; + + if (pdraw != NULL) { + psc = (struct drisw_screen *) base->psc; + + if (!psc->texBuffer) + return; + +/* FIXME: copied from dri2_glx.c. Can, should drisw do something like this? */ +#if 0 && __DRI2_FLUSH_VERSION >= 3 + if (!pdp->invalidateAvailable && psc->f + && psc->f->base.version >= 3 && psc->f->invalidate) + psc->f->invalidate(pdraw->driDrawable); +#endif + + if (psc->texBuffer->base.version >= 2 && + psc->texBuffer->setTexBuffer2 != NULL) { + (*psc->texBuffer->setTexBuffer2) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->base.textureFormat, + pdraw->driDrawable); + } + else { + (*psc->texBuffer->setTexBuffer) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->driDrawable); + } + } +} + +static void +drisw_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) +{ +#if __DRI_TEX_BUFFER_VERSION >= 3 + struct glx_context *gc = __glXGetCurrentContext(); + struct dri2_context *pcp = (struct dri2_context *) gc; + __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); + struct glx_display *dpyPriv = __glXInitialize(dpy); + struct dri2_drawable *pdraw = (struct dri2_drawable *) base; + struct dri2_screen *psc; + + if (pdraw != NULL) { + psc = (struct dri2_screen *) base->psc; + + if (!psc->texBuffer) + return; + + if (psc->texBuffer->base.version >= 3 && + psc->texBuffer->releaseTexBuffer != NULL) { + (*psc->texBuffer->releaseTexBuffer) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->driDrawable); + } + } +#endif +} + static const struct glx_context_vtable drisw_context_vtable = { drisw_destroy_context, drisw_bind_context, @@ -294,8 +365,8 @@ static const struct glx_context_vtable drisw_context_vtable = { NULL, NULL, DRI_glXUseXFont, - NULL, - NULL, + drisw_bind_tex_image, + drisw_release_tex_image, }; static struct glx_context * -- 1.7.0.4
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev