egl_dri2.h revision af69d88d
1/* 2 * Copyright © 2011 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 * 24 * Authors: 25 * Kristian Høgsberg <krh@bitplanet.net> 26 */ 27 28#ifndef EGL_DRI2_INCLUDED 29#define EGL_DRI2_INCLUDED 30 31#ifdef HAVE_X11_PLATFORM 32#include <xcb/xcb.h> 33#include <xcb/dri2.h> 34#include <xcb/xfixes.h> 35#include <X11/Xlib-xcb.h> 36#endif 37 38#ifdef HAVE_WAYLAND_PLATFORM 39#include <wayland-client.h> 40#include "wayland-egl-priv.h" 41#endif 42 43#include <GL/gl.h> 44#include <GL/internal/dri_interface.h> 45 46#ifdef HAVE_DRM_PLATFORM 47#include <gbm_driint.h> 48#endif 49 50#ifdef HAVE_ANDROID_PLATFORM 51#define LOG_TAG "EGL-DRI2" 52 53#if ANDROID_VERSION >= 0x0400 54# include <system/window.h> 55#else 56# define android_native_buffer_t ANativeWindowBuffer 57# include <ui/egl/android_natives.h> 58# include <ui/android_native_buffer.h> 59#endif 60 61#include <hardware/gralloc.h> 62#include <gralloc_drm_handle.h> 63#include <cutils/log.h> 64 65#endif /* HAVE_ANDROID_PLATFORM */ 66 67#include "eglconfig.h" 68#include "eglcontext.h" 69#include "egldisplay.h" 70#include "egldriver.h" 71#include "eglcurrent.h" 72#include "egllog.h" 73#include "eglsurface.h" 74#include "eglimage.h" 75 76#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 77 78struct wl_buffer; 79 80struct dri2_egl_driver 81{ 82 _EGLDriver base; 83 84 void *handle; 85 _EGLProc (*get_proc_address)(const char *procname); 86 void (*glFlush)(void); 87}; 88 89struct dri2_egl_display_vtbl { 90 int (*authenticate)(_EGLDisplay *disp, uint32_t id); 91 92 _EGLSurface* (*create_window_surface)(_EGLDriver *drv, _EGLDisplay *dpy, 93 _EGLConfig *config, 94 void *native_window, 95 const EGLint *attrib_list); 96 97 _EGLSurface* (*create_pixmap_surface)(_EGLDriver *drv, _EGLDisplay *dpy, 98 _EGLConfig *config, 99 void *native_pixmap, 100 const EGLint *attrib_list); 101 102 _EGLSurface* (*create_pbuffer_surface)(_EGLDriver *drv, _EGLDisplay *dpy, 103 _EGLConfig *config, 104 const EGLint *attrib_list); 105 106 EGLBoolean (*destroy_surface)(_EGLDriver *drv, _EGLDisplay *dpy, 107 _EGLSurface *surface); 108 109 EGLBoolean (*swap_interval)(_EGLDriver *drv, _EGLDisplay *dpy, 110 _EGLSurface *surf, EGLint interval); 111 112 _EGLImage* (*create_image)(_EGLDriver *drv, _EGLDisplay *dpy, 113 _EGLContext *ctx, EGLenum target, 114 EGLClientBuffer buffer, 115 const EGLint *attr_list); 116 117 EGLBoolean (*swap_buffers)(_EGLDriver *drv, _EGLDisplay *dpy, 118 _EGLSurface *surf); 119 120 EGLBoolean (*swap_buffers_with_damage)(_EGLDriver *drv, _EGLDisplay *dpy, 121 _EGLSurface *surface, 122 const EGLint *rects, EGLint n_rects); 123 124 EGLBoolean (*swap_buffers_region)(_EGLDriver *drv, _EGLDisplay *dpy, 125 _EGLSurface *surf, EGLint numRects, 126 const EGLint *rects); 127 128 EGLBoolean (*post_sub_buffer)(_EGLDriver *drv, _EGLDisplay *dpy, 129 _EGLSurface *surf, 130 EGLint x, EGLint y, 131 EGLint width, EGLint height); 132 133 EGLBoolean (*copy_buffers)(_EGLDriver *drv, _EGLDisplay *dpy, 134 _EGLSurface *surf, void *native_pixmap_target); 135 136 EGLint (*query_buffer_age)(_EGLDriver *drv, _EGLDisplay *dpy, 137 _EGLSurface *surf); 138 139 struct wl_buffer* (*create_wayland_buffer_from_image)( 140 _EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img); 141 142 EGLBoolean (*get_sync_values)(_EGLDisplay *display, _EGLSurface *surface, 143 EGLuint64KHR *ust, EGLuint64KHR *msc, 144 EGLuint64KHR *sbc); 145}; 146 147struct dri2_egl_display 148{ 149 const struct dri2_egl_display_vtbl *vtbl; 150 151 int dri2_major; 152 int dri2_minor; 153 __DRIscreen *dri_screen; 154 int own_dri_screen; 155 const __DRIconfig **driver_configs; 156 void *driver; 157 const __DRIcoreExtension *core; 158 const __DRIdri2Extension *dri2; 159 const __DRIswrastExtension *swrast; 160 const __DRI2flushExtension *flush; 161 const __DRItexBufferExtension *tex_buffer; 162 const __DRIimageExtension *image; 163 const __DRIrobustnessExtension *robustness; 164 const __DRI2configQueryExtension *config; 165 int fd; 166 167 int own_device; 168 int swap_available; 169 int invalidate_available; 170 int min_swap_interval; 171 int max_swap_interval; 172 int default_swap_interval; 173#ifdef HAVE_DRM_PLATFORM 174 struct gbm_dri_device *gbm_dri; 175#endif 176 177 char *device_name; 178 char *driver_name; 179 180 __DRIdri2LoaderExtension dri2_loader_extension; 181 __DRIswrastLoaderExtension swrast_loader_extension; 182 const __DRIextension *extensions[5]; 183 const __DRIextension **driver_extensions; 184 185#ifdef HAVE_X11_PLATFORM 186 xcb_connection_t *conn; 187#endif 188 189#ifdef HAVE_WAYLAND_PLATFORM 190 struct wl_display *wl_dpy; 191 struct wl_registry *wl_registry; 192 struct wl_drm *wl_server_drm; 193 struct wl_drm *wl_drm; 194 struct wl_event_queue *wl_queue; 195 int authenticated; 196 int formats; 197 uint32_t capabilities; 198#endif 199}; 200 201struct dri2_egl_context 202{ 203 _EGLContext base; 204 __DRIcontext *dri_context; 205}; 206 207#ifdef HAVE_WAYLAND_PLATFORM 208enum wayland_buffer_type { 209 WL_BUFFER_FRONT, 210 WL_BUFFER_BACK, 211 WL_BUFFER_THIRD, 212 WL_BUFFER_COUNT 213}; 214#endif 215 216struct dri2_egl_surface 217{ 218 _EGLSurface base; 219 __DRIdrawable *dri_drawable; 220 __DRIbuffer buffers[5]; 221 int buffer_count; 222 int have_fake_front; 223 224#ifdef HAVE_X11_PLATFORM 225 xcb_drawable_t drawable; 226 xcb_xfixes_region_t region; 227 int depth; 228 int bytes_per_pixel; 229 xcb_gcontext_t gc; 230 xcb_gcontext_t swapgc; 231#endif 232 233#ifdef HAVE_WAYLAND_PLATFORM 234 struct wl_egl_window *wl_win; 235 int dx; 236 int dy; 237 struct wl_callback *throttle_callback; 238 int format; 239#endif 240 241#ifdef HAVE_DRM_PLATFORM 242 struct gbm_dri_surface *gbm_surf; 243#endif 244 245#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM) 246 __DRIbuffer *dri_buffers[__DRI_BUFFER_COUNT]; 247 struct { 248#ifdef HAVE_WAYLAND_PLATFORM 249 struct wl_buffer *wl_buffer; 250 __DRIimage *dri_image; 251#endif 252#ifdef HAVE_DRM_PLATFORM 253 struct gbm_bo *bo; 254#endif 255 int locked; 256 int age; 257 } color_buffers[4], *back, *current; 258#endif 259 260#ifdef HAVE_ANDROID_PLATFORM 261 struct ANativeWindow *window; 262 struct ANativeWindowBuffer *buffer; 263 264 /* EGL-owned buffers */ 265 __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT]; 266#endif 267}; 268 269 270struct dri2_egl_config 271{ 272 _EGLConfig base; 273 const __DRIconfig *dri_single_config; 274 const __DRIconfig *dri_double_config; 275}; 276 277struct dri2_egl_image 278{ 279 _EGLImage base; 280 __DRIimage *dri_image; 281}; 282 283/* From xmlpool/options.h, user exposed so should be stable */ 284#define DRI_CONF_VBLANK_NEVER 0 285#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 286#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 287#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 288 289/* standard typecasts */ 290_EGL_DRIVER_STANDARD_TYPECASTS(dri2_egl) 291_EGL_DRIVER_TYPECAST(dri2_egl_image, _EGLImage, obj) 292 293extern const __DRIimageLookupExtension image_lookup_extension; 294extern const __DRIuseInvalidateExtension use_invalidate; 295 296EGLBoolean 297dri2_load_driver(_EGLDisplay *disp); 298 299/* Helper for platforms not using dri2_create_screen */ 300void 301dri2_setup_screen(_EGLDisplay *disp); 302 303EGLBoolean 304dri2_load_driver_swrast(_EGLDisplay *disp); 305 306EGLBoolean 307dri2_create_screen(_EGLDisplay *disp); 308 309__DRIimage * 310dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data); 311 312struct dri2_egl_config * 313dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id, 314 EGLint surface_type, const EGLint *attr_list, 315 const unsigned int *rgba_masks); 316 317_EGLImage * 318dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, 319 _EGLContext *ctx, EGLenum target, 320 EGLClientBuffer buffer, const EGLint *attr_list); 321 322EGLBoolean 323dri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp); 324 325EGLBoolean 326dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp); 327 328EGLBoolean 329dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp); 330 331EGLBoolean 332dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp); 333 334#endif /* EGL_DRI2_INCLUDED */ 335