1848b8605Smrg/* 2848b8605Smrg * Copyright © 2011 Intel Corporation 3848b8605Smrg * 4848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 5848b8605Smrg * copy of this software and associated documentation files (the "Software"), 6848b8605Smrg * to deal in the Software without restriction, including without limitation 7848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the 9848b8605Smrg * Software is furnished to do so, subject to the following conditions: 10848b8605Smrg * 11848b8605Smrg * The above copyright notice and this permission notice (including the next 12848b8605Smrg * paragraph) shall be included in all copies or substantial portions of the 13848b8605Smrg * Software. 14848b8605Smrg * 15848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16848b8605Smrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17848b8605Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18848b8605Smrg * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19848b8605Smrg * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20848b8605Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21848b8605Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22848b8605Smrg * DEALINGS IN THE SOFTWARE. 23848b8605Smrg * 24848b8605Smrg * Authors: 25848b8605Smrg * Kristian Høgsberg <krh@bitplanet.net> 26848b8605Smrg */ 27848b8605Smrg 28848b8605Smrg#ifndef EGL_DRI2_INCLUDED 29848b8605Smrg#define EGL_DRI2_INCLUDED 30848b8605Smrg 31b8e80941Smrg#include <stdbool.h> 32b8e80941Smrg#include <stdint.h> 33b8e80941Smrg 34848b8605Smrg#ifdef HAVE_X11_PLATFORM 35848b8605Smrg#include <xcb/xcb.h> 36848b8605Smrg#include <xcb/dri2.h> 37848b8605Smrg#include <xcb/xfixes.h> 38848b8605Smrg#include <X11/Xlib-xcb.h> 39b8e80941Smrg 40b8e80941Smrg#ifdef HAVE_DRI3 41b8e80941Smrg#include "loader_dri3_helper.h" 42b8e80941Smrg#endif 43848b8605Smrg#endif 44848b8605Smrg 45848b8605Smrg#ifdef HAVE_WAYLAND_PLATFORM 46b8e80941Smrg/* forward declarations to avoid pulling wayland headers everywhere */ 47b8e80941Smrgstruct wl_egl_window; 48b8e80941Smrgstruct wl_event_queue; 49b8e80941Smrgstruct wl_callback; 50b8e80941Smrgstruct wl_display; 51b8e80941Smrgstruct wl_drm; 52b8e80941Smrgstruct wl_registry; 53b8e80941Smrgstruct wl_shm; 54b8e80941Smrgstruct wl_surface; 55b8e80941Smrgstruct zwp_linux_dmabuf_v1; 56848b8605Smrg#endif 57848b8605Smrg 58848b8605Smrg#include <GL/gl.h> 59848b8605Smrg#include <GL/internal/dri_interface.h> 60848b8605Smrg 61848b8605Smrg#ifdef HAVE_DRM_PLATFORM 62848b8605Smrg#include <gbm_driint.h> 63848b8605Smrg#endif 64848b8605Smrg 65848b8605Smrg#ifdef HAVE_ANDROID_PLATFORM 66848b8605Smrg#define LOG_TAG "EGL-DRI2" 67848b8605Smrg 68b8e80941Smrg#include <system/window.h> 69848b8605Smrg#include <hardware/gralloc.h> 70848b8605Smrg#endif /* HAVE_ANDROID_PLATFORM */ 71848b8605Smrg 72848b8605Smrg#include "eglconfig.h" 73848b8605Smrg#include "eglcontext.h" 74b8e80941Smrg#include "egldevice.h" 75848b8605Smrg#include "egldisplay.h" 76848b8605Smrg#include "egldriver.h" 77848b8605Smrg#include "eglcurrent.h" 78848b8605Smrg#include "egllog.h" 79848b8605Smrg#include "eglsurface.h" 80848b8605Smrg#include "eglimage.h" 81b8e80941Smrg#include "eglsync.h" 82848b8605Smrg 83b8e80941Smrg#include "util/u_vector.h" 84848b8605Smrg 85848b8605Smrgstruct wl_buffer; 86848b8605Smrg 87848b8605Smrgstruct dri2_egl_display_vtbl { 88848b8605Smrg int (*authenticate)(_EGLDisplay *disp, uint32_t id); 89848b8605Smrg 90b8e80941Smrg _EGLSurface* (*create_window_surface)(_EGLDriver *drv, _EGLDisplay *disp, 91848b8605Smrg _EGLConfig *config, 92848b8605Smrg void *native_window, 93848b8605Smrg const EGLint *attrib_list); 94848b8605Smrg 95b8e80941Smrg _EGLSurface* (*create_pixmap_surface)(_EGLDriver *drv, _EGLDisplay *disp, 96848b8605Smrg _EGLConfig *config, 97848b8605Smrg void *native_pixmap, 98848b8605Smrg const EGLint *attrib_list); 99848b8605Smrg 100b8e80941Smrg _EGLSurface* (*create_pbuffer_surface)(_EGLDriver *drv, _EGLDisplay *disp, 101848b8605Smrg _EGLConfig *config, 102848b8605Smrg const EGLint *attrib_list); 103848b8605Smrg 104b8e80941Smrg EGLBoolean (*destroy_surface)(_EGLDriver *drv, _EGLDisplay *disp, 105848b8605Smrg _EGLSurface *surface); 106848b8605Smrg 107b8e80941Smrg EGLBoolean (*swap_interval)(_EGLDriver *drv, _EGLDisplay *disp, 108848b8605Smrg _EGLSurface *surf, EGLint interval); 109848b8605Smrg 110b8e80941Smrg _EGLImage* (*create_image)(_EGLDriver *drv, _EGLDisplay *disp, 111848b8605Smrg _EGLContext *ctx, EGLenum target, 112848b8605Smrg EGLClientBuffer buffer, 113848b8605Smrg const EGLint *attr_list); 114848b8605Smrg 115b8e80941Smrg EGLBoolean (*swap_buffers)(_EGLDriver *drv, _EGLDisplay *disp, 116848b8605Smrg _EGLSurface *surf); 117848b8605Smrg 118b8e80941Smrg EGLBoolean (*swap_buffers_with_damage)(_EGLDriver *drv, _EGLDisplay *disp, 119b8e80941Smrg _EGLSurface *surface, 120b8e80941Smrg const EGLint *rects, EGLint n_rects); 121848b8605Smrg 122b8e80941Smrg EGLBoolean (*set_damage_region)(_EGLDriver *drv, _EGLDisplay *disp, 123b8e80941Smrg _EGLSurface *surface, 124b8e80941Smrg const EGLint *rects, EGLint n_rects); 125b8e80941Smrg 126b8e80941Smrg EGLBoolean (*swap_buffers_region)(_EGLDriver *drv, _EGLDisplay *disp, 127848b8605Smrg _EGLSurface *surf, EGLint numRects, 128848b8605Smrg const EGLint *rects); 129848b8605Smrg 130b8e80941Smrg EGLBoolean (*post_sub_buffer)(_EGLDriver *drv, _EGLDisplay *disp, 131848b8605Smrg _EGLSurface *surf, 132848b8605Smrg EGLint x, EGLint y, 133848b8605Smrg EGLint width, EGLint height); 134848b8605Smrg 135b8e80941Smrg EGLBoolean (*copy_buffers)(_EGLDriver *drv, _EGLDisplay *disp, 136848b8605Smrg _EGLSurface *surf, void *native_pixmap_target); 137848b8605Smrg 138b8e80941Smrg EGLint (*query_buffer_age)(_EGLDriver *drv, _EGLDisplay *disp, 139848b8605Smrg _EGLSurface *surf); 140848b8605Smrg 141b8e80941Smrg EGLBoolean (*query_surface)(_EGLDriver *drv, _EGLDisplay *disp, 142b8e80941Smrg _EGLSurface *surf, EGLint attribute, 143b8e80941Smrg EGLint *value); 144b8e80941Smrg 145848b8605Smrg struct wl_buffer* (*create_wayland_buffer_from_image)( 146b8e80941Smrg _EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img); 147848b8605Smrg 148848b8605Smrg EGLBoolean (*get_sync_values)(_EGLDisplay *display, _EGLSurface *surface, 149848b8605Smrg EGLuint64KHR *ust, EGLuint64KHR *msc, 150848b8605Smrg EGLuint64KHR *sbc); 151b8e80941Smrg 152b8e80941Smrg __DRIdrawable *(*get_dri_drawable)(_EGLSurface *surf); 153b8e80941Smrg 154b8e80941Smrg void (*close_screen_notify)(_EGLDisplay *disp); 155b8e80941Smrg 156b8e80941Smrg /* Used in EGL_KHR_mutable_render_buffer to update the native window's 157b8e80941Smrg * shared buffer mode. 158b8e80941Smrg */ 159b8e80941Smrg bool (*set_shared_buffer_mode)(_EGLDisplay *disp, _EGLSurface *surf, 160b8e80941Smrg bool mode); 161848b8605Smrg}; 162848b8605Smrg 163848b8605Smrgstruct dri2_egl_display 164848b8605Smrg{ 165848b8605Smrg const struct dri2_egl_display_vtbl *vtbl; 166848b8605Smrg 167848b8605Smrg int dri2_major; 168848b8605Smrg int dri2_minor; 169848b8605Smrg __DRIscreen *dri_screen; 170b8e80941Smrg bool own_dri_screen; 171848b8605Smrg const __DRIconfig **driver_configs; 172848b8605Smrg void *driver; 173848b8605Smrg const __DRIcoreExtension *core; 174b8e80941Smrg const __DRIimageDriverExtension *image_driver; 175848b8605Smrg const __DRIdri2Extension *dri2; 176848b8605Smrg const __DRIswrastExtension *swrast; 177848b8605Smrg const __DRI2flushExtension *flush; 178b8e80941Smrg const __DRI2flushControlExtension *flush_control; 179848b8605Smrg const __DRItexBufferExtension *tex_buffer; 180848b8605Smrg const __DRIimageExtension *image; 181848b8605Smrg const __DRIrobustnessExtension *robustness; 182b8e80941Smrg const __DRInoErrorExtension *no_error; 183848b8605Smrg const __DRI2configQueryExtension *config; 184b8e80941Smrg const __DRI2fenceExtension *fence; 185b8e80941Smrg const __DRI2blobExtension *blob; 186b8e80941Smrg const __DRI2rendererQueryExtension *rendererQuery; 187b8e80941Smrg const __DRI2interopExtension *interop; 188b8e80941Smrg const __DRIconfigOptionsExtension *configOptions; 189b8e80941Smrg const __DRImutableRenderBufferDriverExtension *mutable_render_buffer; 190848b8605Smrg int fd; 191848b8605Smrg 192b8e80941Smrg /* dri2_initialize/dri2_terminate increment/decrement this count, so does 193b8e80941Smrg * dri2_make_current (tracks if there are active contexts/surfaces). */ 194b8e80941Smrg int ref_count; 195b8e80941Smrg 196b8e80941Smrg bool own_device; 197b8e80941Smrg bool invalidate_available; 198848b8605Smrg int min_swap_interval; 199848b8605Smrg int max_swap_interval; 200848b8605Smrg int default_swap_interval; 201848b8605Smrg#ifdef HAVE_DRM_PLATFORM 202848b8605Smrg struct gbm_dri_device *gbm_dri; 203848b8605Smrg#endif 204848b8605Smrg 205848b8605Smrg char *driver_name; 206848b8605Smrg 207b8e80941Smrg const __DRIextension **loader_extensions; 208848b8605Smrg const __DRIextension **driver_extensions; 209848b8605Smrg 210848b8605Smrg#ifdef HAVE_X11_PLATFORM 211848b8605Smrg xcb_connection_t *conn; 212b8e80941Smrg xcb_screen_t *screen; 213b8e80941Smrg bool swap_available; 214b8e80941Smrg#ifdef HAVE_DRI3 215b8e80941Smrg bool multibuffers_available; 216b8e80941Smrg int dri3_major_version; 217b8e80941Smrg int dri3_minor_version; 218b8e80941Smrg int present_major_version; 219b8e80941Smrg int present_minor_version; 220b8e80941Smrg struct loader_dri3_extensions loader_dri3_ext; 221b8e80941Smrg#endif 222848b8605Smrg#endif 223848b8605Smrg 224848b8605Smrg#ifdef HAVE_WAYLAND_PLATFORM 225848b8605Smrg struct wl_display *wl_dpy; 226b8e80941Smrg struct wl_display *wl_dpy_wrapper; 227848b8605Smrg struct wl_registry *wl_registry; 228848b8605Smrg struct wl_drm *wl_server_drm; 229848b8605Smrg struct wl_drm *wl_drm; 230b8e80941Smrg struct wl_shm *wl_shm; 231848b8605Smrg struct wl_event_queue *wl_queue; 232b8e80941Smrg struct zwp_linux_dmabuf_v1 *wl_dmabuf; 233b8e80941Smrg struct u_vector *wl_modifiers; 234b8e80941Smrg bool authenticated; 235b8e80941Smrg unsigned formats; 236848b8605Smrg uint32_t capabilities; 237b8e80941Smrg char *device_name; 238b8e80941Smrg#endif 239b8e80941Smrg 240b8e80941Smrg#ifdef HAVE_ANDROID_PLATFORM 241b8e80941Smrg const gralloc_module_t *gralloc; 242848b8605Smrg#endif 243b8e80941Smrg 244b8e80941Smrg bool is_render_node; 245b8e80941Smrg bool is_different_gpu; 246848b8605Smrg}; 247848b8605Smrg 248848b8605Smrgstruct dri2_egl_context 249848b8605Smrg{ 250848b8605Smrg _EGLContext base; 251848b8605Smrg __DRIcontext *dri_context; 252848b8605Smrg}; 253848b8605Smrg 254848b8605Smrg#ifdef HAVE_WAYLAND_PLATFORM 255848b8605Smrgenum wayland_buffer_type { 256848b8605Smrg WL_BUFFER_FRONT, 257848b8605Smrg WL_BUFFER_BACK, 258848b8605Smrg WL_BUFFER_THIRD, 259848b8605Smrg WL_BUFFER_COUNT 260848b8605Smrg}; 261848b8605Smrg#endif 262848b8605Smrg 263848b8605Smrgstruct dri2_egl_surface 264848b8605Smrg{ 265848b8605Smrg _EGLSurface base; 266848b8605Smrg __DRIdrawable *dri_drawable; 267848b8605Smrg __DRIbuffer buffers[5]; 268b8e80941Smrg bool have_fake_front; 269848b8605Smrg 270848b8605Smrg#ifdef HAVE_X11_PLATFORM 271848b8605Smrg xcb_drawable_t drawable; 272848b8605Smrg xcb_xfixes_region_t region; 273848b8605Smrg int depth; 274848b8605Smrg int bytes_per_pixel; 275848b8605Smrg xcb_gcontext_t gc; 276848b8605Smrg xcb_gcontext_t swapgc; 277848b8605Smrg#endif 278848b8605Smrg 279848b8605Smrg#ifdef HAVE_WAYLAND_PLATFORM 280848b8605Smrg struct wl_egl_window *wl_win; 281848b8605Smrg int dx; 282848b8605Smrg int dy; 283b8e80941Smrg struct wl_event_queue *wl_queue; 284b8e80941Smrg struct wl_surface *wl_surface_wrapper; 285b8e80941Smrg struct wl_display *wl_dpy_wrapper; 286b8e80941Smrg struct wl_drm *wl_drm_wrapper; 287848b8605Smrg struct wl_callback *throttle_callback; 288b8e80941Smrg int format; 289848b8605Smrg#endif 290848b8605Smrg 291848b8605Smrg#ifdef HAVE_DRM_PLATFORM 292848b8605Smrg struct gbm_dri_surface *gbm_surf; 293848b8605Smrg#endif 294848b8605Smrg 295b8e80941Smrg /* EGL-owned buffers */ 296b8e80941Smrg __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT]; 297b8e80941Smrg 298848b8605Smrg#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM) 299848b8605Smrg struct { 300848b8605Smrg#ifdef HAVE_WAYLAND_PLATFORM 301848b8605Smrg struct wl_buffer *wl_buffer; 302b8e80941Smrg bool wl_release; 303848b8605Smrg __DRIimage *dri_image; 304b8e80941Smrg /* for is_different_gpu case. NULL else */ 305b8e80941Smrg __DRIimage *linear_copy; 306b8e80941Smrg /* for swrast */ 307b8e80941Smrg void *data; 308b8e80941Smrg int data_size; 309848b8605Smrg#endif 310848b8605Smrg#ifdef HAVE_DRM_PLATFORM 311848b8605Smrg struct gbm_bo *bo; 312848b8605Smrg#endif 313b8e80941Smrg bool locked; 314848b8605Smrg int age; 315848b8605Smrg } color_buffers[4], *back, *current; 316848b8605Smrg#endif 317848b8605Smrg 318848b8605Smrg#ifdef HAVE_ANDROID_PLATFORM 319848b8605Smrg struct ANativeWindow *window; 320848b8605Smrg struct ANativeWindowBuffer *buffer; 321b8e80941Smrg __DRIimage *dri_image_back; 322b8e80941Smrg __DRIimage *dri_image_front; 323b8e80941Smrg 324b8e80941Smrg /* Used to record all the buffers created by ANativeWindow and their ages. 325b8e80941Smrg * Allocate number of color_buffers based on query to android bufferqueue 326b8e80941Smrg * and save color_buffers_count. 327b8e80941Smrg */ 328b8e80941Smrg int color_buffers_count; 329b8e80941Smrg struct { 330b8e80941Smrg struct ANativeWindowBuffer *buffer; 331b8e80941Smrg int age; 332b8e80941Smrg } *color_buffers, *back; 333b8e80941Smrg#endif 334848b8605Smrg 335b8e80941Smrg#if defined(HAVE_SURFACELESS_PLATFORM) 336b8e80941Smrg __DRIimage *front; 337b8e80941Smrg unsigned int visual; 338848b8605Smrg#endif 339b8e80941Smrg int out_fence_fd; 340b8e80941Smrg EGLBoolean enable_out_fence; 341848b8605Smrg}; 342848b8605Smrg 343848b8605Smrgstruct dri2_egl_config 344848b8605Smrg{ 345848b8605Smrg _EGLConfig base; 346b8e80941Smrg const __DRIconfig *dri_config[2][2]; 347848b8605Smrg}; 348848b8605Smrg 349848b8605Smrgstruct dri2_egl_image 350848b8605Smrg{ 351848b8605Smrg _EGLImage base; 352848b8605Smrg __DRIimage *dri_image; 353848b8605Smrg}; 354848b8605Smrg 355b8e80941Smrgstruct dri2_egl_sync { 356b8e80941Smrg _EGLSync base; 357b8e80941Smrg mtx_t mutex; 358b8e80941Smrg cnd_t cond; 359b8e80941Smrg int refcount; 360b8e80941Smrg void *fence; 361b8e80941Smrg}; 362b8e80941Smrg 363848b8605Smrg/* From xmlpool/options.h, user exposed so should be stable */ 364848b8605Smrg#define DRI_CONF_VBLANK_NEVER 0 365848b8605Smrg#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 366848b8605Smrg#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 367848b8605Smrg#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 368848b8605Smrg 369848b8605Smrg/* standard typecasts */ 370848b8605Smrg_EGL_DRIVER_STANDARD_TYPECASTS(dri2_egl) 371848b8605Smrg_EGL_DRIVER_TYPECAST(dri2_egl_image, _EGLImage, obj) 372b8e80941Smrg_EGL_DRIVER_TYPECAST(dri2_egl_sync, _EGLSync, obj) 373848b8605Smrg 374848b8605Smrgextern const __DRIimageLookupExtension image_lookup_extension; 375848b8605Smrgextern const __DRIuseInvalidateExtension use_invalidate; 376b8e80941Smrgextern const __DRIbackgroundCallableExtension background_callable_extension; 377848b8605Smrg 378848b8605SmrgEGLBoolean 379848b8605Smrgdri2_load_driver(_EGLDisplay *disp); 380848b8605Smrg 381848b8605Smrg/* Helper for platforms not using dri2_create_screen */ 382848b8605Smrgvoid 383848b8605Smrgdri2_setup_screen(_EGLDisplay *disp); 384848b8605Smrg 385b8e80941Smrgvoid 386b8e80941Smrgdri2_setup_swap_interval(_EGLDisplay *disp, int max_swap_interval); 387b8e80941Smrg 388848b8605SmrgEGLBoolean 389848b8605Smrgdri2_load_driver_swrast(_EGLDisplay *disp); 390848b8605Smrg 391b8e80941SmrgEGLBoolean 392b8e80941Smrgdri2_load_driver_dri3(_EGLDisplay *disp); 393b8e80941Smrg 394848b8605SmrgEGLBoolean 395848b8605Smrgdri2_create_screen(_EGLDisplay *disp); 396848b8605Smrg 397b8e80941SmrgEGLBoolean 398b8e80941Smrgdri2_setup_extensions(_EGLDisplay *disp); 399b8e80941Smrg 400b8e80941Smrg__DRIdrawable * 401b8e80941Smrgdri2_surface_get_dri_drawable(_EGLSurface *surf); 402b8e80941Smrg 403848b8605Smrg__DRIimage * 404848b8605Smrgdri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data); 405848b8605Smrg 406848b8605Smrgstruct dri2_egl_config * 407848b8605Smrgdri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id, 408b8e80941Smrg EGLint surface_type, const EGLint *attr_list, 409b8e80941Smrg const unsigned int *rgba_masks); 410848b8605Smrg 411848b8605Smrg_EGLImage * 412848b8605Smrgdri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, 413b8e80941Smrg _EGLContext *ctx, EGLenum target, 414b8e80941Smrg EGLClientBuffer buffer, const EGLint *attr_list); 415848b8605Smrg 416b8e80941Smrg_EGLImage * 417b8e80941Smrgdri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx, 418b8e80941Smrg EGLClientBuffer buffer, const EGLint *attr_list); 419b8e80941Smrg 420b8e80941Smrg#ifdef HAVE_X11_PLATFORM 421848b8605SmrgEGLBoolean 422848b8605Smrgdri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp); 423b8e80941Smrgvoid 424b8e80941Smrgdri2_teardown_x11(struct dri2_egl_display *dri2_dpy); 425b8e80941Smrgunsigned int 426b8e80941Smrgdri2_x11_get_red_mask_for_depth(struct dri2_egl_display *dri2_dpy, int depth); 427b8e80941Smrg#else 428b8e80941Smrgstatic inline EGLBoolean 429b8e80941Smrgdri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp) 430b8e80941Smrg{ 431b8e80941Smrg return _eglError(EGL_NOT_INITIALIZED, "X11 platform not built"); 432b8e80941Smrg} 433b8e80941Smrgstatic inline void 434b8e80941Smrgdri2_teardown_x11(struct dri2_egl_display *dri2_dpy) {} 435b8e80941Smrgstatic inline unsigned int 436b8e80941Smrgdri2_x11_get_red_mask_for_depth(struct dri2_egl_display *dri2_dpy, int depth) 437b8e80941Smrg{ 438b8e80941Smrg return 0; 439b8e80941Smrg} 440b8e80941Smrg#endif 441848b8605Smrg 442b8e80941Smrg#ifdef HAVE_DRM_PLATFORM 443848b8605SmrgEGLBoolean 444848b8605Smrgdri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp); 445b8e80941Smrgvoid 446b8e80941Smrgdri2_teardown_drm(struct dri2_egl_display *dri2_dpy); 447b8e80941Smrg#else 448b8e80941Smrgstatic inline EGLBoolean 449b8e80941Smrgdri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) 450b8e80941Smrg{ 451b8e80941Smrg return _eglError(EGL_NOT_INITIALIZED, "GBM/DRM platform not built"); 452b8e80941Smrg} 453b8e80941Smrgstatic inline void 454b8e80941Smrgdri2_teardown_drm(struct dri2_egl_display *dri2_dpy) {} 455b8e80941Smrg#endif 456848b8605Smrg 457b8e80941Smrg#ifdef HAVE_WAYLAND_PLATFORM 458848b8605SmrgEGLBoolean 459848b8605Smrgdri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp); 460b8e80941Smrgvoid 461b8e80941Smrgdri2_teardown_wayland(struct dri2_egl_display *dri2_dpy); 462b8e80941Smrgbool 463b8e80941Smrgdri2_wl_is_format_supported(void* user_data, uint32_t format); 464b8e80941Smrg#else 465b8e80941Smrgstatic inline EGLBoolean 466b8e80941Smrgdri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp) 467b8e80941Smrg{ 468b8e80941Smrg return _eglError(EGL_NOT_INITIALIZED, "Wayland platform not built"); 469b8e80941Smrg} 470b8e80941Smrgstatic inline void 471b8e80941Smrgdri2_teardown_wayland(struct dri2_egl_display *dri2_dpy) {} 472b8e80941Smrg#endif 473848b8605Smrg 474b8e80941Smrg#ifdef HAVE_ANDROID_PLATFORM 475848b8605SmrgEGLBoolean 476848b8605Smrgdri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp); 477b8e80941Smrg#else 478b8e80941Smrgstatic inline EGLBoolean 479b8e80941Smrgdri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp) 480b8e80941Smrg{ 481b8e80941Smrg return _eglError(EGL_NOT_INITIALIZED, "Android platform not built"); 482b8e80941Smrg} 483b8e80941Smrg#endif 484b8e80941Smrg 485b8e80941Smrg#ifdef HAVE_SURFACELESS_PLATFORM 486b8e80941SmrgEGLBoolean 487b8e80941Smrgdri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp); 488b8e80941Smrg#else 489b8e80941Smrgstatic inline EGLBoolean 490b8e80941Smrgdri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp) 491b8e80941Smrg{ 492b8e80941Smrg return _eglError(EGL_NOT_INITIALIZED, "Surfaceless platform not built"); 493b8e80941Smrg} 494b8e80941Smrg#endif 495b8e80941Smrg 496b8e80941Smrgvoid 497b8e80941Smrgdri2_flush_drawable_for_swapbuffers(_EGLDisplay *disp, _EGLSurface *draw); 498b8e80941Smrg 499b8e80941Smrgconst __DRIconfig * 500b8e80941Smrgdri2_get_dri_config(struct dri2_egl_config *conf, EGLint surface_type, 501b8e80941Smrg EGLenum colorspace); 502b8e80941Smrg 503b8e80941Smrgstatic inline void 504b8e80941Smrgdri2_set_WL_bind_wayland_display(_EGLDriver *drv, _EGLDisplay *disp) 505b8e80941Smrg{ 506b8e80941Smrg#ifdef HAVE_WAYLAND_PLATFORM 507b8e80941Smrg struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 508b8e80941Smrg 509b8e80941Smrg (void) drv; 510b8e80941Smrg 511b8e80941Smrg if (dri2_dpy->device_name && dri2_dpy->image) { 512b8e80941Smrg if (dri2_dpy->image->base.version >= 10 && 513b8e80941Smrg dri2_dpy->image->getCapabilities != NULL) { 514b8e80941Smrg int capabilities; 515b8e80941Smrg 516b8e80941Smrg capabilities = 517b8e80941Smrg dri2_dpy->image->getCapabilities(dri2_dpy->dri_screen); 518b8e80941Smrg disp->Extensions.WL_bind_wayland_display = 519b8e80941Smrg (capabilities & __DRI_IMAGE_CAP_GLOBAL_NAMES) != 0; 520b8e80941Smrg } else { 521b8e80941Smrg disp->Extensions.WL_bind_wayland_display = EGL_TRUE; 522b8e80941Smrg } 523b8e80941Smrg } 524b8e80941Smrg#endif 525b8e80941Smrg} 526b8e80941Smrg 527b8e80941Smrgvoid 528b8e80941Smrgdri2_display_destroy(_EGLDisplay *disp); 529b8e80941Smrg 530b8e80941Smrg__DRIbuffer * 531b8e80941Smrgdri2_egl_surface_alloc_local_buffer(struct dri2_egl_surface *dri2_surf, 532b8e80941Smrg unsigned int att, unsigned int format); 533b8e80941Smrg 534b8e80941Smrgvoid 535b8e80941Smrgdri2_egl_surface_free_local_buffers(struct dri2_egl_surface *dri2_surf); 536b8e80941Smrg 537b8e80941SmrgEGLBoolean 538b8e80941Smrgdri2_init_surface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type, 539b8e80941Smrg _EGLConfig *conf, const EGLint *attrib_list, EGLBoolean enable_out_fence); 540b8e80941Smrg 541b8e80941Smrgvoid 542b8e80941Smrgdri2_fini_surface(_EGLSurface *surf); 543b8e80941Smrg 544b8e80941SmrgEGLBoolean 545b8e80941Smrgdri2_create_drawable(struct dri2_egl_display *dri2_dpy, 546b8e80941Smrg const __DRIconfig *config, 547b8e80941Smrg struct dri2_egl_surface *dri2_surf); 548b8e80941Smrg 549b8e80941Smrgstatic inline uint64_t 550b8e80941Smrgcombine_u32_into_u64(uint32_t hi, uint32_t lo) 551b8e80941Smrg{ 552b8e80941Smrg return (((uint64_t) hi) << 32) | (((uint64_t) lo) & 0xffffffff); 553b8e80941Smrg} 554848b8605Smrg 555848b8605Smrg#endif /* EGL_DRI2_INCLUDED */ 556