#ifdef HAVE_WAYLAND_PLATFORM
#include <wayland-client.h>
-#include "wayland-drm.h"
#include "wayland-egl-priv.h"
#endif
#include <gbm_driint.h>
#endif
+#ifdef HAVE_ANDROID_PLATFORM
+#define LOG_TAG "EGL-DRI2"
+
+#if ANDROID_VERSION >= 0x0400
+# include <system/window.h>
+#else
+# define android_native_buffer_t ANativeWindowBuffer
+# include <ui/egl/android_natives.h>
+# include <ui/android_native_buffer.h>
+#endif
+
+#include <hardware/gralloc.h>
+#include <gralloc_drm_handle.h>
+#include <cutils/log.h>
+
+#endif /* HAVE_ANDROID_PLATFORM */
+
#include "eglconfig.h"
#include "eglcontext.h"
#include "egldisplay.h"
void (*glFlush)(void);
};
+struct dri2_egl_display_vtbl {
+ int (*authenticate)(_EGLDisplay *disp, uint32_t id);
+
+ _EGLSurface* (*create_window_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLConfig *config,
+ EGLNativeWindowType window,
+ const EGLint *attrib_list);
+
+ _EGLSurface* (*create_pixmap_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLConfig *config,
+ EGLNativePixmapType pixmap,
+ const EGLint *attrib_list);
+
+ _EGLSurface* (*create_pbuffer_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLConfig *config,
+ const EGLint *attrib_list);
+
+ EGLBoolean (*destroy_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surface);
+
+ EGLBoolean (*swap_interval)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf, EGLint interval);
+
+ EGLBoolean (*swap_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf);
+
+ EGLBoolean (*swap_buffers_with_damage)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surface,
+ const EGLint *rects, EGLint n_rects);
+
+ EGLBoolean (*swap_buffers_region)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf, EGLint numRects,
+ const EGLint *rects);
+
+ EGLBoolean (*copy_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf, EGLNativePixmapType target);
+
+ EGLint (*query_buffer_age)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf);
+};
+
struct dri2_egl_display
{
+ const struct dri2_egl_display_vtbl *vtbl;
+
int dri2_major;
int dri2_minor;
__DRIscreen *dri_screen;
__DRI2flushExtension *flush;
__DRItexBufferExtension *tex_buffer;
__DRIimageExtension *image;
+ __DRIrobustnessExtension *robustness;
+ __DRI2configQueryExtension *config;
int fd;
+ int own_device;
+ int swap_available;
+ int invalidate_available;
+ int min_swap_interval;
+ int max_swap_interval;
+ int default_swap_interval;
#ifdef HAVE_DRM_PLATFORM
struct gbm_dri_device *gbm_dri;
- int own_gbm_device;
#endif
char *device_name;
__DRIdri2LoaderExtension dri2_loader_extension;
__DRIswrastLoaderExtension swrast_loader_extension;
- const __DRIextension *extensions[4];
+ const __DRIextension *extensions[5];
+ const __DRIextension **driver_extensions;
#ifdef HAVE_X11_PLATFORM
xcb_connection_t *conn;
#ifdef HAVE_WAYLAND_PLATFORM
struct wl_display *wl_dpy;
+ struct wl_registry *wl_registry;
struct wl_drm *wl_server_drm;
struct wl_drm *wl_drm;
+ struct wl_event_queue *wl_queue;
int authenticated;
+ int formats;
+ uint32_t capabilities;
#endif
-
- int (*authenticate) (_EGLDisplay *disp, uint32_t id);
};
struct dri2_egl_context
};
#endif
-enum dri2_surface_type {
- DRI2_WINDOW_SURFACE,
- DRI2_PIXMAP_SURFACE,
- DRI2_PBUFFER_SURFACE
-};
-
struct dri2_egl_surface
{
_EGLSurface base;
__DRIbuffer buffers[5];
int buffer_count;
int have_fake_front;
- int swap_interval;
#ifdef HAVE_X11_PLATFORM
xcb_drawable_t drawable;
xcb_gcontext_t swapgc;
#endif
- enum dri2_surface_type type;
#ifdef HAVE_WAYLAND_PLATFORM
struct wl_egl_window *wl_win;
- struct wl_egl_pixmap *wl_pix;
- struct wl_buffer *wl_drm_buffer[WL_BUFFER_COUNT];
- int wl_buffer_lock[WL_BUFFER_COUNT];
int dx;
int dy;
+ struct wl_callback *throttle_callback;
+ int format;
+#endif
+
+#ifdef HAVE_DRM_PLATFORM
+ struct gbm_dri_surface *gbm_surf;
+#endif
+
+#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM)
__DRIbuffer *dri_buffers[__DRI_BUFFER_COUNT];
- __DRIbuffer *third_buffer;
- __DRIbuffer *pending_buffer;
- EGLBoolean block_swap_buffers;
+ struct {
+#ifdef HAVE_WAYLAND_PLATFORM
+ struct wl_buffer *wl_buffer;
+ __DRIimage *dri_image;
+#endif
+#ifdef HAVE_DRM_PLATFORM
+ struct gbm_bo *bo;
+#endif
+ int locked;
+ int age;
+ } color_buffers[4], *back, *current;
#endif
-};
-struct dri2_egl_buffer {
- __DRIbuffer *dri_buffer;
- struct dri2_egl_display *dri2_dpy;
+#ifdef HAVE_ANDROID_PLATFORM
+ struct ANativeWindow *window;
+ struct ANativeWindowBuffer *buffer;
+
+ /* EGL-owned buffers */
+ __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT];
+#endif
};
__DRIimage *dri_image;
};
+/* From xmlpool/options.h, user exposed so should be stable */
+#define DRI_CONF_VBLANK_NEVER 0
+#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1
+#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2
+#define DRI_CONF_VBLANK_ALWAYS_SYNC 3
+
/* standard typecasts */
_EGL_DRIVER_STANDARD_TYPECASTS(dri2_egl)
_EGL_DRIVER_TYPECAST(dri2_egl_image, _EGLImage, obj)
struct dri2_egl_config *
dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
- int depth, EGLint surface_type, const EGLint *attr_list,
+ EGLint surface_type, const EGLint *attr_list,
const unsigned int *rgba_masks);
_EGLImage *
EGLBoolean
dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp);
-char *
-dri2_get_driver_for_fd(int fd);
-char *
-dri2_get_device_name_for_fd(int fd);
+EGLBoolean
+dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp);
#endif /* EGL_DRI2_INCLUDED */