egl_dri2.h revision e5fc4c81ce5aa261e330977f1a672838cd186cdb
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-drm.h"
41#include "wayland-egl-priv.h"
42#endif
43
44#include <GL/gl.h>
45#include <GL/internal/dri_interface.h>
46
47#include <gbm_driint.h>
48
49#include "eglconfig.h"
50#include "eglcontext.h"
51#include "egldisplay.h"
52#include "egldriver.h"
53#include "eglcurrent.h"
54#include "egllog.h"
55#include "eglsurface.h"
56#include "eglimage.h"
57
58#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
59
60struct dri2_egl_driver
61{
62   _EGLDriver base;
63
64   void *handle;
65   _EGLProc (*get_proc_address)(const char *procname);
66   void (*glFlush)(void);
67};
68
69struct dri2_egl_display
70{
71   int                       dri2_major;
72   int                       dri2_minor;
73   __DRIscreen              *dri_screen;
74   const __DRIconfig       **driver_configs;
75   void                     *driver;
76   __DRIcoreExtension       *core;
77   __DRIdri2Extension       *dri2;
78   __DRIswrastExtension     *swrast;
79   __DRI2flushExtension     *flush;
80   __DRItexBufferExtension  *tex_buffer;
81   __DRIimageExtension      *image;
82   int                       fd;
83
84   struct gbm_dri_device    *gbm_dri;
85
86   char                     *device_name;
87   char                     *driver_name;
88
89   __DRIdri2LoaderExtension    dri2_loader_extension;
90   __DRIswrastLoaderExtension  swrast_loader_extension;
91   const __DRIextension     *extensions[4];
92
93#ifdef HAVE_X11_PLATFORM
94   xcb_connection_t         *conn;
95#endif
96
97#ifdef HAVE_WAYLAND_PLATFORM
98   struct wl_display        *wl_dpy;
99   struct wl_drm            *wl_server_drm;
100   struct wl_drm            *wl_drm;
101   int			     authenticated;
102#endif
103
104   int (*authenticate) (_EGLDisplay *disp, uint32_t id);
105};
106
107struct dri2_egl_context
108{
109   _EGLContext   base;
110   __DRIcontext *dri_context;
111};
112
113#ifdef HAVE_WAYLAND_PLATFORM
114enum wayland_buffer_type {
115   WL_BUFFER_FRONT,
116   WL_BUFFER_BACK,
117   WL_BUFFER_THIRD,
118   WL_BUFFER_COUNT
119};
120
121#define __DRI_BUFFER_COUNT 10
122#endif
123
124enum dri2_surface_type {
125   DRI2_WINDOW_SURFACE,
126   DRI2_PIXMAP_SURFACE,
127   DRI2_PBUFFER_SURFACE
128};
129
130struct dri2_egl_surface
131{
132   _EGLSurface          base;
133   __DRIdrawable       *dri_drawable;
134   __DRIbuffer          buffers[5];
135   int                  buffer_count;
136   int                  have_fake_front;
137   int                  swap_interval;
138
139#ifdef HAVE_X11_PLATFORM
140   xcb_drawable_t       drawable;
141   xcb_xfixes_region_t  region;
142   int                  depth;
143   int                  bytes_per_pixel;
144   xcb_gcontext_t       gc;
145   xcb_gcontext_t       swapgc;
146#endif
147
148   enum dri2_surface_type type;
149#ifdef HAVE_WAYLAND_PLATFORM
150   struct wl_egl_window  *wl_win;
151   struct wl_egl_pixmap  *wl_pix;
152   struct wl_buffer      *wl_drm_buffer[WL_BUFFER_COUNT];
153   int                    wl_buffer_lock[WL_BUFFER_COUNT];
154   int                    dx;
155   int                    dy;
156   __DRIbuffer           *dri_buffers[__DRI_BUFFER_COUNT];
157   __DRIbuffer           *third_buffer;
158   __DRIbuffer           *pending_buffer;
159   EGLBoolean             block_swap_buffers;
160#endif
161};
162
163struct dri2_egl_buffer {
164   __DRIbuffer *dri_buffer;
165   struct dri2_egl_display *dri2_dpy;
166};
167
168
169struct dri2_egl_config
170{
171   _EGLConfig         base;
172   const __DRIconfig *dri_single_config;
173   const __DRIconfig *dri_double_config;
174};
175
176struct dri2_egl_image
177{
178   _EGLImage   base;
179   __DRIimage *dri_image;
180};
181
182/* standard typecasts */
183_EGL_DRIVER_STANDARD_TYPECASTS(dri2_egl)
184_EGL_DRIVER_TYPECAST(dri2_egl_image, _EGLImage, obj)
185
186extern const __DRIimageLookupExtension image_lookup_extension;
187extern const __DRIuseInvalidateExtension use_invalidate;
188
189EGLBoolean
190dri2_load_driver(_EGLDisplay *disp);
191
192/* Helper for platforms not using dri2_create_screen */
193void
194dri2_setup_screen(_EGLDisplay *disp);
195
196EGLBoolean
197dri2_load_driver_swrast(_EGLDisplay *disp);
198
199EGLBoolean
200dri2_create_screen(_EGLDisplay *disp);
201
202__DRIimage *
203dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data);
204
205struct dri2_egl_config *
206dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
207		int depth, EGLint surface_type, const EGLint *attr_list);
208
209_EGLImage *
210dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
211		      _EGLContext *ctx, EGLenum target,
212		      EGLClientBuffer buffer, const EGLint *attr_list);
213
214EGLBoolean
215dri2_initialize_x11(_EGLDriver *drv, _EGLDisplay *disp);
216
217EGLBoolean
218dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp);
219
220EGLBoolean
221dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp);
222
223char *
224dri2_get_driver_for_fd(int fd);
225char *
226dri2_get_device_name_for_fd(int fd);
227
228#endif /* EGL_DRI2_INCLUDED */
229