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