egl_dri2.h revision 63c5d5c6c46c8472ee7a8241a0f80f13d79cb8cd
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#include <stdint.h>
32
33#ifdef HAVE_X11_PLATFORM
34#include <xcb/xcb.h>
35#include <xcb/dri2.h>
36#include <xcb/xfixes.h>
37#include <X11/Xlib-xcb.h>
38
39#ifdef HAVE_DRI3
40#include "loader_dri3_helper.h"
41#endif
42#endif
43
44#ifdef HAVE_WAYLAND_PLATFORM
45#include <wayland-client.h>
46#include "wayland-egl-priv.h"
47#endif
48
49#include <GL/gl.h>
50#include <GL/internal/dri_interface.h>
51
52#ifdef HAVE_DRM_PLATFORM
53#include <gbm_driint.h>
54#endif
55
56#ifdef HAVE_ANDROID_PLATFORM
57#define LOG_TAG "EGL-DRI2"
58
59#if ANDROID_VERSION >= 0x0400
60#  include <system/window.h>
61#else
62#  define android_native_buffer_t ANativeWindowBuffer
63#  include <ui/egl/android_natives.h>
64#  include <ui/android_native_buffer.h>
65#endif
66
67#include <hardware/gralloc.h>
68#include <gralloc_drm_handle.h>
69#include <cutils/log.h>
70
71#endif /* HAVE_ANDROID_PLATFORM */
72
73#include "eglconfig.h"
74#include "eglcontext.h"
75#include "egldisplay.h"
76#include "egldriver.h"
77#include "eglcurrent.h"
78#include "egllog.h"
79#include "eglsurface.h"
80#include "eglimage.h"
81#include "eglsync.h"
82
83#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
84
85struct wl_buffer;
86
87struct dri2_egl_driver
88{
89   _EGLDriver base;
90
91   void *handle;
92   _EGLProc (*get_proc_address)(const char *procname);
93   void (*glFlush)(void);
94};
95
96struct dri2_egl_display_vtbl {
97   int (*authenticate)(_EGLDisplay *disp, uint32_t id);
98
99   _EGLSurface* (*create_window_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
100                                         _EGLConfig *config,
101                                         void *native_window,
102                                         const EGLint *attrib_list);
103
104   _EGLSurface* (*create_pixmap_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
105                                         _EGLConfig *config,
106                                         void *native_pixmap,
107                                         const EGLint *attrib_list);
108
109   _EGLSurface* (*create_pbuffer_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
110                                          _EGLConfig *config,
111                                          const EGLint *attrib_list);
112
113   EGLBoolean (*destroy_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
114                                 _EGLSurface *surface);
115
116   EGLBoolean (*swap_interval)(_EGLDriver *drv, _EGLDisplay *dpy,
117                               _EGLSurface *surf, EGLint interval);
118
119   _EGLImage* (*create_image)(_EGLDriver *drv, _EGLDisplay *dpy,
120                              _EGLContext *ctx, EGLenum target,
121                              EGLClientBuffer buffer,
122                              const EGLint *attr_list);
123
124   EGLBoolean (*swap_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
125                              _EGLSurface *surf);
126
127   EGLBoolean (*swap_buffers_with_damage)(_EGLDriver *drv, _EGLDisplay *dpy,
128                                          _EGLSurface *surface,
129                                          const EGLint *rects, EGLint n_rects);
130
131   EGLBoolean (*swap_buffers_region)(_EGLDriver *drv, _EGLDisplay *dpy,
132                                     _EGLSurface *surf, EGLint numRects,
133                                     const EGLint *rects);
134
135   EGLBoolean (*post_sub_buffer)(_EGLDriver *drv, _EGLDisplay *dpy,
136                                 _EGLSurface *surf,
137                                 EGLint x, EGLint y,
138                                 EGLint width, EGLint height);
139
140   EGLBoolean (*copy_buffers)(_EGLDriver *drv, _EGLDisplay *dpy,
141                              _EGLSurface *surf, void *native_pixmap_target);
142
143   EGLint (*query_buffer_age)(_EGLDriver *drv, _EGLDisplay *dpy,
144                              _EGLSurface *surf);
145
146   struct wl_buffer* (*create_wayland_buffer_from_image)(
147                        _EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img);
148
149   EGLBoolean (*get_sync_values)(_EGLDisplay *display, _EGLSurface *surface,
150                                 EGLuint64KHR *ust, EGLuint64KHR *msc,
151                                 EGLuint64KHR *sbc);
152
153   __DRIdrawable *(*get_dri_drawable)(_EGLSurface *surf);
154};
155
156struct dri2_egl_display
157{
158   const struct dri2_egl_display_vtbl *vtbl;
159
160   int                       dri2_major;
161   int                       dri2_minor;
162   __DRIscreen              *dri_screen;
163   int                       own_dri_screen;
164   const __DRIconfig       **driver_configs;
165   void                     *driver;
166   const __DRIcoreExtension       *core;
167   const __DRIimageDriverExtension *image_driver;
168   const __DRIdri2Extension       *dri2;
169   const __DRIswrastExtension     *swrast;
170   const __DRI2flushExtension     *flush;
171   const __DRItexBufferExtension  *tex_buffer;
172   const __DRIimageExtension      *image;
173   const __DRIrobustnessExtension *robustness;
174   const __DRI2configQueryExtension *config;
175   const __DRI2fenceExtension *fence;
176   const __DRI2rendererQueryExtension *rendererQuery;
177   const __DRI2interopExtension *interop;
178   int                       fd;
179
180   int                       own_device;
181   int                       swap_available;
182   int                       invalidate_available;
183   int                       min_swap_interval;
184   int                       max_swap_interval;
185   int                       default_swap_interval;
186#ifdef HAVE_DRM_PLATFORM
187   struct gbm_dri_device    *gbm_dri;
188#endif
189
190   char                     *device_name;
191   char                     *driver_name;
192
193   __DRIdri2LoaderExtension    dri2_loader_extension;
194   __DRIswrastLoaderExtension  swrast_loader_extension;
195   const __DRIextension     *extensions[5];
196   const __DRIextension    **driver_extensions;
197
198#ifdef HAVE_X11_PLATFORM
199   xcb_connection_t         *conn;
200   int                      screen;
201#ifdef HAVE_DRI3
202   struct loader_dri3_extensions loader_dri3_ext;
203#endif
204#endif
205
206#ifdef HAVE_WAYLAND_PLATFORM
207   struct wl_display        *wl_dpy;
208   struct wl_registry       *wl_registry;
209   struct wl_drm            *wl_server_drm;
210   struct wl_drm            *wl_drm;
211   struct wl_shm            *wl_shm;
212   struct wl_event_queue    *wl_queue;
213   int			     authenticated;
214   int			     formats;
215   uint32_t                  capabilities;
216#endif
217
218   int              is_render_node;
219   int			     is_different_gpu;
220};
221
222struct dri2_egl_context
223{
224   _EGLContext   base;
225   __DRIcontext *dri_context;
226};
227
228#ifdef HAVE_WAYLAND_PLATFORM
229enum wayland_buffer_type {
230   WL_BUFFER_FRONT,
231   WL_BUFFER_BACK,
232   WL_BUFFER_THIRD,
233   WL_BUFFER_COUNT
234};
235#endif
236
237struct dri2_egl_surface
238{
239   _EGLSurface          base;
240   __DRIdrawable       *dri_drawable;
241   __DRIbuffer          buffers[5];
242   int                  buffer_count;
243   int                  have_fake_front;
244
245#ifdef HAVE_X11_PLATFORM
246   xcb_drawable_t       drawable;
247   xcb_xfixes_region_t  region;
248   int                  depth;
249   int                  bytes_per_pixel;
250   xcb_gcontext_t       gc;
251   xcb_gcontext_t       swapgc;
252#endif
253
254#ifdef HAVE_WAYLAND_PLATFORM
255   struct wl_egl_window  *wl_win;
256   int                    dx;
257   int                    dy;
258   struct wl_callback    *throttle_callback;
259   int			  format;
260#endif
261
262#ifdef HAVE_DRM_PLATFORM
263   struct gbm_dri_surface *gbm_surf;
264#endif
265
266#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM)
267   __DRIbuffer           *dri_buffers[__DRI_BUFFER_COUNT];
268   struct {
269#ifdef HAVE_WAYLAND_PLATFORM
270      struct wl_buffer   *wl_buffer;
271      __DRIimage         *dri_image;
272      /* for is_different_gpu case. NULL else */
273      __DRIimage         *linear_copy;
274      /* for swrast */
275      void *data;
276      int data_size;
277#endif
278#ifdef HAVE_DRM_PLATFORM
279      struct gbm_bo       *bo;
280#endif
281      int                 locked;
282      int                 age;
283   } color_buffers[4], *back, *current;
284#endif
285
286#ifdef HAVE_ANDROID_PLATFORM
287   struct ANativeWindow *window;
288   struct ANativeWindowBuffer *buffer;
289   __DRIimage *dri_image;
290
291   /* EGL-owned buffers */
292   __DRIbuffer           *local_buffers[__DRI_BUFFER_COUNT];
293#endif
294
295#if defined(HAVE_SURFACELESS_PLATFORM)
296      __DRIimage           *front;
297      unsigned int         visual;
298#endif
299
300};
301
302struct dri2_egl_config
303{
304   _EGLConfig         base;
305   const __DRIconfig *dri_single_config[2];
306   const __DRIconfig *dri_double_config[2];
307};
308
309struct dri2_egl_image
310{
311   _EGLImage   base;
312   __DRIimage *dri_image;
313};
314
315struct dri2_egl_sync {
316   _EGLSync base;
317   mtx_t mutex;
318   cnd_t cond;
319   int refcount;
320   void *fence;
321};
322
323/* From xmlpool/options.h, user exposed so should be stable */
324#define DRI_CONF_VBLANK_NEVER 0
325#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1
326#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2
327#define DRI_CONF_VBLANK_ALWAYS_SYNC 3
328
329/* standard typecasts */
330_EGL_DRIVER_STANDARD_TYPECASTS(dri2_egl)
331_EGL_DRIVER_TYPECAST(dri2_egl_image, _EGLImage, obj)
332_EGL_DRIVER_TYPECAST(dri2_egl_sync, _EGLSync, obj)
333
334extern const __DRIimageLookupExtension image_lookup_extension;
335extern const __DRIuseInvalidateExtension use_invalidate;
336
337EGLBoolean
338dri2_load_driver(_EGLDisplay *disp);
339
340/* Helper for platforms not using dri2_create_screen */
341void
342dri2_setup_screen(_EGLDisplay *disp);
343
344EGLBoolean
345dri2_load_driver_swrast(_EGLDisplay *disp);
346
347EGLBoolean
348dri2_load_driver_dri3(_EGLDisplay *disp);
349
350EGLBoolean
351dri2_create_screen(_EGLDisplay *disp);
352
353__DRIdrawable *
354dri2_surface_get_dri_drawable(_EGLSurface *surf);
355
356__DRIimage *
357dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data);
358
359struct dri2_egl_config *
360dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
361		EGLint surface_type, const EGLint *attr_list,
362		const unsigned int *rgba_masks);
363
364_EGLImage *
365dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
366		      _EGLContext *ctx, EGLenum target,
367		      EGLClientBuffer buffer, const EGLint *attr_list);
368
369_EGLImage *
370dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
371			  EGLClientBuffer buffer, const EGLint *attr_list);
372
373EGLBoolean
374dri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp);
375
376EGLBoolean
377dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp);
378
379EGLBoolean
380dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp);
381
382EGLBoolean
383dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp);
384
385EGLBoolean
386dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp);
387
388void
389dri2_flush_drawable_for_swapbuffers(_EGLDisplay *disp, _EGLSurface *draw);
390
391const __DRIconfig *
392dri2_get_dri_config(struct dri2_egl_config *conf, EGLint surface_type,
393                    EGLenum colorspace);
394
395#endif /* EGL_DRI2_INCLUDED */
396