#ifndef EGL_DRI2_INCLUDED
#define EGL_DRI2_INCLUDED
+#include <stdint.h>
+
#ifdef HAVE_X11_PLATFORM
#include <xcb/xcb.h>
#include <xcb/dri2.h>
#ifdef HAVE_WAYLAND_PLATFORM
#include <wayland-client.h>
-#include "wayland-drm.h"
#include "wayland-egl-priv.h"
#endif
#include "egllog.h"
#include "eglsurface.h"
#include "eglimage.h"
+#include "eglsync.h"
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+struct wl_buffer;
+
struct dri2_egl_driver
{
_EGLDriver base;
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,
+ void *native_window,
+ const EGLint *attrib_list);
+
+ _EGLSurface* (*create_pixmap_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLConfig *config,
+ void *native_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);
+
+ _EGLImage* (*create_image)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLContext *ctx, EGLenum target,
+ EGLClientBuffer buffer,
+ const EGLint *attr_list);
+
+ 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 (*post_sub_buffer)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf,
+ EGLint x, EGLint y,
+ EGLint width, EGLint height);
+
+ EGLBoolean (*copy_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf, void *native_pixmap_target);
+
+ EGLint (*query_buffer_age)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf);
+
+ struct wl_buffer* (*create_wayland_buffer_from_image)(
+ _EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img);
+
+ EGLBoolean (*get_sync_values)(_EGLDisplay *display, _EGLSurface *surface,
+ EGLuint64KHR *ust, EGLuint64KHR *msc,
+ EGLuint64KHR *sbc);
+};
+
struct dri2_egl_display
{
+ const struct dri2_egl_display_vtbl *vtbl;
+
int dri2_major;
int dri2_minor;
__DRIscreen *dri_screen;
int own_dri_screen;
const __DRIconfig **driver_configs;
void *driver;
- __DRIcoreExtension *core;
- __DRIdri2Extension *dri2;
- __DRIswrastExtension *swrast;
- __DRI2flushExtension *flush;
- __DRItexBufferExtension *tex_buffer;
- __DRIimageExtension *image;
- __DRIrobustnessExtension *robustness;
- __DRI2configQueryExtension *config;
+ const __DRIcoreExtension *core;
+ const __DRIdri2Extension *dri2;
+ const __DRIswrastExtension *swrast;
+ const __DRI2flushExtension *flush;
+ const __DRItexBufferExtension *tex_buffer;
+ const __DRIimageExtension *image;
+ const __DRIrobustnessExtension *robustness;
+ const __DRI2configQueryExtension *config;
+ const __DRI2fenceExtension *fence;
int fd;
int own_device;
__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;
+ int screen;
#endif
#ifdef HAVE_WAYLAND_PLATFORM
int authenticated;
int formats;
uint32_t capabilities;
+ int is_render_node;
+ int is_different_gpu;
#endif
-
- int (*authenticate) (_EGLDisplay *disp, uint32_t id);
};
struct dri2_egl_context
__DRIbuffer buffers[5];
int buffer_count;
int have_fake_front;
- int swap_interval;
#ifdef HAVE_X11_PLATFORM
xcb_drawable_t drawable;
struct wl_egl_window *wl_win;
int dx;
int dy;
- struct wl_callback *frame_callback;
+ struct wl_callback *throttle_callback;
int format;
#endif
#ifdef HAVE_WAYLAND_PLATFORM
struct wl_buffer *wl_buffer;
__DRIimage *dri_image;
- int pitch, name;
+ /* for is_different_gpu case. NULL else */
+ __DRIimage *linear_copy;
#endif
#ifdef HAVE_DRM_PLATFORM
struct gbm_bo *bo;
#endif
int locked;
int age;
- } color_buffers[3], *back, *current;
+ } color_buffers[4], *back, *current;
#endif
#ifdef HAVE_ANDROID_PLATFORM
__DRIimage *dri_image;
};
+struct dri2_egl_sync {
+ _EGLSync base;
+ int refcount;
+ void *fence;
+};
+
+/* 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)
+_EGL_DRIVER_TYPECAST(dri2_egl_sync, _EGLSync, obj)
extern const __DRIimageLookupExtension image_lookup_extension;
extern const __DRIuseInvalidateExtension use_invalidate;
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_android(_EGLDriver *drv, _EGLDisplay *disp);
-char *
-dri2_get_driver_for_fd(int fd);
-char *
-dri2_get_device_name_for_fd(int fd);
+void
+dri2_flush_drawable_for_swapbuffers(_EGLDisplay *disp, _EGLSurface *draw);
#endif /* EGL_DRI2_INCLUDED */