egl/android: Fix build for Jelly Bean (v2)

In Jelly Bean, the interface to ANativeWindow changed. The change included
adding a new parameter the queueBuffer and dequeueBuffer methods,
removing the lockBuffer method, and requiring libsync.

v2:
  - s/fence_fd == -1/fence_fd != -1/
  - Fix leak. Close the fence_fd.

Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
This commit is contained in:
Chad Versace 2012-12-20 14:16:50 -08:00
parent 56c6cdc9e7
commit bfe28b8d93
2 changed files with 64 additions and 0 deletions

View File

@ -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);
close(fence_fd);
}
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;

View File

@ -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)