Home | History | Annotate | Line # | Download | only in ephyr
      1 /*
      2  * Xephyr - A kdrive X server thats runs in a host X window.
      3  *          Authored by Matthew Allum <mallum (at) openedhand.com>
      4  *
      5  * Copyright  2007 OpenedHand Ltd
      6  *
      7  * Permission to use, copy, modify, distribute, and sell this software and its
      8  * documentation for any purpose is hereby granted without fee, provided that
      9  * the above copyright notice appear in all copies and that both that
     10  * copyright notice and this permission notice appear in supporting
     11  * documentation, and that the name of OpenedHand Ltd not be used in
     12  * advertising or publicity pertaining to distribution of the software without
     13  * specific, written prior permission. OpenedHand Ltd makes no
     14  * representations about the suitability of this software for any purpose.  It
     15  * is provided "as is" without express or implied warranty.
     16  *
     17  * OpenedHand Ltd DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     18  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
     19  * EVENT SHALL OpenedHand Ltd BE LIABLE FOR ANY SPECIAL, INDIRECT OR
     20  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
     21  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
     22  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
     23  * PERFORMANCE OF THIS SOFTWARE.
     24  *
     25  * Authors:
     26  *    Dodji Seketeli <dodji (at) openedhand.com>
     27  */
     28 #ifdef HAVE_CONFIG_H
     29 #include <kdrive-config.h>
     30 #endif
     31 
     32 #include <X11/Xutil.h>
     33 #include <X11/Xlibint.h>
     34 #include <GL/glx.h>
     35 #include "xf86dri.h"
     36 #include "hostx.h"
     37 #include "ephyrdri.h"
     38 #define _HAVE_XALLOC_DECLS
     39 #include "ephyrlog.h"
     40 #include "dixstruct.h"
     41 #include "pixmapstr.h"
     42 
     43 #ifndef TRUE
     44 #define TRUE 1
     45 #endif /*TRUE*/
     46 
     47 #ifndef FALSE
     48 #define FALSE 0
     49 #endif /*FALSE*/
     50 
     51 Bool
     52 ephyrDRIQueryDirectRenderingCapable (int a_screen, Bool *a_is_capable)
     53 {
     54     Display *dpy=hostx_get_display () ;
     55     Bool is_ok=FALSE ;
     56 
     57     EPHYR_RETURN_VAL_IF_FAIL (a_is_capable, FALSE) ;
     58     EPHYR_LOG ("enter\n") ;
     59     is_ok = XF86DRIQueryDirectRenderingCapable (dpy, DefaultScreen (dpy),
     60                                                 a_is_capable) ;
     61     EPHYR_LOG ("leave. is_capable:%d, is_ok=%d\n", *a_is_capable, is_ok) ;
     62 
     63     return is_ok ;
     64 }
     65 
     66 Bool
     67 ephyrDRIOpenConnection (int a_screen,
     68                         drm_handle_t *a_sarea,
     69                         char **a_bus_id_string)
     70 {
     71     Display *dpy = hostx_get_display () ;
     72     Bool is_ok=FALSE ;
     73 
     74     EPHYR_RETURN_VAL_IF_FAIL (a_bus_id_string, FALSE) ;
     75     EPHYR_LOG ("enter. screen:%d\n", a_screen) ;
     76     is_ok = XF86DRIOpenConnection (dpy, DefaultScreen (dpy),
     77                                    a_sarea,
     78                                    a_bus_id_string) ;
     79     if (*a_bus_id_string) {
     80         EPHYR_LOG ("leave. bus_id_string:%s, is_ok:%d\n",
     81                    *a_bus_id_string, is_ok) ;
     82     } else {
     83         EPHYR_LOG ("leave. bus_id_string:null, is_ok:%d\n",
     84                    is_ok) ;
     85     }
     86     return is_ok ;
     87 }
     88 
     89 Bool
     90 ephyrDRIAuthConnection (int a_screen, drm_magic_t a_magic)
     91 {
     92     Display *dpy = hostx_get_display () ;
     93     Bool is_ok=FALSE ;
     94 
     95     EPHYR_LOG ("enter\n") ;
     96     is_ok = XF86DRIAuthConnection (dpy, DefaultScreen (dpy), a_magic) ;
     97     EPHYR_LOG ("leave. is_ok:%d\n", is_ok) ;
     98     return is_ok ;
     99 }
    100 
    101 Bool
    102 ephyrDRICloseConnection (int a_screen)
    103 {
    104     Display *dpy = hostx_get_display () ;
    105     Bool is_ok=FALSE ;
    106 
    107     EPHYR_LOG ("enter\n") ;
    108     is_ok = XF86DRICloseConnection (dpy, DefaultScreen (dpy)) ;
    109     EPHYR_LOG ("leave\n") ;
    110     return is_ok ;
    111 }
    112 
    113 Bool
    114 ephyrDRIGetClientDriverName (int a_screen,
    115                              int *a_ddx_driver_major_version,
    116                              int *a_ddx_driver_minor_version,
    117                              int *a_ddx_driver_patch_version,
    118                              char ** a_client_driver_name)
    119 {
    120     Display *dpy = hostx_get_display () ;
    121     Bool is_ok=FALSE ;
    122 
    123     EPHYR_RETURN_VAL_IF_FAIL (a_ddx_driver_major_version
    124                               && a_ddx_driver_minor_version
    125                               && a_ddx_driver_patch_version
    126                               && a_client_driver_name,
    127                               FALSE);
    128     EPHYR_LOG ("enter\n") ;
    129     is_ok = XF86DRIGetClientDriverName (dpy, DefaultScreen (dpy),
    130                                         a_ddx_driver_major_version,
    131                                         a_ddx_driver_minor_version,
    132                                         a_ddx_driver_patch_version,
    133                                         a_client_driver_name) ;
    134     EPHYR_LOG ("major:%d, minor:%d, patch:%d, name:%s\n",
    135                 *a_ddx_driver_major_version,
    136                 *a_ddx_driver_minor_version,
    137                 *a_ddx_driver_patch_version,
    138                 *a_client_driver_name) ;
    139     EPHYR_LOG ("leave:%d\n", is_ok) ;
    140     return is_ok ;
    141 }
    142 
    143 Bool
    144 ephyrDRICreateContext (int a_screen,
    145                        int a_visual_id,
    146                        XID *a_returned_ctxt_id,
    147                        drm_context_t *a_hw_ctxt)
    148 {
    149     Display *dpy = hostx_get_display () ;
    150     Bool is_ok=FALSE ;
    151     Visual v;
    152 
    153     EPHYR_LOG ("enter. screen:%d, visual:%d\n", a_screen, a_visual_id) ;
    154     memset (&v, 0, sizeof (v)) ;
    155     v.visualid = a_visual_id ;
    156     is_ok = XF86DRICreateContext (dpy,
    157                                   DefaultScreen (dpy),
    158                                   &v,
    159                                   a_returned_ctxt_id,
    160                                   a_hw_ctxt) ;
    161     EPHYR_LOG ("leave:%d\n", is_ok) ;
    162     return is_ok ;
    163 }
    164 
    165 Bool
    166 ephyrDRIDestroyContext (int a_screen,
    167                         int a_context_id)
    168 {
    169     Display *dpy = hostx_get_display () ;
    170     Bool is_ok=FALSE ;
    171 
    172     EPHYR_LOG ("enter\n") ;
    173     is_ok = XF86DRIDestroyContext (dpy, DefaultScreen (dpy), a_context_id) ;
    174     EPHYR_LOG ("leave:%d\n", is_ok) ;
    175     return is_ok ;
    176 }
    177 
    178 Bool
    179 ephyrDRICreateDrawable (int a_screen,
    180                         int a_drawable,
    181                         drm_drawable_t *a_hw_drawable)
    182 {
    183     Bool is_ok=FALSE;
    184     Display *dpy=hostx_get_display () ;
    185 
    186     EPHYR_LOG ("enter\n") ;
    187     is_ok = XF86DRICreateDrawable (dpy, DefaultScreen (dpy),
    188                                    a_drawable, a_hw_drawable) ;
    189     EPHYR_LOG ("leave. is_ok:%d\n", is_ok) ;
    190     return is_ok ;
    191 }
    192 
    193 Bool
    194 ephyrDRIDestroyDrawable (int a_screen, int a_drawable)
    195 {
    196     EPHYR_LOG ("enter\n") ;
    197     EPHYR_LOG_ERROR ("not implemented yet\n") ;
    198     EPHYR_LOG ("leave\n") ;
    199     return FALSE ;
    200 }
    201 
    202 Bool
    203 ephyrDRIGetDrawableInfo (int a_screen,
    204                          int a_drawable,
    205                          unsigned int *a_index,
    206                          unsigned int *a_stamp,
    207                          int *a_x,
    208                          int *a_y,
    209                          int *a_w,
    210                          int *a_h,
    211                          int *a_num_clip_rects,
    212                          drm_clip_rect_t **a_clip_rects,
    213                          int *a_back_x,
    214                          int *a_back_y,
    215                          int *a_num_back_clip_rects,
    216                          drm_clip_rect_t **a_back_clip_rects)
    217 {
    218     Bool is_ok=FALSE;
    219     Display *dpy=hostx_get_display ()  ;
    220     EphyrHostWindowAttributes attrs ;
    221 
    222     EPHYR_RETURN_VAL_IF_FAIL (a_x && a_y && a_w && a_h
    223                               && a_num_clip_rects,
    224                               FALSE) ;
    225 
    226     EPHYR_LOG ("enter\n") ;
    227     memset (&attrs, 0, sizeof (attrs)) ;
    228     if (!hostx_get_window_attributes (a_drawable, &attrs)) {
    229         EPHYR_LOG_ERROR ("failed to query host window attributes\n") ;
    230         goto out;
    231     }
    232     if (!XF86DRIGetDrawableInfo (dpy, DefaultScreen (dpy), a_drawable,
    233                                  a_index, a_stamp,
    234                                  a_x, a_y,
    235                                  a_w, a_h,
    236                                  a_num_clip_rects, a_clip_rects,
    237                                  a_back_x, a_back_y,
    238                                  a_num_back_clip_rects,
    239                                  a_back_clip_rects)) {
    240         EPHYR_LOG_ERROR ("XF86DRIGetDrawableInfo ()\n") ;
    241         goto out ;
    242     }
    243     EPHYR_LOG ("host x,y,w,h: (%d,%d,%d,%d)\n", *a_x, *a_y, *a_w, *a_h) ;
    244     if (*a_num_clip_rects) {
    245         free (*a_back_clip_rects) ;
    246         *a_back_clip_rects = calloc (*a_num_clip_rects,
    247                                      sizeof (drm_clip_rect_t)) ;
    248         memmove (*a_back_clip_rects,
    249                  *a_clip_rects,
    250                  *a_num_clip_rects * sizeof (drm_clip_rect_t)) ;
    251         *a_num_back_clip_rects = *a_num_clip_rects;
    252     }
    253     EPHYR_LOG ("num back clip rects:%d, num clip rects:%d\n",
    254                *a_num_clip_rects, *a_num_back_clip_rects) ;
    255     *a_back_x = *a_x ;
    256     *a_back_y = *a_y ;
    257     *a_w = attrs.width;
    258     *a_h = attrs.height;
    259 
    260     is_ok = TRUE ;
    261 out:
    262     EPHYR_LOG ("leave. index:%d, stamp:%d, x,y:(%d,%d), w,y:(%d,%d)\n",
    263                *a_index, *a_stamp, *a_x, *a_y, *a_w, *a_h) ;
    264     return is_ok ;
    265 }
    266 
    267 Bool
    268 ephyrDRIGetDeviceInfo (int a_screen,
    269                        drm_handle_t *a_frame_buffer,
    270                        int *a_fb_origin,
    271                        int *a_fb_size,
    272                        int *a_fb_stride,
    273                        int *a_dev_private_size,
    274                        void **a_dev_private)
    275 {
    276     Bool is_ok = FALSE ;
    277     Display *dpy = hostx_get_display () ;
    278 
    279     EPHYR_RETURN_VAL_IF_FAIL (dpy, FALSE) ;
    280     EPHYR_LOG ("enter\n") ;
    281     is_ok = XF86DRIGetDeviceInfo (dpy, DefaultScreen (dpy), a_frame_buffer,
    282                                   a_fb_origin, a_fb_size, a_fb_stride,
    283                                   a_dev_private_size, a_dev_private) ;
    284     EPHYR_LOG ("leave:%d\n", is_ok) ;
    285     return is_ok ;
    286 }
    287