mirror of https://gitlab.freedesktop.org/mesa/mesa
dri2: release texture image.
Add release function for texture_from_pixmap extension. Some platform need to release texture image for texture_from_pixmap extension, add this interface for those platforms.
This commit is contained in:
parent
fb9c6e681f
commit
e59fa4c46c
|
@ -251,6 +251,15 @@ struct __DRItexBufferExtensionRec {
|
|||
GLint target,
|
||||
GLint format,
|
||||
__DRIdrawable *pDraw);
|
||||
/**
|
||||
* Method to release texture buffer in case some special platform
|
||||
* need this.
|
||||
*
|
||||
* For GLX_EXT_texture_from_pixmap with AIGLX.
|
||||
*/
|
||||
void (*releaseTexBuffer)(__DRIcontext *pDRICtx,
|
||||
GLint target,
|
||||
__DRIdrawable *pDraw);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -1983,10 +1983,31 @@ static EGLBoolean
|
|||
dri2_release_tex_image(_EGLDriver *drv,
|
||||
_EGLDisplay *disp, _EGLSurface *surf, EGLint buffer)
|
||||
{
|
||||
(void) drv;
|
||||
(void) disp;
|
||||
(void) surf;
|
||||
(void) buffer;
|
||||
#if __DRI_TEX_BUFFER_VERSION >= 3
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
|
||||
struct dri2_egl_context *dri2_ctx;
|
||||
_EGLContext *ctx;
|
||||
GLint target;
|
||||
|
||||
ctx = _eglGetCurrentContext();
|
||||
dri2_ctx = dri2_egl_context(ctx);
|
||||
|
||||
if (!_eglReleaseTexImage(drv, disp, surf, buffer))
|
||||
return EGL_FALSE;
|
||||
|
||||
switch (dri2_surf->base.TextureTarget) {
|
||||
case EGL_TEXTURE_2D:
|
||||
target = GL_TEXTURE_2D;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
if (dri2_dpy->tex_buffer->releaseTexBuffer!=NULL)
|
||||
(*dri2_dpy->tex_buffer->releaseTexBuffer)(dri2_ctx->dri_context,
|
||||
target,
|
||||
dri2_surf->dri_drawable);
|
||||
#endif
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
|
|
@ -719,6 +719,27 @@ dri2_bind_tex_image(Display * dpy,
|
|||
static void
|
||||
dri2_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_display *pdp =
|
||||
(struct dri2_display *) dpyPriv->dri2Display;
|
||||
struct dri2_screen *psc;
|
||||
|
||||
if (pdraw != NULL) {
|
||||
psc = (struct dri2_screen *) base->psc;
|
||||
|
||||
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 dri2_context_vtable = {
|
||||
|
|
Loading…
Reference in New Issue