X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fegl%2Fdrivers%2Fdri2%2Fegl_dri2.h;h=c3c9fc0166c621efadd05ca68a4ce3765b11eb1a;hb=a25df5457121d40fef86929d4c10d8058a4d5c72;hp=ad262d21f0ff8b8c06fb67aef51a2ffff16e2d43;hpb=51f2820922b669af3947fcedd17109524644bb94;p=mesa.git diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index ad262d21f0f..c3c9fc0166c 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -28,10 +28,14 @@ #ifndef EGL_DRI2_INCLUDED #define EGL_DRI2_INCLUDED +#include + +#ifdef HAVE_X11_PLATFORM #include #include #include #include +#endif #ifdef HAVE_WAYLAND_PLATFORM #include @@ -41,6 +45,27 @@ #include #include +#ifdef HAVE_DRM_PLATFORM +#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" @@ -49,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; @@ -61,28 +89,123 @@ 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 { - xcb_connection_t *conn; + 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; - __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 + char *device_name; char *driver_name; - __DRIdri2LoaderExtension loader_extension; - const __DRIextension *extensions[3]; + __DRIdri2LoaderExtension dri2_loader_extension; + __DRIswrastLoaderExtension swrast_loader_extension; + 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_egl_display *wl_dpy; + 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 }; @@ -96,52 +219,75 @@ struct dri2_egl_context enum wayland_buffer_type { WL_BUFFER_FRONT, WL_BUFFER_BACK, + 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; __DRIdrawable *dri_drawable; - xcb_drawable_t drawable; __DRIbuffer buffers[5]; int buffer_count; - xcb_xfixes_region_t region; int have_fake_front; - int swap_interval; - enum dri2_surface_type type; + +#ifdef HAVE_X11_PLATFORM + xcb_drawable_t drawable; + xcb_xfixes_region_t region; + int depth; + int bytes_per_pixel; + xcb_gcontext_t gc; + xcb_gcontext_t swapgc; +#endif + #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 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 *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 + +#ifdef HAVE_ANDROID_PLATFORM + struct ANativeWindow *window; + struct ANativeWindowBuffer *buffer; -struct dri2_egl_buffer { - __DRIbuffer *dri_buffer; - struct dri2_egl_display *dri2_dpy; + /* 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 @@ -150,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; @@ -160,12 +319,26 @@ extern const __DRIuseInvalidateExtension use_invalidate; EGLBoolean dri2_load_driver(_EGLDisplay *disp); +/* Helper for platforms not using dri2_create_screen */ +void +dri2_setup_screen(_EGLDisplay *disp); + +EGLBoolean +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, @@ -181,7 +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); +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 */