Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

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