X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fdrivers%2Fdri2%2Fegl_dri2.h;h=c3c9fc0166c621efadd05ca68a4ce3765b11eb1a;hb=a25df5457121d40fef86929d4c10d8058a4d5c72;hp=3854200bc694642ffd18e21a016214d1e0099626;hpb=636d01bd61cac83e13c3c64874e7e34e828ca93a;p=mesa.git diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 3854200bc69..c3c9fc0166c 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -28,6 +28,8 @@ #ifndef EGL_DRI2_INCLUDED #define EGL_DRI2_INCLUDED +#include + #ifdef HAVE_X11_PLATFORM #include #include @@ -37,7 +39,6 @@ #ifdef HAVE_WAYLAND_PLATFORM #include -#include "wayland-drm.h" #include "wayland-egl-priv.h" #endif @@ -48,6 +49,23 @@ #include #endif +#ifdef HAVE_ANDROID_PLATFORM +#define LOG_TAG "EGL-DRI2" + +#if ANDROID_VERSION >= 0x0400 +# include +#else +# define android_native_buffer_t ANativeWindowBuffer +# include +# include +#endif + +#include +#include +#include + +#endif /* HAVE_ANDROID_PLATFORM */ + #include "eglconfig.h" #include "eglcontext.h" #include "egldisplay.h" @@ -56,9 +74,12 @@ #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; @@ -68,22 +89,94 @@ struct dri2_egl_driver 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); + + __DRIdrawable *(*get_dri_drawable)(_EGLSurface *surf); +}; + 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; + 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; + const __DRI2rendererQueryExtension *rendererQuery; 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; #endif @@ -93,20 +186,27 @@ struct dri2_egl_display __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 struct wl_display *wl_dpy; + struct wl_registry *wl_registry; struct wl_drm *wl_server_drm; struct wl_drm *wl_drm; + struct wl_shm *wl_shm; + struct wl_event_queue *wl_queue; 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 @@ -122,16 +222,8 @@ enum wayland_buffer_type { WL_BUFFER_THIRD, WL_BUFFER_COUNT }; - -#define __DRI_BUFFER_COUNT 10 #endif -enum dri2_surface_type { - DRI2_WINDOW_SURFACE, - DRI2_PIXMAP_SURFACE, - DRI2_PBUFFER_SURFACE -}; - struct dri2_egl_surface { _EGLSurface base; @@ -139,7 +231,6 @@ struct dri2_egl_surface __DRIbuffer buffers[5]; int buffer_count; int have_fake_front; - int swap_interval; #ifdef HAVE_X11_PLATFORM xcb_drawable_t drawable; @@ -150,32 +241,53 @@ struct dri2_egl_surface 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; + /* for is_different_gpu case. NULL else */ + __DRIimage *linear_copy; + /* for swrast */ + void *data; + int data_size; +#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 }; struct dri2_egl_config { _EGLConfig base; - const __DRIconfig *dri_single_config; - const __DRIconfig *dri_double_config; + const __DRIconfig *dri_single_config[2]; + const __DRIconfig *dri_double_config[2]; }; struct dri2_egl_image @@ -184,9 +296,22 @@ struct dri2_egl_image __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; @@ -204,12 +329,16 @@ dri2_load_driver_swrast(_EGLDisplay *disp); EGLBoolean dri2_create_screen(_EGLDisplay *disp); +__DRIdrawable * +dri2_surface_get_dri_drawable(_EGLSurface *surf); + __DRIimage * dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data); 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 * dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, @@ -225,9 +354,17 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp); 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); + +EGLBoolean +dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp); + +void +dri2_flush_drawable_for_swapbuffers(_EGLDisplay *disp, _EGLSurface *draw); + +const __DRIconfig * +dri2_get_dri_config(struct dri2_egl_config *conf, EGLint surface_type, + EGLenum colorspace); #endif /* EGL_DRI2_INCLUDED */