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.pa...@intel.com> > Signed-off-by: Chad Versace <chad.vers...@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.pa...@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) > >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev