#endif
#ifdef HAVE_WAYLAND_PLATFORM
-#include <wayland-client.h>
-#include "wayland/wayland-egl/wayland-egl-backend.h"
-/* forward declarations of protocol elements */
+/* forward declarations to avoid pulling wayland headers everywhere */
+struct wl_egl_window;
+struct wl_event_queue;
+struct wl_callback;
+struct wl_display;
+struct wl_drm;
+struct wl_registry;
+struct wl_shm;
+struct wl_surface;
struct zwp_linux_dmabuf_v1;
#endif
#include <system/window.h>
#include <hardware/gralloc.h>
-#include <gralloc_drm_handle.h>
-
#endif /* HAVE_ANDROID_PLATFORM */
#include "eglconfig.h"
#include "eglcontext.h"
+#include "egldevice.h"
#include "egldisplay.h"
#include "egldriver.h"
#include "eglcurrent.h"
#include "eglsync.h"
#include "util/u_vector.h"
+#include "util/bitset.h"
+
+#define EGL_DRI2_MAX_FORMATS 10
struct wl_buffer;
struct dri2_egl_display_vtbl {
int (*authenticate)(_EGLDisplay *disp, uint32_t id);
- _EGLSurface* (*create_window_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface* (*create_window_surface)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLConfig *config,
void *native_window,
const EGLint *attrib_list);
- _EGLSurface* (*create_pixmap_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ /* optional */
+ _EGLSurface* (*create_pixmap_surface)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLConfig *config,
void *native_pixmap,
const EGLint *attrib_list);
- _EGLSurface* (*create_pbuffer_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ /* optional */
+ _EGLSurface* (*create_pbuffer_surface)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLConfig *config,
const EGLint *attrib_list);
- EGLBoolean (*destroy_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ EGLBoolean (*destroy_surface)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surface);
- EGLBoolean (*swap_interval)(_EGLDriver *drv, _EGLDisplay *dpy,
+ EGLBoolean (*swap_interval)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surf, EGLint interval);
- _EGLImage* (*create_image)(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLImage* (*create_image)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLContext *ctx, EGLenum target,
EGLClientBuffer buffer,
const EGLint *attr_list);
- EGLBoolean (*swap_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
+ EGLBoolean (*swap_buffers)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surf);
- EGLBoolean (*swap_buffers_with_damage)(_EGLDriver *drv, _EGLDisplay *dpy,
+ /* optional - falls back to .swap_buffers */
+ EGLBoolean (*swap_buffers_with_damage)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surface,
const EGLint *rects, EGLint n_rects);
- EGLBoolean (*set_damage_region)(_EGLDriver *drv, _EGLDisplay *dpy,
- _EGLSurface *surface,
- const EGLint *rects, EGLint n_rects);
-
- EGLBoolean (*swap_buffers_region)(_EGLDriver *drv, _EGLDisplay *dpy,
+ /* optional */
+ EGLBoolean (*swap_buffers_region)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surf, EGLint numRects,
const EGLint *rects);
- EGLBoolean (*post_sub_buffer)(_EGLDriver *drv, _EGLDisplay *dpy,
+ /* optional */
+ EGLBoolean (*post_sub_buffer)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surf,
EGLint x, EGLint y,
EGLint width, EGLint height);
- EGLBoolean (*copy_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
+ /* optional */
+ EGLBoolean (*copy_buffers)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surf, void *native_pixmap_target);
- EGLint (*query_buffer_age)(_EGLDriver *drv, _EGLDisplay *dpy,
+ /* optional */
+ EGLint (*query_buffer_age)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surf);
- EGLBoolean (*query_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+ EGLBoolean (*query_surface)(_EGLDriver *drv, _EGLDisplay *disp,
_EGLSurface *surf, EGLint attribute,
EGLint *value);
+ /* optional */
struct wl_buffer* (*create_wayland_buffer_from_image)(
- _EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img);
+ _EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img);
+ /* optional */
EGLBoolean (*get_sync_values)(_EGLDisplay *display, _EGLSurface *surface,
EGLuint64KHR *ust, EGLuint64KHR *msc,
EGLuint64KHR *sbc);
__DRIdrawable *(*get_dri_drawable)(_EGLSurface *surf);
- void (*close_screen_notify)(_EGLDisplay *dpy);
+ void (*close_screen_notify)(_EGLDisplay *disp);
+
+ /* Used in EGL_KHR_mutable_render_buffer to update the native window's
+ * shared buffer mode.
+ */
+ bool (*set_shared_buffer_mode)(_EGLDisplay *disp, _EGLSurface *surf,
+ bool mode);
};
struct dri2_egl_display
const __DRInoErrorExtension *no_error;
const __DRI2configQueryExtension *config;
const __DRI2fenceExtension *fence;
+ const __DRI2bufferDamageExtension *buffer_damage;
const __DRI2blobExtension *blob;
const __DRI2rendererQueryExtension *rendererQuery;
const __DRI2interopExtension *interop;
+ const __DRIconfigOptionsExtension *configOptions;
+ const __DRImutableRenderBufferDriverExtension *mutable_render_buffer;
int fd;
/* dri2_initialize/dri2_terminate increment/decrement this count, so does
xcb_screen_t *screen;
bool swap_available;
#ifdef HAVE_DRI3
+ bool multibuffers_available;
+ int dri3_major_version;
+ int dri3_minor_version;
+ int present_major_version;
+ int present_minor_version;
struct loader_dri3_extensions loader_dri3_ext;
#endif
#endif
struct zwp_linux_dmabuf_v1 *wl_dmabuf;
struct u_vector *wl_modifiers;
bool authenticated;
- int formats;
+ BITSET_DECLARE(formats, EGL_DRI2_MAX_FORMATS);
uint32_t capabilities;
char *device_name;
#endif
struct {
#ifdef HAVE_WAYLAND_PLATFORM
struct wl_buffer *wl_buffer;
+ bool wl_release;
__DRIimage *dri_image;
/* for is_different_gpu case. NULL else */
__DRIimage *linear_copy;
__DRIimage *dri_image_front;
/* Used to record all the buffers created by ANativeWindow and their ages.
- * Usually Android uses at most triple buffers in ANativeWindow
- * so hardcode the number of color_buffers to 3.
+ * Allocate number of color_buffers based on query to android bufferqueue
+ * and save color_buffers_count.
*/
+ int color_buffers_count;
struct {
struct ANativeWindowBuffer *buffer;
int age;
- } color_buffers[3], *back;
+ } *color_buffers, *back;
#endif
-#if defined(HAVE_SURFACELESS_PLATFORM)
- __DRIimage *front;
- unsigned int visual;
-#endif
+ /* surfaceless and device */
+ __DRIimage *front;
+ unsigned int visual;
+
int out_fence_fd;
EGLBoolean enable_out_fence;
+
+ /* swrast device */
+ char *swrast_device_buffer;
};
struct dri2_egl_config
void *fence;
};
-/* From xmlpool/options.h, user exposed so should be stable */
+/* From driconf.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
extern const __DRIimageLookupExtension image_lookup_extension;
extern const __DRIuseInvalidateExtension use_invalidate;
extern const __DRIbackgroundCallableExtension background_callable_extension;
+extern const __DRIswrastLoaderExtension swrast_pbuffer_loader_extension;
EGLBoolean
dri2_load_driver(_EGLDisplay *disp);
__DRIimage *
dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data);
+void
+dri2_get_shifts_and_sizes(const __DRIcoreExtension *core,
+ const __DRIconfig *config, int *shifts,
+ unsigned int *sizes);
+
+void
+dri2_get_render_type_float(const __DRIcoreExtension *core,
+ const __DRIconfig *config,
+ bool *is_float);
+
+unsigned int
+dri2_image_format_for_pbuffer_config(struct dri2_egl_display *dri2_dpy,
+ const __DRIconfig *config);
+
struct dri2_egl_config *
dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
EGLint surface_type, const EGLint *attr_list,
- const unsigned int *rgba_masks);
+ const int *rgba_shifts, const unsigned int *rgba_sizes);
+
+EGLBoolean
+dri2_add_pbuffer_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *disp);
_EGLImage *
dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
dri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp);
void
dri2_teardown_x11(struct dri2_egl_display *dri2_dpy);
+unsigned int
+dri2_x11_get_red_mask_for_depth(struct dri2_egl_display *dri2_dpy, int depth);
#else
static inline EGLBoolean
dri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp)
}
static inline void
dri2_teardown_x11(struct dri2_egl_display *dri2_dpy) {}
+static inline unsigned int
+dri2_x11_get_red_mask_for_depth(struct dri2_egl_display *dri2_dpy, int depth)
+{
+ return 0;
+}
#endif
#ifdef HAVE_DRM_PLATFORM
dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp);
void
dri2_teardown_wayland(struct dri2_egl_display *dri2_dpy);
+bool
+dri2_wl_is_format_supported(void* user_data, uint32_t format);
#else
static inline EGLBoolean
dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
}
#endif
-#ifdef HAVE_SURFACELESS_PLATFORM
EGLBoolean
dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp);
-#else
-static inline EGLBoolean
-dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp)
-{
- return _eglError(EGL_NOT_INITIALIZED, "Surfaceless platform not built");
-}
-#endif
+
+EGLBoolean
+dri2_initialize_device(_EGLDriver *drv, _EGLDisplay *disp);
+static inline void
+dri2_teardown_device(struct dri2_egl_display *dri2_dpy) { /* noop */ }
void
dri2_flush_drawable_for_swapbuffers(_EGLDisplay *disp, _EGLSurface *draw);
dri2_egl_surface_free_local_buffers(struct dri2_egl_surface *dri2_surf);
EGLBoolean
-dri2_init_surface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
- _EGLConfig *conf, const EGLint *attrib_list, EGLBoolean enable_out_fence);
+dri2_init_surface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type,
+ _EGLConfig *conf, const EGLint *attrib_list,
+ EGLBoolean enable_out_fence, void *native_surface);
void
dri2_fini_surface(_EGLSurface *surf);
+EGLBoolean
+dri2_create_drawable(struct dri2_egl_display *dri2_dpy,
+ const __DRIconfig *config,
+ struct dri2_egl_surface *dri2_surf,
+ void *loaderPrivate);
+
+static inline uint64_t
+combine_u32_into_u64(uint32_t hi, uint32_t lo)
+{
+ return (((uint64_t) hi) << 32) | (((uint64_t) lo) & 0xffffffff);
+}
+
#endif /* EGL_DRI2_INCLUDED */