Enable DRI2 based on Dodji Seketeli's DRI work
[xephyr-with-gl-acceleration:xephyr-with-gl-acceleration.git] / xserver / hw / kdrive / ephyr / ephyrdri2.c
1 /*
2  * Xephyr - A kdrive X server thats runs in a host X window.
3  *          Authored by Matthew Allum <mallum@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  *    Haitao Feng <haitao.feng@intel.com>
27  */
28 #ifdef HAVE_CONFIG_H
29 #include <kdrive-config.h>
30 #endif
31
32 #include "scrnintstr.h"
33 #include <X11/Xutil.h>
34 #include <X11/Xlibint.h>
35 #include <GL/glx.h>
36 #include "hostx.h"
37 #define _HAVE_XALLOC_DECLS
38 #include "ephyrlog.h"
39 #include "dixstruct.h"
40 #include "pixmapstr.h"
41 #include "ephyrdri2.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 ephyrDRI2Connect(ScreenPtr pScreen, unsigned int driverType, int *fd,
53             char **driverName, char **deviceName)
54 {
55     Display *dpy = hostx_get_display () ;
56     return DRI2Connect(dpy, RootWindow(dpy, DefaultScreen(dpy)), driverName, deviceName);
57 }
58
59 Bool ephyrDRI2Authenticate(ScreenPtr pScreen, drm_magic_t magic)
60 {
61     Display *dpy = hostx_get_display () ;
62     return DRI2Authenticate(dpy, RootWindow(dpy, DefaultScreen(dpy)), magic);
63 }
64
65 int ephyrDRI2CreateDrawable(XID drawable)
66 {
67     Display *dpy = hostx_get_display () ;
68     DRI2CreateDrawable(dpy, drawable);
69     return Success ;
70 }
71
72 DRI2Buffer *ephyrDRI2GetBuffers(XID drawable,
73                              int *width,
74                              int *height,
75                              unsigned int *attachments,
76                              int count,
77                              int *out_count)
78 {
79     Display *dpy = hostx_get_display ();
80     return DRI2GetBuffers(dpy, drawable, width, height, attachments, count, out_count);
81 }
82
83 DRI2Buffer *ephyrDRI2GetBuffersWithFormat(XID drawable,
84         int *width, int *height, unsigned int *attachments, int count,
85         int *out_count)
86 {
87     Display *dpy = hostx_get_display ();
88     return DRI2GetBuffersWithFormat(dpy, drawable, width, height, attachments, count, out_count);
89 }
90
91 int ephyrDRI2CopyRegion(XID drawable,
92                    EphyrDRI2WindowPair *pair,
93                    RegionPtr pRegion,
94                    unsigned int dest,
95                    unsigned int src)
96 {
97     Display *dpy = hostx_get_display ();
98     XRectangle xrect;
99     XserverRegion region;
100     XImage *img;
101     ScreenPtr screen;
102
103     xrect.x = pRegion->extents.x1;
104     xrect.y = pRegion->extents.y1;
105     xrect.width  = pRegion->extents.x2 - pRegion->extents.x1;
106     xrect.height = pRegion->extents.y2 - pRegion->extents.y1;
107
108     region = XFixesCreateRegion(dpy, &xrect, 1);
109     DRI2CopyRegion(dpy, pair->remote, region, dest, src);
110     XFixesDestroyRegion(dpy, region);
111
112     return Success;
113 }
114
115 void ephyrDRI2DestroyDrawable(XID drawable)
116 {
117     Display *dpy = hostx_get_display ();
118     DRI2DestroyDrawable(dpy, drawable);
119 }