blob: a835f8ed320f7a2d3c624c761b7b7f98ace4ea35 [file] [log] [blame]
Kristian Høgsberg2889d962011-02-02 22:10:40 -05001/*
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
Kristian Høgsberg93aea632011-05-11 13:58:37 -040031#ifdef HAVE_X11_PLATFORM
Kristian Høgsberg2889d962011-02-02 22:10:40 -050032#include <xcb/xcb.h>
33#include <xcb/dri2.h>
34#include <xcb/xfixes.h>
35#include <X11/Xlib-xcb.h>
Kristian Høgsberg93aea632011-05-11 13:58:37 -040036#endif
Kristian Høgsberg2889d962011-02-02 22:10:40 -050037
Benjamin Franzke93aea842011-02-04 12:39:40 +010038#ifdef HAVE_WAYLAND_PLATFORM
39#include <wayland-client.h>
40#include "wayland-egl-priv.h"
41#endif
42
Kristian Høgsberg2889d962011-02-02 22:10:40 -050043#include <GL/gl.h>
44#include <GL/internal/dri_interface.h>
45
Benjamin Franzkeb2d63752011-07-02 13:41:35 +020046#ifdef HAVE_DRM_PLATFORM
Benjamin Franzkee5fc4c82011-05-30 10:50:52 +020047#include <gbm_driint.h>
Benjamin Franzkeb2d63752011-07-02 13:41:35 +020048#endif
Benjamin Franzkee5fc4c82011-05-30 10:50:52 +020049
Chia-I Wu9779f6f2011-08-05 14:39:18 +090050#ifdef HAVE_ANDROID_PLATFORM
51#define LOG_TAG "EGL-DRI2"
Chia-I Wu75cc24c2011-11-25 11:59:02 +080052
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>
Chia-I Wu9779f6f2011-08-05 14:39:18 +090059#endif
60
Chia-I Wu75cc24c2011-11-25 11:59:02 +080061#include <hardware/gralloc.h>
62#include <gralloc_drm_handle.h>
63#include <cutils/log.h>
64
65#endif /* HAVE_ANDROID_PLATFORM */
66
Kristian Høgsberg2889d962011-02-02 22:10:40 -050067#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 dri2_egl_driver
79{
80 _EGLDriver base;
81
82 void *handle;
83 _EGLProc (*get_proc_address)(const char *procname);
84 void (*glFlush)(void);
85};
86
Chad Versace90502b12014-01-28 11:41:46 -080087struct dri2_egl_display_vtbl {
88 int (*authenticate)(_EGLDisplay *disp, uint32_t id);
Chad Versace8b9298a2014-01-28 12:34:19 -080089
Chad Versace0a0c8812014-01-28 16:39:09 -080090 _EGLSurface* (*create_window_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
91 _EGLConfig *config,
92 EGLNativeWindowType window,
93 const EGLint *attrib_list);
94
Chad Versacebc8b07a2014-01-28 16:45:07 -080095 _EGLSurface* (*create_pixmap_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
96 _EGLConfig *config,
97 EGLNativePixmapType pixmap,
98 const EGLint *attrib_list);
99
Chad Versacebf200762014-01-28 17:03:03 -0800100 _EGLSurface* (*create_pbuffer_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
101 _EGLConfig *config,
102 const EGLint *attrib_list);
103
Chad Versace958dd802014-01-28 17:03:03 -0800104 EGLBoolean (*destroy_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
105 _EGLSurface *surface);
106
Chad Versace8b9298a2014-01-28 12:34:19 -0800107 EGLBoolean (*swap_interval)(_EGLDriver *drv, _EGLDisplay *dpy,
108 _EGLSurface *surf, EGLint interval);
Chad Versacead173bc2014-01-28 16:21:21 -0800109
110 EGLBoolean (*swap_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
111 _EGLSurface *surf);
Chad Versaced03948a2014-01-28 16:26:44 -0800112
Chad Versace3fdfbd22014-01-28 17:03:03 -0800113 EGLBoolean (*swap_buffers_with_damage)(_EGLDriver *drv, _EGLDisplay *dpy,
114 _EGLSurface *surface,
115 const EGLint *rects, EGLint n_rects);
116
Chad Versacebc2cbc02014-01-28 17:03:03 -0800117 EGLBoolean (*copy_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
118 _EGLSurface *surf, EGLNativePixmapType target);
119
Chad Versace3fdfbd22014-01-28 17:03:03 -0800120 EGLint (*query_buffer_age)(_EGLDriver *drv, _EGLDisplay *dpy,
121 _EGLSurface *surf);
Chad Versace90502b12014-01-28 11:41:46 -0800122};
123
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500124struct dri2_egl_display
125{
Chad Versace90502b12014-01-28 11:41:46 -0800126 const struct dri2_egl_display_vtbl *vtbl;
127
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500128 int dri2_major;
129 int dri2_minor;
130 __DRIscreen *dri_screen;
Benjamin Franzke992680c2011-06-27 10:23:34 +0200131 int own_dri_screen;
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500132 const __DRIconfig **driver_configs;
133 void *driver;
134 __DRIcoreExtension *core;
135 __DRIdri2Extension *dri2;
Haitao Fengf55d0272011-02-16 23:05:15 -0500136 __DRIswrastExtension *swrast;
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500137 __DRI2flushExtension *flush;
138 __DRItexBufferExtension *tex_buffer;
139 __DRIimageExtension *image;
Ian Romanick7b4b4f82012-07-19 16:04:01 -0700140 __DRIrobustnessExtension *robustness;
Eric Anholt7e9bd2b2012-09-25 14:05:30 -0700141 __DRI2configQueryExtension *config;
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500142 int fd;
143
Benjamin Franzke2a584532011-12-13 14:43:48 +0100144 int own_device;
Fredrik Höglund655f2c12011-12-20 17:17:02 +0100145 int swap_available;
Fredrik Höglund352c8892011-12-20 17:38:45 +0100146 int invalidate_available;
Eric Anholt7e9bd2b2012-09-25 14:05:30 -0700147 int min_swap_interval;
148 int max_swap_interval;
149 int default_swap_interval;
Benjamin Franzkeb2d63752011-07-02 13:41:35 +0200150#ifdef HAVE_DRM_PLATFORM
Benjamin Franzkee5fc4c82011-05-30 10:50:52 +0200151 struct gbm_dri_device *gbm_dri;
Benjamin Franzkeb2d63752011-07-02 13:41:35 +0200152#endif
Benjamin Franzkee5fc4c82011-05-30 10:50:52 +0200153
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500154 char *device_name;
155 char *driver_name;
156
Haitao Fengf55d0272011-02-16 23:05:15 -0500157 __DRIdri2LoaderExtension dri2_loader_extension;
158 __DRIswrastLoaderExtension swrast_loader_extension;
Kristian Høgsberg68bb26be2013-11-08 22:10:36 -0800159 const __DRIextension *extensions[5];
Eric Anholtf93533d2013-09-27 11:39:25 -0700160 const __DRIextension **driver_extensions;
Kristian Høgsberg93aea632011-05-11 13:58:37 -0400161
162#ifdef HAVE_X11_PLATFORM
163 xcb_connection_t *conn;
164#endif
165
Benjamin Franzke93aea842011-02-04 12:39:40 +0100166#ifdef HAVE_WAYLAND_PLATFORM
Kristian Høgsbergc0f8c992011-04-14 10:42:41 -0400167 struct wl_display *wl_dpy;
Kristian Høgsberg0229e3a2012-10-10 22:10:42 -0400168 struct wl_registry *wl_registry;
Benjamin Franzke6b369c42011-02-21 16:22:34 +0100169 struct wl_drm *wl_server_drm;
Kristian Høgsbergc0f8c992011-04-14 10:42:41 -0400170 struct wl_drm *wl_drm;
Kristian Høgsberg0229e3a2012-10-10 22:10:42 -0400171 struct wl_event_queue *wl_queue;
Kristian Høgsbergc0f8c992011-04-14 10:42:41 -0400172 int authenticated;
Kristian Høgsberg7b1d94e2011-08-31 16:45:04 -0400173 int formats;
Kristian Høgsbergde315f72013-02-02 12:26:12 -0500174 uint32_t capabilities;
Benjamin Franzke93aea842011-02-04 12:39:40 +0100175#endif
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500176};
177
178struct dri2_egl_context
179{
180 _EGLContext base;
181 __DRIcontext *dri_context;
182};
183
Benjamin Franzke93aea842011-02-04 12:39:40 +0100184#ifdef HAVE_WAYLAND_PLATFORM
185enum wayland_buffer_type {
186 WL_BUFFER_FRONT,
187 WL_BUFFER_BACK,
Benjamin Franzke0cb356d2011-05-06 19:13:29 +0200188 WL_BUFFER_THIRD,
Benjamin Franzke93aea842011-02-04 12:39:40 +0100189 WL_BUFFER_COUNT
190};
Benjamin Franzke93aea842011-02-04 12:39:40 +0100191#endif
192
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500193struct dri2_egl_surface
194{
195 _EGLSurface base;
196 __DRIdrawable *dri_drawable;
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500197 __DRIbuffer buffers[5];
198 int buffer_count;
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500199 int have_fake_front;
Haitao Fengf55d0272011-02-16 23:05:15 -0500200
Kristian Høgsberg93aea632011-05-11 13:58:37 -0400201#ifdef HAVE_X11_PLATFORM
202 xcb_drawable_t drawable;
203 xcb_xfixes_region_t region;
Haitao Fengf55d0272011-02-16 23:05:15 -0500204 int depth;
205 int bytes_per_pixel;
206 xcb_gcontext_t gc;
207 xcb_gcontext_t swapgc;
Kristian Høgsberg93aea632011-05-11 13:58:37 -0400208#endif
Haitao Fengf55d0272011-02-16 23:05:15 -0500209
Benjamin Franzke93aea842011-02-04 12:39:40 +0100210#ifdef HAVE_WAYLAND_PLATFORM
211 struct wl_egl_window *wl_win;
Benjamin Franzke93aea842011-02-04 12:39:40 +0100212 int dx;
213 int dy;
Neil Roberts992a2db2013-11-15 13:50:50 +0000214 struct wl_callback *throttle_callback;
Kristian Høgsberg7b1d94e2011-08-31 16:45:04 -0400215 int format;
Benjamin Franzke93aea842011-02-04 12:39:40 +0100216#endif
Chia-I Wu9779f6f2011-08-05 14:39:18 +0900217
Ander Conselvan de Oliveira4a976b62012-01-25 16:24:17 +0200218#ifdef HAVE_DRM_PLATFORM
219 struct gbm_dri_surface *gbm_surf;
Ander Conselvan de Oliveira4a976b62012-01-25 16:24:17 +0200220#endif
Kristian Høgsberg90804e82012-12-13 23:30:45 -0500221
222#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM)
223 __DRIbuffer *dri_buffers[__DRI_BUFFER_COUNT];
224 struct {
225#ifdef HAVE_WAYLAND_PLATFORM
226 struct wl_buffer *wl_buffer;
Kristian Høgsberg664fe6d2013-02-02 07:40:51 -0500227 __DRIimage *dri_image;
Kristian Høgsberg90804e82012-12-13 23:30:45 -0500228#endif
229#ifdef HAVE_DRM_PLATFORM
230 struct gbm_bo *bo;
231#endif
232 int locked;
233 int age;
Neil Roberts992a2db2013-11-15 13:50:50 +0000234 } color_buffers[4], *back, *current;
Ander Conselvan de Oliveira4a976b62012-01-25 16:24:17 +0200235#endif
236
Chia-I Wu9779f6f2011-08-05 14:39:18 +0900237#ifdef HAVE_ANDROID_PLATFORM
Chia-I Wu75cc24c2011-11-25 11:59:02 +0800238 struct ANativeWindow *window;
239 struct ANativeWindowBuffer *buffer;
Chia-I Wu9779f6f2011-08-05 14:39:18 +0900240
241 /* EGL-owned buffers */
242 __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT];
243#endif
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500244};
245
Benjamin Franzke93aea842011-02-04 12:39:40 +0100246
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500247struct dri2_egl_config
248{
249 _EGLConfig base;
Benjamin Franzke87dde5b2011-02-09 15:30:20 +0100250 const __DRIconfig *dri_single_config;
251 const __DRIconfig *dri_double_config;
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500252};
253
254struct dri2_egl_image
255{
256 _EGLImage base;
257 __DRIimage *dri_image;
258};
259
Neil Roberts992a2db2013-11-15 13:50:50 +0000260/* From xmlpool/options.h, user exposed so should be stable */
261#define DRI_CONF_VBLANK_NEVER 0
262#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1
263#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2
264#define DRI_CONF_VBLANK_ALWAYS_SYNC 3
265
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500266/* standard typecasts */
267_EGL_DRIVER_STANDARD_TYPECASTS(dri2_egl)
268_EGL_DRIVER_TYPECAST(dri2_egl_image, _EGLImage, obj)
269
270extern const __DRIimageLookupExtension image_lookup_extension;
Kristian Høgsberg9dc5de52011-02-02 22:21:13 -0500271extern const __DRIuseInvalidateExtension use_invalidate;
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500272
273EGLBoolean
274dri2_load_driver(_EGLDisplay *disp);
275
Benjamin Franzkee5fc4c82011-05-30 10:50:52 +0200276/* Helper for platforms not using dri2_create_screen */
277void
278dri2_setup_screen(_EGLDisplay *disp);
279
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500280EGLBoolean
Chia-I Wucf69eea2011-06-08 16:33:55 +0800281dri2_load_driver_swrast(_EGLDisplay *disp);
282
283EGLBoolean
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500284dri2_create_screen(_EGLDisplay *disp);
285
Benjamin Franzkee5fc4c82011-05-30 10:50:52 +0200286__DRIimage *
287dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data);
288
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500289struct dri2_egl_config *
290dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
Kristian Høgsberg44e584a2013-09-14 23:13:22 -0700291 EGLint surface_type, const EGLint *attr_list,
Chia-I Wu58911b82011-08-05 14:36:14 +0900292 const unsigned int *rgba_masks);
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500293
294_EGLImage *
295dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
296 _EGLContext *ctx, EGLenum target,
297 EGLClientBuffer buffer, const EGLint *attr_list);
298
299EGLBoolean
300dri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp);
301
Kristian Høgsberg9dc5de52011-02-02 22:21:13 -0500302EGLBoolean
303dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp);
304
Benjamin Franzke93aea842011-02-04 12:39:40 +0100305EGLBoolean
306dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp);
307
Chia-I Wu9779f6f2011-08-05 14:39:18 +0900308EGLBoolean
309dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp);
310
Kristian Høgsberg2889d962011-02-02 22:10:40 -0500311#endif /* EGL_DRI2_INCLUDED */