[Mesa-dev] [PATCH] egl/android: Fix build for Jelly Bean (v2)

Tapani Pälli tapani.palli at intel.com
Thu Dec 20 21:00:10 PST 2012


On 12/21/2012 01:11 AM, Chad Versace wrote:
> In Jelly Bean, the interface to ANativeWindow changed. The change included
> adding a new parameter the queueBuffer and dequeueBuffer methods and
> removing the lockBuffer method.
> 
> v2:
>   - s/fence_fd == -1/fence_fd != -1/
>   - Fix leak. Close the fence_fd.
> 
> CC: Tapani Pälli <tapani.palli at intel.com>
> Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
> ---
>  src/egl/drivers/dri2/platform_android.c | 59 +++++++++++++++++++++++++++++++++
>  src/egl/main/Android.mk                 |  5 +++
>  2 files changed, 64 insertions(+)
> 
> diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
> index 15bf054..402df11 100644
> --- a/src/egl/drivers/dri2/platform_android.c
> +++ b/src/egl/drivers/dri2/platform_android.c
> @@ -31,6 +31,10 @@
>  #include <errno.h>
>  #include <dlfcn.h>
>  
> +#if ANDROID_VERSION >= 0x402
> +#include <sync/sync.h>
> +#endif
> +
>  /* for droid_get_pci_id */
>  #include <xf86drm.h>
>  #include <i915_drm.h>
> @@ -79,11 +83,48 @@ get_native_buffer_name(struct ANativeWindowBuffer *buf)
>  static EGLBoolean
>  droid_window_dequeue_buffer(struct dri2_egl_surface *dri2_surf)
>  {
> +#if ANDROID_VERSION >= 0x0402
> +   int fence_fd;
> +
> +   if (dri2_surf->window->dequeueBuffer(dri2_surf->window, &dri2_surf->buffer,
> +                                        &fence_fd))
> +      return EGL_FALSE;
> +
> +   /* If access to the buffer is controlled by a sync fence, then block on the
> +    * fence.
> +    *
> +    * It may be more performant to postpone blocking until there is an
> +    * immediate need to write to the buffer. But doing so would require adding
> +    * hooks to the DRI2 loader.
> +    *
> +    * From the ANativeWindow::dequeueBuffer documentation:
> +    *
> +    *    The libsync fence file descriptor returned in the int pointed to by
> +    *    the fenceFd argument will refer to the fence that must signal
> +    *    before the dequeued buffer may be written to.  A value of -1
> +    *    indicates that the caller may access the buffer immediately without
> +    *    waiting on a fence.  If a valid file descriptor is returned (i.e.
> +    *    any value except -1) then the caller is responsible for closing the
> +    *    file descriptor.
> +    */
> +    if (fence_fd >= 0) {
> +       /* From the SYNC_IOC_WAIT documentation in <linux/sync.h>:
> +        *
> +        *    Waits indefinitely if timeout < 0.
> +        */
> +        int timeout = -1;
> +        sync_wait(fence_fd, timeout);

I'm getting link error "error: undefined reference to 'sync_wait'",
where is this function coming from?

> +        close(fd);

typo here, should be close(fence_fd)


otherwise things look good to me;

Reviewed-by: Tapani Pälli <tapani.palli at intel.com>


> +   }
> +
> +   dri2_surf->buffer->common.incRef(&dri2_surf->buffer->common);
> +#else
>     if (dri2_surf->window->dequeueBuffer(dri2_surf->window, &dri2_surf->buffer))
>        return EGL_FALSE;
>  
>     dri2_surf->buffer->common.incRef(&dri2_surf->buffer->common);
>     dri2_surf->window->lockBuffer(dri2_surf->window, dri2_surf->buffer);
> +#endif
>  
>     return EGL_TRUE;
>  }
> @@ -91,7 +132,25 @@ droid_window_dequeue_buffer(struct dri2_egl_surface *dri2_surf)
>  static EGLBoolean
>  droid_window_enqueue_buffer(struct dri2_egl_surface *dri2_surf)
>  {
> +#if ANDROID_VERSION >= 0x0402
> +   /* Queue the buffer without a sync fence. This informs the ANativeWindow
> +    * that it may access the buffer immediately.
> +    *
> +    * From ANativeWindow::dequeueBuffer:
> +    *
> +    *    The fenceFd argument specifies a libsync fence file descriptor for
> +    *    a fence that must signal before the buffer can be accessed.  If
> +    *    the buffer can be accessed immediately then a value of -1 should
> +    *    be used.  The caller must not use the file descriptor after it
> +    *    is passed to queueBuffer, and the ANativeWindow implementation
> +    *    is responsible for closing it.
> +    */
> +   int fence_fd = -1;
> +   dri2_surf->window->queueBuffer(dri2_surf->window, dri2_surf->buffer,
> +                                  fence_fd);
> +#else
>     dri2_surf->window->queueBuffer(dri2_surf->window, dri2_surf->buffer);
> +#endif
>  
>     dri2_surf->buffer->common.decRef(&dri2_surf->buffer->common);
>     dri2_surf->buffer = NULL;
> diff --git a/src/egl/main/Android.mk b/src/egl/main/Android.mk
> index a4a00f3..97e4860 100644
> --- a/src/egl/main/Android.mk
> +++ b/src/egl/main/Android.mk
> @@ -79,7 +79,12 @@ LOCAL_STATIC_LIBRARIES += libmesa_egl_dri2
>  # require i915_dri and/or i965_dri
>  LOCAL_REQUIRED_MODULES += \
>  	$(addsuffix _dri, $(filter i915 i965, $(MESA_GPU_DRIVERS)))
> +
> +ifeq ($(shell echo "$(MESA_ANDROID_VERSION) >= 4.2" | bc),1)
> +    LOCAL_SHARED_LIBRARIES += \
> +        libsync
>  endif
> +endif # MESA_BUILD_CLASSIC
>  
>  ifeq ($(strip $(MESA_BUILD_GALLIUM)),true)
>  
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 553 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20121221/ecbef2a8/attachment.pgp>


More information about the mesa-dev mailing list