diff options
author | Adam Jackson <ajax@redhat.com> | 2015-12-08 17:41:38 -0500 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2016-01-28 09:01:12 -0500 |
commit | 623ff251dd025929f5bb6174ca86580c5e707261 (patch) | |
tree | 747955f3e8b640edd2309f0a8101fc7a1ad54ba6 /hw/kdrive/ephyr/ephyrdriext.c | |
parent | 953b71270cf12c59c8a836c9be403d07fb01fa22 (diff) |
xephyr: Remove DRI1
This only worked if the backend server supported DRI1, which is
stunningly unlikely these days.
Signed-off-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'hw/kdrive/ephyr/ephyrdriext.c')
-rw-r--r-- | hw/kdrive/ephyr/ephyrdriext.c | 1376 |
1 files changed, 0 insertions, 1376 deletions
diff --git a/hw/kdrive/ephyr/ephyrdriext.c b/hw/kdrive/ephyr/ephyrdriext.c deleted file mode 100644 index 3703adf8c..000000000 --- a/hw/kdrive/ephyr/ephyrdriext.c +++ /dev/null @@ -1,1376 +0,0 @@ -/* - * Xephyr - A kdrive X server thats runs in a host X window. - * Authored by Matthew Allum <mallum@openedhand.com> - * - * Copyright © 2007 OpenedHand Ltd - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of OpenedHand Ltd not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. OpenedHand Ltd makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * OpenedHand Ltd DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL OpenedHand Ltd BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * This file is heavily copied from hw/xfree86/dri/xf86dri.c - * - * Authors: - * Dodji Seketeli <dodji@openedhand.com> - */ - -#ifdef HAVE_CONFIG_H -#include <kdrive-config.h> -#endif - -#include <string.h> - -#include <X11/X.h> -#include <X11/Xproto.h> -#define _XF86DRI_SERVER_ -#include <X11/dri/xf86dri.h> -#include <X11/dri/xf86driproto.h> -#include <xcb/xcb.h> -#include <xcb/shape.h> -#include <xcb/xf86dri.h> -#include "misc.h" -#include "privates.h" -#include "dixstruct.h" -#include "extnsionst.h" -#include "colormapst.h" -#include "cursorstr.h" -#include "scrnintstr.h" -#include "windowstr.h" -#include "servermd.h" -#include "swaprep.h" -#include "ephyrdri.h" -#include "ephyrdriext.h" -#include "hostx.h" -#define _HAVE_XALLOC_DECLS -#include "ephyrlog.h" -#include "protocol-versions.h" - -typedef struct { - int foo; -} EphyrDRIWindowPrivRec; -typedef EphyrDRIWindowPrivRec *EphyrDRIWindowPrivPtr; - -typedef struct { - CreateWindowProcPtr CreateWindow; - DestroyWindowProcPtr DestroyWindow; - MoveWindowProcPtr MoveWindow; - PositionWindowProcPtr PositionWindow; - ClipNotifyProcPtr ClipNotify; -} EphyrDRIScreenPrivRec; -typedef EphyrDRIScreenPrivRec *EphyrDRIScreenPrivPtr; - -static int DRIErrorBase; - -static Bool ephyrDRIScreenInit(ScreenPtr a_screen); -static Bool ephyrDRICreateWindow(WindowPtr a_win); -static Bool ephyrDRIDestroyWindow(WindowPtr a_win); -static void ephyrDRIMoveWindow(WindowPtr a_win, - int a_x, int a_y, - WindowPtr a_siblings, VTKind a_kind); -static Bool ephyrDRIPositionWindow(WindowPtr a_win, int x, int y); -static void ephyrDRIClipNotify(WindowPtr a_win, int a_x, int a_y); - -static Bool EphyrMirrorHostVisuals(ScreenPtr a_screen); -static Bool destroyHostPeerWindow(const WindowPtr a_win); -static Bool findWindowPairFromLocal(WindowPtr a_local, - EphyrWindowPair ** a_pair); - -static unsigned char DRIReqCode = 0; - -static DevPrivateKeyRec ephyrDRIWindowKeyRec; - -#define ephyrDRIWindowKey (&ephyrDRIWindowKeyRec) -static DevPrivateKeyRec ephyrDRIScreenKeyRec; - -#define ephyrDRIScreenKey (&ephyrDRIScreenKeyRec) - -#define GET_EPHYR_DRI_WINDOW_PRIV(win) ((EphyrDRIWindowPrivPtr) \ - dixLookupPrivate(&(win)->devPrivates, ephyrDRIWindowKey)) -#define GET_EPHYR_DRI_SCREEN_PRIV(screen) ((EphyrDRIScreenPrivPtr) \ - dixLookupPrivate(&(screen)->devPrivates, ephyrDRIScreenKey)) - -static Bool -ephyrDRIScreenInit(ScreenPtr a_screen) -{ - Bool is_ok = FALSE; - EphyrDRIScreenPrivPtr screen_priv = NULL; - - EPHYR_RETURN_VAL_IF_FAIL(a_screen, FALSE); - - screen_priv = GET_EPHYR_DRI_SCREEN_PRIV(a_screen); - EPHYR_RETURN_VAL_IF_FAIL(screen_priv, FALSE); - - screen_priv->CreateWindow = a_screen->CreateWindow; - screen_priv->DestroyWindow = a_screen->DestroyWindow; - screen_priv->MoveWindow = a_screen->MoveWindow; - screen_priv->PositionWindow = a_screen->PositionWindow; - screen_priv->ClipNotify = a_screen->ClipNotify; - - a_screen->CreateWindow = ephyrDRICreateWindow; - a_screen->DestroyWindow = ephyrDRIDestroyWindow; - a_screen->MoveWindow = ephyrDRIMoveWindow; - a_screen->PositionWindow = ephyrDRIPositionWindow; - a_screen->ClipNotify = ephyrDRIClipNotify; - - is_ok = TRUE; - - return is_ok; -} - -static Bool -ephyrDRICreateWindow(WindowPtr a_win) -{ - Bool is_ok = FALSE; - ScreenPtr screen = NULL; - EphyrDRIScreenPrivPtr screen_priv = NULL; - - EPHYR_RETURN_VAL_IF_FAIL(a_win, FALSE); - screen = a_win->drawable.pScreen; - EPHYR_RETURN_VAL_IF_FAIL(screen, FALSE); - screen_priv = GET_EPHYR_DRI_SCREEN_PRIV(screen); - EPHYR_RETURN_VAL_IF_FAIL(screen_priv && screen_priv->CreateWindow, FALSE); - - EPHYR_LOG("enter. win:%p\n", a_win); - - screen->CreateWindow = screen_priv->CreateWindow; - is_ok = (*screen->CreateWindow) (a_win); - screen->CreateWindow = ephyrDRICreateWindow; - - if (is_ok) { - dixSetPrivate(&a_win->devPrivates, ephyrDRIWindowKey, NULL); - } - return is_ok; -} - -static Bool -ephyrDRIDestroyWindow(WindowPtr a_win) -{ - Bool is_ok = FALSE; - ScreenPtr screen = NULL; - EphyrDRIScreenPrivPtr screen_priv = NULL; - - EPHYR_RETURN_VAL_IF_FAIL(a_win, FALSE); - screen = a_win->drawable.pScreen; - EPHYR_RETURN_VAL_IF_FAIL(screen, FALSE); - screen_priv = GET_EPHYR_DRI_SCREEN_PRIV(screen); - EPHYR_RETURN_VAL_IF_FAIL(screen_priv && screen_priv->DestroyWindow, FALSE); - - screen->DestroyWindow = screen_priv->DestroyWindow; - if (screen->DestroyWindow) { - is_ok = (*screen->DestroyWindow) (a_win); - } - screen->DestroyWindow = ephyrDRIDestroyWindow; - - if (is_ok) { - EphyrDRIWindowPrivPtr win_priv = GET_EPHYR_DRI_WINDOW_PRIV(a_win); - - if (win_priv) { - destroyHostPeerWindow(a_win); - free(win_priv); - dixSetPrivate(&a_win->devPrivates, ephyrDRIWindowKey, NULL); - EPHYR_LOG("destroyed the remote peer window\n"); - } - } - return is_ok; -} - -static void -ephyrDRIMoveWindow(WindowPtr a_win, - int a_x, int a_y, WindowPtr a_siblings, VTKind a_kind) -{ - ScreenPtr screen = NULL; - EphyrDRIScreenPrivPtr screen_priv = NULL; - EphyrDRIWindowPrivPtr win_priv = NULL; - EphyrWindowPair *pair = NULL; - EphyrBox geo; - int x = 0, y = 0; /*coords relative to parent window */ - - EPHYR_RETURN_IF_FAIL(a_win); - - EPHYR_LOG("enter\n"); - screen = a_win->drawable.pScreen; - EPHYR_RETURN_IF_FAIL(screen); - screen_priv = GET_EPHYR_DRI_SCREEN_PRIV(screen); - EPHYR_RETURN_IF_FAIL(screen_priv && screen_priv->MoveWindow); - - screen->MoveWindow = screen_priv->MoveWindow; - if (screen->MoveWindow) { - (*screen->MoveWindow) (a_win, a_x, a_y, a_siblings, a_kind); - } - screen->MoveWindow = ephyrDRIMoveWindow; - - EPHYR_LOG("window: %p\n", a_win); - if (!a_win->parent) { - EPHYR_LOG("cannot move root window\n"); - return; - } - win_priv = GET_EPHYR_DRI_WINDOW_PRIV(a_win); - if (!win_priv) { - EPHYR_LOG("not a DRI peered window\n"); - return; - } - if (!findWindowPairFromLocal(a_win, &pair) || !pair) { - EPHYR_LOG_ERROR("failed to get window pair\n"); - return; - } - /*compute position relative to parent window */ - x = a_win->drawable.x - a_win->parent->drawable.x; - y = a_win->drawable.y - a_win->parent->drawable.y; - /*set the geometry to pass to hostx_set_window_geometry */ - memset(&geo, 0, sizeof(geo)); - geo.x = x; - geo.y = y; - geo.width = a_win->drawable.width; - geo.height = a_win->drawable.height; - hostx_set_window_geometry(pair->remote, &geo); -} - -static Bool -ephyrDRIPositionWindow(WindowPtr a_win, int a_x, int a_y) -{ - Bool is_ok = FALSE; - ScreenPtr screen = NULL; - EphyrDRIScreenPrivPtr screen_priv = NULL; - EphyrDRIWindowPrivPtr win_priv = NULL; - EphyrWindowPair *pair = NULL; - EphyrBox geo; - - EPHYR_RETURN_VAL_IF_FAIL(a_win, FALSE); - - EPHYR_LOG("enter\n"); - screen = a_win->drawable.pScreen; - EPHYR_RETURN_VAL_IF_FAIL(screen, FALSE); - screen_priv = GET_EPHYR_DRI_SCREEN_PRIV(screen); - EPHYR_RETURN_VAL_IF_FAIL(screen_priv && screen_priv->PositionWindow, FALSE); - - screen->PositionWindow = screen_priv->PositionWindow; - if (screen->PositionWindow) { - (*screen->PositionWindow) (a_win, a_x, a_y); - } - screen->PositionWindow = ephyrDRIPositionWindow; - - EPHYR_LOG("window: %p\n", a_win); - win_priv = GET_EPHYR_DRI_WINDOW_PRIV(a_win); - if (!win_priv) { - EPHYR_LOG("not a DRI peered window\n"); - is_ok = TRUE; - goto out; - } - if (!findWindowPairFromLocal(a_win, &pair) || !pair) { - EPHYR_LOG_ERROR("failed to get window pair\n"); - goto out; - } - /*set the geometry to pass to hostx_set_window_geometry */ - memset(&geo, 0, sizeof(geo)); - geo.x = a_x; - geo.y = a_y; - geo.width = a_win->drawable.width; - geo.height = a_win->drawable.height; - hostx_set_window_geometry(pair->remote, &geo); - is_ok = TRUE; - - out: - EPHYR_LOG("leave. is_ok:%d\n", is_ok); - /*do cleanup here */ - return is_ok; -} - -static void -ephyrDRIClipNotify(WindowPtr a_win, int a_x, int a_y) -{ - ScreenPtr screen = NULL; - EphyrDRIScreenPrivPtr screen_priv = NULL; - EphyrDRIWindowPrivPtr win_priv = NULL; - EphyrWindowPair *pair = NULL; - EphyrRect *rects = NULL; - int i = 0; - - EPHYR_RETURN_IF_FAIL(a_win); - - EPHYR_LOG("enter\n"); - screen = a_win->drawable.pScreen; - EPHYR_RETURN_IF_FAIL(screen); - screen_priv = GET_EPHYR_DRI_SCREEN_PRIV(screen); - EPHYR_RETURN_IF_FAIL(screen_priv && screen_priv->ClipNotify); - - screen->ClipNotify = screen_priv->ClipNotify; - if (screen->ClipNotify) { - (*screen->ClipNotify) (a_win, a_x, a_y); - } - screen->ClipNotify = ephyrDRIClipNotify; - - EPHYR_LOG("window: %p\n", a_win); - win_priv = GET_EPHYR_DRI_WINDOW_PRIV(a_win); - if (!win_priv) { - EPHYR_LOG("not a DRI peered window\n"); - goto out; - } - if (!findWindowPairFromLocal(a_win, &pair) || !pair) { - EPHYR_LOG_ERROR("failed to get window pair\n"); - goto out; - } - rects = calloc(RegionNumRects(&a_win->clipList), sizeof(EphyrRect)); - for (i = 0; i < RegionNumRects(&a_win->clipList); i++) { - memmove(&rects[i], - &RegionRects(&a_win->clipList)[i], sizeof(EphyrRect)); - rects[i].x1 -= a_win->drawable.x; - rects[i].x2 -= a_win->drawable.x; - rects[i].y1 -= a_win->drawable.y; - rects[i].y2 -= a_win->drawable.y; - } - /* - * push the clipping region of this window - * to the peer window in the host - */ - hostx_set_window_bounding_rectangles - (pair->remote, rects, RegionNumRects(&a_win->clipList)); - - out: - free(rects); - rects = NULL; - - EPHYR_LOG("leave.\n"); - /*do cleanup here */ -} - -/** - * Duplicates a visual of a_screen - * In screen a_screen, for depth a_depth, find a visual which - * bitsPerRGBValue and colormap size equal - * a_bits_per_rgb_values and a_colormap_entries. - * The ID of that duplicated visual is set to a_new_id. - * That duplicated visual is then added to the list of visuals - * of the screen. - */ -static Bool -EphyrDuplicateVisual(unsigned int a_screen, - short a_depth, - short a_class, - short a_bits_per_rgb_values, - short a_colormap_entries, - unsigned int a_red_mask, - unsigned int a_green_mask, - unsigned int a_blue_mask, unsigned int a_new_id) -{ - Bool is_ok = FALSE, found_visual = FALSE, found_depth = FALSE; - ScreenPtr screen = NULL; - VisualRec new_visual, *new_visuals = NULL; - int i = 0; - - EPHYR_LOG("enter\n"); - if (a_screen >= screenInfo.numScreens) { - EPHYR_LOG_ERROR("bad screen number\n"); - goto out; - } - memset(&new_visual, 0, sizeof(VisualRec)); - - /*get the screen pointed to by a_screen */ - screen = screenInfo.screens[a_screen]; - EPHYR_RETURN_VAL_IF_FAIL(screen, FALSE); - - /* - * In that screen, first look for an existing visual that has the - * same characteristics as those passed in parameter - * to this function and copy it. - */ - for (i = 0; i < screen->numVisuals; i++) { - if (screen->visuals[i].bitsPerRGBValue == a_bits_per_rgb_values && - screen->visuals[i].ColormapEntries == a_colormap_entries) { - /*copy the visual found */ - memcpy(&new_visual, &screen->visuals[i], sizeof(new_visual)); - new_visual.vid = a_new_id; - new_visual.class = a_class; - new_visual.redMask = a_red_mask; - new_visual.greenMask = a_green_mask; - new_visual.blueMask = a_blue_mask; - found_visual = TRUE; - EPHYR_LOG("found a visual that matches visual id: %d\n", a_new_id); - break; - } - } - if (!found_visual) { - EPHYR_LOG("did not find any visual matching %d\n", a_new_id); - goto out; - } - /* - * be prepare to extend screen->visuals to add new_visual to it - */ - new_visuals = calloc(screen->numVisuals + 1, sizeof(VisualRec)); - memmove(new_visuals, - screen->visuals, screen->numVisuals * sizeof(VisualRec)); - memmove(&new_visuals[screen->numVisuals], &new_visual, sizeof(VisualRec)); - /* - * Now, in that same screen, update the screen->allowedDepths member. - * In that array, each element represents the visuals applicable to - * a given depth. So we need to add an entry matching the new visual - * that we are going to add to screen->visuals - */ - for (i = 0; i < screen->numDepths; i++) { - VisualID *vids = NULL; - DepthPtr cur_depth = NULL; - - /*find the entry matching a_depth */ - if (screen->allowedDepths[i].depth != a_depth) - continue; - cur_depth = &screen->allowedDepths[i]; - /* - * extend the list of visual IDs in that entry, - * so to add a_new_id in there. - */ - vids = reallocarray(cur_depth->vids, - cur_depth->numVids + 1, sizeof(VisualID)); - if (!vids) { - EPHYR_LOG_ERROR("failed to realloc numids\n"); - goto out; - } - vids[cur_depth->numVids] = a_new_id; - /* - * Okay now commit our change. - * Do really update screen->allowedDepths[i] - */ - cur_depth->numVids++; - cur_depth->vids = vids; - found_depth = TRUE; - } - if (!found_depth) { - EPHYR_LOG_ERROR("failed to update screen[%d]->allowedDepth\n", - a_screen); - goto out; - } - /* - * Commit our change to screen->visuals - */ - free(screen->visuals); - screen->visuals = new_visuals; - screen->numVisuals++; - new_visuals = NULL; - - is_ok = TRUE; - out: - free(new_visuals); - new_visuals = NULL; - - EPHYR_LOG("leave\n"); - return is_ok; -} - -/** - * Duplicates the visuals of the host X server. - * This is necessary to have visuals that have the same - * ID as those of the host X. It is important to have that for - * GLX. - */ -static Bool -EphyrMirrorHostVisuals(ScreenPtr a_screen) -{ - Bool is_ok = FALSE; - EphyrHostVisualInfo *visuals = NULL; - int nb_visuals = 0, i = 0; - - EPHYR_LOG("enter\n"); - if (!hostx_get_visuals_info(&visuals, &nb_visuals)) { - EPHYR_LOG_ERROR("failed to get host visuals\n"); - goto out; - } - for (i = 0; i < nb_visuals; i++) { - if (!EphyrDuplicateVisual(a_screen->myNum, - visuals[i].depth, - visuals[i].class, - visuals[i].bits_per_rgb, - visuals[i].colormap_size, - visuals[i].red_mask, - visuals[i].green_mask, - visuals[i].blue_mask, visuals[i].visualid)) { - EPHYR_LOG_ERROR("failed to duplicate host visual %d\n", - (int) visuals[i].visualid); - } - } - - is_ok = TRUE; - out: - EPHYR_LOG("leave\n"); - return is_ok; -} - -static int -ProcXF86DRIQueryVersion(register ClientPtr client) -{ - xXF86DRIQueryVersionReply rep = { - .type = X_Reply, - .sequenceNumber = client->sequence, - .length = 0, - .majorVersion = SERVER_XF86DRI_MAJOR_VERSION, - .minorVersion = SERVER_XF86DRI_MINOR_VERSION, - .patchVersion = SERVER_XF86DRI_PATCH_VERSION - }; - - REQUEST_SIZE_MATCH(xXF86DRIQueryVersionReq); - - EPHYR_LOG("enter\n"); - - if (client->swapped) { - swaps(&rep.sequenceNumber); - swapl(&rep.length); - swaps(&rep.majorVersion); - swaps(&rep.minorVersion); - swapl(&rep.patchVersion); - } - WriteToClient(client, sizeof(xXF86DRIQueryVersionReply), &rep); - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRIQueryDirectRenderingCapable(register ClientPtr client) -{ - xXF86DRIQueryDirectRenderingCapableReply rep; - Bool isCapable; - - REQUEST(xXF86DRIQueryDirectRenderingCapableReq); - REQUEST_SIZE_MATCH(xXF86DRIQueryDirectRenderingCapableReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - if (!ephyrDRIQueryDirectRenderingCapable(stuff->screen, &isCapable)) { - return BadValue; - } - - if (!client->local || client->swapped) - isCapable = 0; - - rep = (xXF86DRIQueryDirectRenderingCapableReply) { - .type = X_Reply, - .sequenceNumber = client->sequence, - .length = 0, - .isCapable = isCapable - }; - - if (client->swapped) { - swaps(&rep.sequenceNumber); - swapl(&rep.length); - } - - WriteToClient(client, sizeof(xXF86DRIQueryDirectRenderingCapableReply), - &rep); - EPHYR_LOG("leave\n"); - - return Success; -} - -static int -ProcXF86DRIOpenConnection(register ClientPtr client) -{ - xXF86DRIOpenConnectionReply rep; - drm_handle_t hSAREA; - char *busIdString = NULL; - CARD32 busIdStringLength = 0; - - REQUEST(xXF86DRIOpenConnectionReq); - REQUEST_SIZE_MATCH(xXF86DRIOpenConnectionReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - if (!ephyrDRIOpenConnection(stuff->screen, &hSAREA, &busIdString)) { - return BadValue; - } - - if (busIdString) - busIdStringLength = strlen(busIdString); - - rep = (xXF86DRIOpenConnectionReply) { - .type = X_Reply, - .sequenceNumber = client->sequence, - .length = bytes_to_int32(SIZEOF(xXF86DRIOpenConnectionReply) - - SIZEOF(xGenericReply) + - pad_to_int32(busIdStringLength)), - .hSAREALow = (CARD32) (hSAREA & 0xffffffff), -#if defined(LONG64) && !defined(__linux__) - .hSAREAHigh = (CARD32) (hSAREA >> 32), -#else - .hSAREAHigh = 0, -#endif - .busIdStringLength = busIdStringLength - }; - - WriteToClient(client, sizeof(xXF86DRIOpenConnectionReply), &rep); - if (busIdStringLength) - WriteToClient(client, busIdStringLength, busIdString); - free(busIdString); - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRIAuthConnection(register ClientPtr client) -{ - xXF86DRIAuthConnectionReply rep; - - REQUEST(xXF86DRIAuthConnectionReq); - REQUEST_SIZE_MATCH(xXF86DRIAuthConnectionReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - rep = (xXF86DRIAuthConnectionReply) { - .type = X_Reply, - .sequenceNumber = client->sequence, - .length = 0, - .authenticated = 1 - }; - - if (!ephyrDRIAuthConnection(stuff->screen, stuff->magic)) { - ErrorF("Failed to authenticate %lu\n", (unsigned long) stuff->magic); - rep.authenticated = 0; - } - WriteToClient(client, sizeof(xXF86DRIAuthConnectionReply), &rep); - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRICloseConnection(register ClientPtr client) -{ - REQUEST(xXF86DRICloseConnectionReq); - REQUEST_SIZE_MATCH(xXF86DRICloseConnectionReq); - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - /* - DRICloseConnection( screenInfo.screens[stuff->screen]); - */ - - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRIGetClientDriverName(register ClientPtr client) -{ - xXF86DRIGetClientDriverNameReply rep = { - .type = X_Reply, - .sequenceNumber = client->sequence, - .clientDriverNameLength = 0 - }; - char *clientDriverName; - - REQUEST(xXF86DRIGetClientDriverNameReq); - REQUEST_SIZE_MATCH(xXF86DRIGetClientDriverNameReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - ephyrDRIGetClientDriverName(stuff->screen, - (int *) &rep.ddxDriverMajorVersion, - (int *) &rep.ddxDriverMinorVersion, - (int *) &rep.ddxDriverPatchVersion, - &clientDriverName); - if (clientDriverName) - rep.clientDriverNameLength = strlen(clientDriverName); - rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetClientDriverNameReply) - - SIZEOF(xGenericReply) + - pad_to_int32(rep.clientDriverNameLength)); - - WriteToClient(client, sizeof(xXF86DRIGetClientDriverNameReply), &rep); - if (rep.clientDriverNameLength) - WriteToClient(client, rep.clientDriverNameLength, clientDriverName); - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRICreateContext(register ClientPtr client) -{ - xXF86DRICreateContextReply rep = { - .type = X_Reply, - .sequenceNumber = client->sequence, - .length = 0 - }; - ScreenPtr pScreen; - VisualPtr visual; - int i = 0; - - REQUEST(xXF86DRICreateContextReq); - REQUEST_SIZE_MATCH(xXF86DRICreateContextReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - pScreen = screenInfo.screens[stuff->screen]; - visual = pScreen->visuals; - - /* Find the requested X visual */ - for (i = 0; i < pScreen->numVisuals; i++, visual++) - if (visual->vid == stuff->visual) - break; - if (i == pScreen->numVisuals) { - /* No visual found */ - return BadValue; - } - - if (!ephyrDRICreateContext(stuff->screen, - stuff->visual, - stuff->context, - (drm_context_t *) &rep.hHWContext)) { - return BadValue; - } - - WriteToClient(client, sizeof(xXF86DRICreateContextReply), &rep); - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRIDestroyContext(register ClientPtr client) -{ - REQUEST(xXF86DRIDestroyContextReq); - REQUEST_SIZE_MATCH(xXF86DRIDestroyContextReq); - EPHYR_LOG("enter\n"); - - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - if (!ephyrDRIDestroyContext(stuff->screen, stuff->context)) { - return BadValue; - } - - EPHYR_LOG("leave\n"); - return Success; -} - -static Bool -getWindowVisual(const WindowPtr a_win, VisualPtr * a_visual) -{ - int i = 0, visual_id = 0; - - EPHYR_RETURN_VAL_IF_FAIL(a_win - && a_win->drawable.pScreen - && a_win->drawable.pScreen->visuals, FALSE); - - visual_id = wVisual(a_win); - for (i = 0; i < a_win->drawable.pScreen->numVisuals; i++) { - if (a_win->drawable.pScreen->visuals[i].vid == visual_id) { - *a_visual = &a_win->drawable.pScreen->visuals[i]; - return TRUE; - } - } - return FALSE; -} - -#define NUM_WINDOW_PAIRS 256 -static EphyrWindowPair window_pairs[NUM_WINDOW_PAIRS]; - -static Bool -appendWindowPairToList(WindowPtr a_local, int a_remote) -{ - int i = 0; - - EPHYR_RETURN_VAL_IF_FAIL(a_local, FALSE); - - EPHYR_LOG("(local,remote):(%p, %d)\n", a_local, a_remote); - - for (i = 0; i < NUM_WINDOW_PAIRS; i++) { - if (window_pairs[i].local == NULL) { - window_pairs[i].local = a_local; - window_pairs[i].remote = a_remote; - return TRUE; - } - } - return FALSE; -} - -static Bool -findWindowPairFromLocal(WindowPtr a_local, EphyrWindowPair ** a_pair) -{ - int i = 0; - - EPHYR_RETURN_VAL_IF_FAIL(a_pair && a_local, FALSE); - - for (i = 0; i < NUM_WINDOW_PAIRS; i++) { - if (window_pairs[i].local == a_local) { - *a_pair = &window_pairs[i]; - EPHYR_LOG("found (%p, %d)\n", (*a_pair)->local, (*a_pair)->remote); - return TRUE; - } - } - return FALSE; -} - -Bool -findWindowPairFromRemote(int a_remote, EphyrWindowPair ** a_pair) -{ - int i = 0; - - EPHYR_RETURN_VAL_IF_FAIL(a_pair, FALSE); - - for (i = 0; i < NUM_WINDOW_PAIRS; i++) { - if (window_pairs[i].remote == a_remote) { - *a_pair = &window_pairs[i]; - EPHYR_LOG("found (%p, %d)\n", (*a_pair)->local, (*a_pair)->remote); - return TRUE; - } - } - return FALSE; -} - -static Bool -createHostPeerWindow(const WindowPtr a_win, int *a_peer_win) -{ - Bool is_ok = FALSE; - VisualPtr visual = NULL; - EphyrBox geo; - - EPHYR_RETURN_VAL_IF_FAIL(a_win && a_peer_win, FALSE); - EPHYR_RETURN_VAL_IF_FAIL(a_win->drawable.pScreen, FALSE); - - EPHYR_LOG("enter. a_win '%p'\n", a_win); - if (!getWindowVisual(a_win, &visual)) { - EPHYR_LOG_ERROR("failed to get window visual\n"); - goto out; - } - if (!visual) { - EPHYR_LOG_ERROR("failed to create visual\n"); - goto out; - } - memset(&geo, 0, sizeof(geo)); - geo.x = a_win->drawable.x; - geo.y = a_win->drawable.y; - geo.width = a_win->drawable.width; - geo.height = a_win->drawable.height; - if (!hostx_create_window(a_win->drawable.pScreen->myNum, - &geo, visual->vid, a_peer_win)) { - EPHYR_LOG_ERROR("failed to create host peer window\n"); - goto out; - } - if (!appendWindowPairToList(a_win, *a_peer_win)) { - EPHYR_LOG_ERROR("failed to append window to pair list\n"); - goto out; - } - is_ok = TRUE; - out: - EPHYR_LOG("leave:remote win%d\n", *a_peer_win); - return is_ok; -} - -static Bool -destroyHostPeerWindow(const WindowPtr a_win) -{ - Bool is_ok = FALSE; - EphyrWindowPair *pair = NULL; - - EPHYR_RETURN_VAL_IF_FAIL(a_win, FALSE); - - EPHYR_LOG("enter\n"); - - if (!findWindowPairFromLocal(a_win, &pair) || !pair) { - EPHYR_LOG_ERROR("failed to find peer to local window\n"); - goto out; - } - hostx_destroy_window(pair->remote); - is_ok = TRUE; - - out: - EPHYR_LOG("leave\n"); - return is_ok; -} - -static int -ProcXF86DRICreateDrawable(ClientPtr client) -{ - xXF86DRICreateDrawableReply rep = { - .type = X_Reply, - .sequenceNumber = client->sequence, - .length = 0 - }; - DrawablePtr drawable = NULL; - WindowPtr window = NULL; - EphyrWindowPair *pair = NULL; - EphyrDRIWindowPrivPtr win_priv = NULL; - int rc = 0, remote_win = 0; - - REQUEST(xXF86DRICreateDrawableReq); - REQUEST_SIZE_MATCH(xXF86DRICreateDrawableReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - rc = dixLookupDrawable(&drawable, stuff->drawable, client, 0, - DixReadAccess); - if (rc != Success) - return rc; - if (drawable->type != DRAWABLE_WINDOW) { - EPHYR_LOG_ERROR("non drawable windows are not yet supported\n"); - return BadImplementation; - } - EPHYR_LOG("lookedup drawable %p\n", drawable); - window = (WindowPtr) drawable; - if (findWindowPairFromLocal(window, &pair) && pair) { - remote_win = pair->remote; - EPHYR_LOG("found window '%p' paire with remote '%d'\n", - window, remote_win); - } - else if (!createHostPeerWindow(window, &remote_win)) { - EPHYR_LOG_ERROR("failed to create host peer window\n"); - return BadAlloc; - } - - if (!ephyrDRICreateDrawable(stuff->screen, - remote_win, - (drm_drawable_t *) &rep.hHWDrawable)) { - EPHYR_LOG_ERROR("failed to create dri drawable\n"); - return BadValue; - } - - win_priv = GET_EPHYR_DRI_WINDOW_PRIV(window); - if (!win_priv) { - win_priv = calloc(1, sizeof(EphyrDRIWindowPrivRec)); - if (!win_priv) { - EPHYR_LOG_ERROR("failed to allocate window private\n"); - return BadAlloc; - } - dixSetPrivate(&window->devPrivates, ephyrDRIWindowKey, win_priv); - EPHYR_LOG("paired window '%p' with remote '%d'\n", window, remote_win); - } - - WriteToClient(client, sizeof(xXF86DRICreateDrawableReply), &rep); - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRIDestroyDrawable(register ClientPtr client) -{ - DrawablePtr drawable = NULL; - WindowPtr window = NULL; - EphyrWindowPair *pair = NULL; - int rc = 0; - - REQUEST(xXF86DRIDestroyDrawableReq); - REQUEST_SIZE_MATCH(xXF86DRIDestroyDrawableReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - rc = dixLookupDrawable(&drawable, - stuff->drawable, client, 0, DixReadAccess); - if (rc != Success) - return rc; - if (drawable->type != DRAWABLE_WINDOW) { - EPHYR_LOG_ERROR("non drawable windows are not yet supported\n"); - return BadImplementation; - } - window = (WindowPtr) drawable; - if (!findWindowPairFromLocal(window, &pair) && pair) { - EPHYR_LOG_ERROR("failed to find pair window\n"); - return BadImplementation; - } - if (!ephyrDRIDestroyDrawable(stuff->screen, - pair->remote /*drawable in host x */ )) { - EPHYR_LOG_ERROR("failed to destroy dri drawable\n"); - return BadImplementation; - } - pair->local = NULL; - pair->remote = 0; - - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRIGetDrawableInfo(register ClientPtr client) -{ - xXF86DRIGetDrawableInfoReply rep = { - .type = X_Reply, - .sequenceNumber = client->sequence, - .length = 0 - }; - DrawablePtr drawable; - WindowPtr window = NULL; - EphyrWindowPair *pair = NULL; - int X = 0, Y = 0, W = 0, H = 0, backX = 0, backY = 0, rc = 0, i = 0; - drm_clip_rect_t *clipRects = NULL; - drm_clip_rect_t *backClipRects = NULL; - - REQUEST(xXF86DRIGetDrawableInfoReq); - REQUEST_SIZE_MATCH(xXF86DRIGetDrawableInfoReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - rc = dixLookupDrawable(&drawable, stuff->drawable, client, 0, - DixReadAccess); - if (rc != Success || !drawable) { - EPHYR_LOG_ERROR("could not get drawable\n"); - return rc; - } - - if (drawable->type != DRAWABLE_WINDOW) { - EPHYR_LOG_ERROR("non windows type drawables are not yes supported\n"); - return BadImplementation; - } - window = (WindowPtr) drawable; - memset(&pair, 0, sizeof(pair)); - if (!findWindowPairFromLocal(window, &pair) || !pair) { - EPHYR_LOG_ERROR("failed to find remote peer drawable\n"); - return BadMatch; - } - EPHYR_LOG("clip list of xephyr gl drawable:\n"); - for (i = 0; i < RegionNumRects(&window->clipList); i++) { - EPHYR_LOG("x1:%d, y1:%d, x2:%d, y2:%d\n", - RegionRects(&window->clipList)[i].x1, - RegionRects(&window->clipList)[i].y1, - RegionRects(&window->clipList)[i].x2, - RegionRects(&window->clipList)[i].y2); - } - - if (!ephyrDRIGetDrawableInfo(stuff->screen, - pair->remote /*the drawable in hostx */ , - (unsigned int *) &rep.drawableTableIndex, - (unsigned int *) &rep.drawableTableStamp, - (int *) &X, - (int *) &Y, - (int *) &W, - (int *) &H, - (int *) &rep.numClipRects, - &clipRects, - &backX, - &backY, - (int *) &rep.numBackClipRects, - &backClipRects)) { - return BadValue; - } - EPHYR_LOG("num clip rects:%d, num back clip rects:%d\n", - (int) rep.numClipRects, (int) rep.numBackClipRects); - - rep.drawableX = X; - rep.drawableY = Y; - rep.drawableWidth = W; - rep.drawableHeight = H; - rep.length = (SIZEOF(xXF86DRIGetDrawableInfoReply) - SIZEOF(xGenericReply)); - - rep.backX = backX; - rep.backY = backY; - - if (rep.numClipRects) { - if (clipRects) { - ScreenPtr pScreen = screenInfo.screens[stuff->screen]; - - EPHYR_LOG("clip list of host gl drawable:\n"); - for (i = 0; i < rep.numClipRects; i++) { - clipRects[i].x1 = max(clipRects[i].x1, 0); - clipRects[i].y1 = max(clipRects[i].y1, 0); - clipRects[i].x2 = min(clipRects[i].x2, - pScreen->width + clipRects[i].x1); - clipRects[i].y2 = min(clipRects[i].y2, - pScreen->width + clipRects[i].y1); - - EPHYR_LOG("x1:%d, y1:%d, x2:%d, y2:%d\n", - clipRects[i].x1, clipRects[i].y1, - clipRects[i].x2, clipRects[i].y2); - } - } - else { - rep.numClipRects = 0; - } - } - else { - EPHYR_LOG("got zero host gl drawable clipping rects\n"); - } - rep.length += sizeof(drm_clip_rect_t) * rep.numClipRects; - backClipRects = clipRects; - rep.numBackClipRects = rep.numClipRects; - if (rep.numBackClipRects) - rep.length += sizeof(drm_clip_rect_t) * rep.numBackClipRects; - EPHYR_LOG("num host clip rects:%d\n", (int) rep.numClipRects); - EPHYR_LOG("num host back clip rects:%d\n", (int) rep.numBackClipRects); - - rep.length = bytes_to_int32(rep.length); - - WriteToClient(client, sizeof(xXF86DRIGetDrawableInfoReply), &rep); - - if (rep.numClipRects) { - WriteToClient(client, - sizeof(drm_clip_rect_t) * rep.numClipRects, - clipRects); - } - - if (rep.numBackClipRects) { - WriteToClient(client, - sizeof(drm_clip_rect_t) * rep.numBackClipRects, - backClipRects); - } - free(clipRects); - clipRects = NULL; - - EPHYR_LOG("leave\n"); - - return Success; -} - -static int -ProcXF86DRIGetDeviceInfo(register ClientPtr client) -{ - xXF86DRIGetDeviceInfoReply rep = { - .type = X_Reply, - .sequenceNumber = client->sequence, - .length = 0 - }; - drm_handle_t hFrameBuffer; - void *pDevPrivate; - - REQUEST(xXF86DRIGetDeviceInfoReq); - REQUEST_SIZE_MATCH(xXF86DRIGetDeviceInfoReq); - - EPHYR_LOG("enter\n"); - if (stuff->screen >= screenInfo.numScreens) { - client->errorValue = stuff->screen; - return BadValue; - } - - if (!ephyrDRIGetDeviceInfo(stuff->screen, - &hFrameBuffer, - (int *) &rep.framebufferOrigin, - (int *) &rep.framebufferSize, - (int *) &rep.framebufferStride, - (int *) &rep.devPrivateSize, &pDevPrivate)) { - return BadValue; - } - - rep.hFrameBufferLow = (CARD32) (hFrameBuffer & 0xffffffff); -#if defined(LONG64) && !defined(__linux__) - rep.hFrameBufferHigh = (CARD32) (hFrameBuffer >> 32); -#else - rep.hFrameBufferHigh = 0; -#endif - - if (rep.devPrivateSize) { - rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetDeviceInfoReply) - - SIZEOF(xGenericReply) + - pad_to_int32(rep.devPrivateSize)); - } - - WriteToClient(client, sizeof(xXF86DRIGetDeviceInfoReply), &rep); - if (rep.length) { - WriteToClient(client, rep.devPrivateSize, pDevPrivate); - } - EPHYR_LOG("leave\n"); - return Success; -} - -static int -ProcXF86DRIDispatch(register ClientPtr client) -{ - REQUEST(xReq); - EPHYR_LOG("enter\n"); - - switch (stuff->data) { - case X_XF86DRIQueryVersion:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIQueryVersion(client); - } - case X_XF86DRIQueryDirectRenderingCapable:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIQueryDirectRenderingCapable(client); - } - } - - if (!client->local) - return DRIErrorBase + XF86DRIClientNotLocal; - - switch (stuff->data) { - case X_XF86DRIOpenConnection:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIOpenConnection(client); - } - case X_XF86DRICloseConnection:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRICloseConnection(client); - } - case X_XF86DRIGetClientDriverName:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIGetClientDriverName(client); - } - case X_XF86DRICreateContext:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRICreateContext(client); - } - case X_XF86DRIDestroyContext:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIDestroyContext(client); - } - case X_XF86DRICreateDrawable:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRICreateDrawable(client); - } - case X_XF86DRIDestroyDrawable:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIDestroyDrawable(client); - } - case X_XF86DRIGetDrawableInfo:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIGetDrawableInfo(client); - } - case X_XF86DRIGetDeviceInfo:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIGetDeviceInfo(client); - } - case X_XF86DRIAuthConnection:{ - EPHYR_LOG("leave\n"); - return ProcXF86DRIAuthConnection(client); - } - /* {Open,Close}FullScreen are deprecated now */ - default:{ - EPHYR_LOG("leave\n"); - return BadRequest; - } - } -} - -static int -SProcXF86DRIQueryVersion(register ClientPtr client) -{ - REQUEST(xXF86DRIQueryVersionReq); - swaps(&stuff->length); - return ProcXF86DRIQueryVersion(client); -} - -static int -SProcXF86DRIQueryDirectRenderingCapable(register ClientPtr client) -{ - REQUEST(xXF86DRIQueryDirectRenderingCapableReq); - swaps(&stuff->length); - swapl(&stuff->screen); - return ProcXF86DRIQueryDirectRenderingCapable(client); -} - -static int -SProcXF86DRIDispatch(register ClientPtr client) -{ - REQUEST(xReq); - - EPHYR_LOG("enter\n"); - /* - * Only local clients are allowed DRI access, but remote clients still need - * these requests to find out cleanly. - */ - switch (stuff->data) { - case X_XF86DRIQueryVersion:{ - EPHYR_LOG("leave\n"); - return SProcXF86DRIQueryVersion(client); - } - case X_XF86DRIQueryDirectRenderingCapable:{ - EPHYR_LOG("leave\n"); - return SProcXF86DRIQueryDirectRenderingCapable(client); - } - default:{ - EPHYR_LOG("leave\n"); - return DRIErrorBase + XF86DRIClientNotLocal; - } - } -} - -Bool -ephyrDRIExtensionInit(ScreenPtr a_screen) -{ - Bool is_ok = FALSE; - ExtensionEntry *extEntry = NULL; - EphyrDRIScreenPrivPtr screen_priv = NULL; - - EPHYR_LOG("enter\n"); - if (!hostx_has_extension(&xcb_xf86dri_id)) { - EPHYR_LOG("host does not have DRI extension\n"); - goto out; - } - EPHYR_LOG("host X does have DRI extension\n"); - if (!hostx_has_extension(&xcb_shape_id)) { - EPHYR_LOG("host does not have XShape extension\n"); - goto out; - } - EPHYR_LOG("host X does have XShape extension\n"); - -#ifdef XF86DRI_EVENTS - EventType = CreateNewResourceType(XF86DRIFreeEvents, "DRIEvents"); - if (!EventType) { - EPHYR_LOG_ERROR("failed to register DRI event resource type\n"); - goto out; - } -#endif - - if ((extEntry = AddExtension(XF86DRINAME, - XF86DRINumberEvents, - XF86DRINumberErrors, - ProcXF86DRIDispatch, - SProcXF86DRIDispatch, - NULL, StandardMinorOpcode))) { - DRIReqCode = (unsigned char) extEntry->base; - DRIErrorBase = extEntry->errorBase; - } - else { - EPHYR_LOG_ERROR("failed to register DRI extension\n"); - goto out; - } - if (!dixRegisterPrivateKey(&ephyrDRIScreenKeyRec, PRIVATE_SCREEN, 0)) - goto out; - if (!dixRegisterPrivateKey(&ephyrDRIWindowKeyRec, PRIVATE_WINDOW, 0)) - goto out; - screen_priv = calloc(1, sizeof(EphyrDRIScreenPrivRec)); - if (!screen_priv) { - EPHYR_LOG_ERROR("failed to allocate screen_priv\n"); - goto out; - } - dixSetPrivate(&a_screen->devPrivates, ephyrDRIScreenKey, screen_priv); - - if (!ephyrDRIScreenInit(a_screen)) { - EPHYR_LOG_ERROR("ephyrDRIScreenInit() failed\n"); - goto out; - } - EphyrMirrorHostVisuals(a_screen); - is_ok = TRUE; - out: - EPHYR_LOG("leave\n"); - return is_ok; -} |