[Mesa-dev] [PATCH 01/16] dri_interface: Update __DRItexBufferExtensionRec to version 3
Emil Velikov
emil.l.velikov at gmail.com
Fri Apr 25 11:31:29 PDT 2014
On 25/04/14 18:44, Kristian Høgsberg wrote:
> On Sun, Mar 16, 2014 at 6:48 AM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
>> With commit e59fa4c46c8("dri2: release texture image.") we updated the
>> extension without bumping the version number. The patch itself added an
>> interface required to enable texture_from_pixmap on certain platforms.
>>
>> The new code was effectively never build, as it depended on
>> __DRI_TEX_BUFFER_VERSION >= 3, which never came to be in upstream mesa.
>>
>> This commit bumps the version number, drops the __DRI_TEX_BUFFER_VERSION
>> checks and resolves all the build conflicts. Additionally it add a version
>> check as egl and dri3, as require version 2 of the extension which does
>> not have the releaseTexBuffer hook.
>>
>> Cc: Juan Zhao <juan.j.zhao at intel.com>
>> Cc: Kristian Høgsberg <krh at bitplanet.net>
>> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
>>
>> squash yeah it works let's push it
>>
>> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
>> ---
>> include/GL/internal/dri_interface.h | 2 +-
>> src/egl/drivers/dri2/egl_dri2.c | 13 +++++++------
>> src/egl/main/eglsurface.c | 11 +++++++++++
>> src/egl/main/eglsurface.h | 3 +++
>> src/glx/dri2_glx.c | 6 +-----
>> src/glx/dri3_glx.c | 3 ++-
>> src/glx/drisw_glx.c | 12 +++++-------
>> 7 files changed, 30 insertions(+), 20 deletions(-)
>>
>> diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
>> index d028d05..4d57d0b 100644
>> --- a/include/GL/internal/dri_interface.h
>> +++ b/include/GL/internal/dri_interface.h
>> @@ -231,7 +231,7 @@ struct __DRItexOffsetExtensionRec {
>> #define __DRI_TEXTURE_FORMAT_RGBA 0x20DA
>>
>> #define __DRI_TEX_BUFFER "DRI_TexBuffer"
>> -#define __DRI_TEX_BUFFER_VERSION 2
>> +#define __DRI_TEX_BUFFER_VERSION 3
>> struct __DRItexBufferExtensionRec {
>> __DRIextension base;
>>
>> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
>> index f304075..d734a1a 100644
>> --- a/src/egl/drivers/dri2/egl_dri2.c
>> +++ b/src/egl/drivers/dri2/egl_dri2.c
>> @@ -1089,7 +1089,6 @@ static EGLBoolean
>> dri2_release_tex_image(_EGLDriver *drv,
>> _EGLDisplay *disp, _EGLSurface *surf, EGLint 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;
>> @@ -1109,11 +1108,13 @@ dri2_release_tex_image(_EGLDriver *drv,
>> default:
>> assert(0);
>> }
>> - if (dri2_dpy->tex_buffer->releaseTexBuffer!=NULL)
>> - (*dri2_dpy->tex_buffer->releaseTexBuffer)(dri2_ctx->dri_context,f
>> - target,
>> - dri2_surf->dri_drawable);
>> -#endif
>> +
>> + if (dri2_dpy->tex_buffer->base.version >= 3 &&
>> + dri2_dpy->tex_buffer->releaseTexBuffer != NULL) {
>> + (*dri2_dpy->tex_buffer->releaseTexBuffer)(dri2_ctx->dri_context,
>> + target,
>> + dri2_surf->dri_drawable);
>> + }
>>
>> return EGL_TRUE;
>> }
>> diff --git a/src/egl/main/eglsurface.c b/src/egl/main/eglsurface.c
>> index c5ea224..e2cb73b 100644
>> --- a/src/egl/main/eglsurface.c
>> +++ b/src/egl/main/eglsurface.c
>> @@ -531,6 +531,17 @@ _eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface,
>> return EGL_TRUE;
>> }
>>
>> +EGLBoolean
>> +_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
>> + EGLint buffer)
>> +{
>> + /* TODO: do basic error checking and return success/fail.
>> + * Drivers must implement the real stuff.
>> + */
>> +
>> + return EGL_TRUE;
>> +}
>> +
>
> What is this for? It's not used in this patch.
>
It's introduced with the above mentioned commit.
Slightly longer story:
The original commit catered for a driver that has never been part of mesa. It
added the _eglBindTexImage _eglReleaseTexImage driver callbacks. IMHO that
commit was completely broken wrt upstream mesa, this is my attempt to make
things same again.
Although we can simply revert the patch, as no upstream driver ever exposed,
and/or used the updated extension. I'm fine with either solution.
-Emil
> Kristian
>
>> EGLBoolean
>> _eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
>> diff --git a/src/egl/main/eglsurface.h b/src/egl/main/eglsurface.h
>> index a954123..d13d301 100644
>> --- a/src/egl/main/eglsurface.h
>> +++ b/src/egl/main/eglsurface.h
>> @@ -94,6 +94,9 @@ _eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint a
>> PUBLIC extern EGLBoolean
>> _eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
>>
>> +PUBLIC extern EGLBoolean
>> +_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer);
>> +
>>
>> extern EGLBoolean
>> _eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval);
>> diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
>> index 5a960b0..acd8427 100644
>> --- a/src/glx/dri2_glx.c
>> +++ b/src/glx/dri2_glx.c
>> @@ -1031,17 +1031,14 @@ 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) {
>> + if (dpyPriv != NULL && pdraw != NULL) {
>> psc = (struct dri2_screen *) base->psc;
>>
>> if (psc->texBuffer->base.version >= 3 &&
>> @@ -1051,7 +1048,6 @@ dri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
>> pdraw->driDrawable);
>> }
>> }
>> -#endif
>> }
>>
>> static const struct glx_context_vtable dri2_context_vtable = {
>> diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
>> index b7dac8e..653b1e5 100644
>> --- a/src/glx/dri3_glx.c
>> +++ b/src/glx/dri3_glx.c
>> @@ -1527,7 +1527,8 @@ dri3_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
>> if (pdraw != NULL) {
>> psc = (struct dri3_screen *) base->psc;
>>
>> - if (psc->texBuffer->releaseTexBuffer)
>> + if (psc->texBuffer->base.version >= 3 &&
>> + psc->texBuffer->releaseTexBuffer != NULL)
>> (*psc->texBuffer->releaseTexBuffer) (pcp->driContext,
>> pdraw->base.textureTarget,
>> pdraw->driDrawable);
>> diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
>> index 33d347a..a77be4e 100644
>> --- a/src/glx/drisw_glx.c
>> +++ b/src/glx/drisw_glx.c
>> @@ -342,16 +342,15 @@ drisw_bind_tex_image(Display * dpy,
>> 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;
>> + struct drisw_context *pcp = (struct drisw_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;
>> + struct drisw_drawable *pdraw = (struct drisw_drawable *) base;
>> + struct drisw_screen *psc;
>>
>> - if (pdraw != NULL) {
>> - psc = (struct dri2_screen *) base->psc;
>> + if (dpyPriv != NULL && pdraw != NULL) {
>> + psc = (struct drisw_screen *) base->psc;
>>
>> if (!psc->texBuffer)
>> return;
>> @@ -363,7 +362,6 @@ drisw_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
>> pdraw->driDrawable);
>> }
>> }
>> -#endif
>> }
>>
>> static const struct glx_context_vtable drisw_context_vtable = {
>> --
>> 1.9.0
>>
More information about the mesa-dev
mailing list