diff --git a/dga_cleanup.diff b/dga_cleanup.diff new file mode 100644 index 0000000..2cf2e10 --- /dev/null +++ b/dga_cleanup.diff @@ -0,0 +1,935 @@ +commit 322335d5b5b6f155f56fe3c1cbe372f13dc20932 +Author: Luc Verhaegen +Date: Thu Oct 9 22:21:05 2008 +0200 + + DGA: Mash together xf86dga.c and xf86dga2.c. + + This in preparation for an upcoming client state tracking fix. + +diff --git a/hw/xfree86/dixmods/extmod/Makefile.am b/hw/xfree86/dixmods/extmod/Makefile.am +index 317971d..dd4ccd6 100644 +--- a/hw/xfree86/dixmods/extmod/Makefile.am ++++ b/hw/xfree86/dixmods/extmod/Makefile.am +@@ -4,7 +4,7 @@ extsmoduledir = $(moduledir)/extensions + extsmodule_LTLIBRARIES = libextmod.la + + if DGA +-DGA_SRCS = xf86dga.c xf86dga2.c dgaproc.h xf86dgaext.h ++DGA_SRCS = xf86dga2.c dgaproc.h xf86dgaext.h + endif + + if XV +diff --git a/hw/xfree86/dixmods/extmod/xf86dga.c b/hw/xfree86/dixmods/extmod/xf86dga.c +deleted file mode 100644 +index c66bca2..0000000 +--- a/hw/xfree86/dixmods/extmod/xf86dga.c ++++ /dev/null +@@ -1,309 +0,0 @@ +- +-/* +- +-Copyright (c) 1995 Jon Tombs +-Copyright (c) 1995, 1996, 1999 XFree86 Inc +- +-*/ +- +-#ifdef HAVE_XORG_CONFIG_H +-#include +-#endif +- +-#define NEED_REPLIES +-#define NEED_EVENTS +-#include +-#include +-#include "misc.h" +-#include "dixstruct.h" +-#include "extnsionst.h" +-#include "colormapst.h" +-#include "cursorstr.h" +-#include "scrnintstr.h" +-#include "servermd.h" +-#define _XF86DGA_SERVER_ +-#include +-#include +-#include "swaprep.h" +-#include "dgaproc.h" +- +-#include "xf86dgaext.h" +- +- +-static DISPATCH_PROC(ProcXF86DGADirectVideo); +-static DISPATCH_PROC(ProcXF86DGAGetVidPage); +-static DISPATCH_PROC(ProcXF86DGAGetVideoLL); +-static DISPATCH_PROC(ProcXF86DGAGetViewPortSize); +-static DISPATCH_PROC(ProcXF86DGASetVidPage); +-static DISPATCH_PROC(ProcXF86DGASetViewPort); +-static DISPATCH_PROC(ProcXF86DGAInstallColormap); +-static DISPATCH_PROC(ProcXF86DGAQueryDirectVideo); +-static DISPATCH_PROC(ProcXF86DGAViewPortChanged); +- +- +-static int +-ProcXF86DGAGetVideoLL(ClientPtr client) +-{ +- REQUEST(xXF86DGAGetVideoLLReq); +- xXF86DGAGetVideoLLReply rep; +- XDGAModeRec mode; +- int num, offset, flags; +- char *name; +- +- if (stuff->screen > screenInfo.numScreens) +- return BadValue; +- +- REQUEST_SIZE_MATCH(xXF86DGAGetVideoLLReq); +- rep.type = X_Reply; +- rep.length = 0; +- rep.sequenceNumber = client->sequence; +- +- if(!DGAAvailable(stuff->screen)) +- return (DGAErrorBase + XF86DGANoDirectVideoMode); +- +- if(!(num = DGAGetOldDGAMode(stuff->screen))) +- return (DGAErrorBase + XF86DGANoDirectVideoMode); +- +- /* get the parameters for the mode that best matches */ +- DGAGetModeInfo(stuff->screen, &mode, num); +- +- if(!DGAOpenFramebuffer(stuff->screen, &name, +- (unsigned char**)(&rep.offset), +- (int*)(&rep.bank_size), &offset, &flags)) +- return BadAlloc; +- +- rep.offset += mode.offset; +- rep.width = mode.bytesPerScanline / (mode.bitsPerPixel >> 3); +- rep.ram_size = rep.bank_size >> 10; +- +- WriteToClient(client, SIZEOF(xXF86DGAGetVideoLLReply), (char *)&rep); +- return (client->noClientException); +-} +- +-static int +-ProcXF86DGADirectVideo(ClientPtr client) +-{ +- int num; +- PixmapPtr pix; +- XDGAModeRec mode; +- REQUEST(xXF86DGADirectVideoReq); +- +- if (stuff->screen > screenInfo.numScreens) +- return BadValue; +- +- REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq); +- +- if (!DGAAvailable(stuff->screen)) +- return DGAErrorBase + XF86DGANoDirectVideoMode; +- +- if (stuff->enable & XF86DGADirectGraphics) { +- if(!(num = DGAGetOldDGAMode(stuff->screen))) +- return (DGAErrorBase + XF86DGANoDirectVideoMode); +- } else +- num = 0; +- +- if(Success != DGASetMode(stuff->screen, num, &mode, &pix)) +- return (DGAErrorBase + XF86DGAScreenNotActive); +- +- DGASetInputMode (stuff->screen, +- (stuff->enable & XF86DGADirectKeyb) != 0, +- (stuff->enable & XF86DGADirectMouse) != 0); +- +- return (client->noClientException); +-} +- +-static int +-ProcXF86DGAGetViewPortSize(ClientPtr client) +-{ +- int num; +- XDGAModeRec mode; +- REQUEST(xXF86DGAGetViewPortSizeReq); +- xXF86DGAGetViewPortSizeReply rep; +- +- if (stuff->screen > screenInfo.numScreens) +- return BadValue; +- +- REQUEST_SIZE_MATCH(xXF86DGAGetViewPortSizeReq); +- rep.type = X_Reply; +- rep.length = 0; +- rep.sequenceNumber = client->sequence; +- +- if (!DGAAvailable(stuff->screen)) +- return (DGAErrorBase + XF86DGANoDirectVideoMode); +- +- if(!(num = DGAGetOldDGAMode(stuff->screen))) +- return (DGAErrorBase + XF86DGANoDirectVideoMode); +- +- DGAGetModeInfo(stuff->screen, &mode, num); +- +- rep.width = mode.viewportWidth; +- rep.height = mode.viewportHeight; +- +- WriteToClient(client, SIZEOF(xXF86DGAGetViewPortSizeReply), (char *)&rep); +- return (client->noClientException); +-} +- +-static int +-ProcXF86DGASetViewPort(ClientPtr client) +-{ +- REQUEST(xXF86DGASetViewPortReq); +- +- if (stuff->screen > screenInfo.numScreens) +- return BadValue; +- +- REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq); +- +- if (!DGAAvailable(stuff->screen)) +- return (DGAErrorBase + XF86DGANoDirectVideoMode); +- +- if (!DGAActive(stuff->screen)) +- { +- int num; +- PixmapPtr pix; +- XDGAModeRec mode; +- +- if(!(num = DGAGetOldDGAMode(stuff->screen))) +- return (DGAErrorBase + XF86DGANoDirectVideoMode); +- if(Success != DGASetMode(stuff->screen, num, &mode, &pix)) +- return (DGAErrorBase + XF86DGAScreenNotActive); +- } +- +- if (DGASetViewport(stuff->screen, stuff->x, stuff->y, DGA_FLIP_RETRACE) +- != Success) +- return DGAErrorBase + XF86DGADirectNotActivated; +- +- return (client->noClientException); +-} +- +-static int +-ProcXF86DGAGetVidPage(ClientPtr client) +-{ +- REQUEST(xXF86DGAGetVidPageReq); +- xXF86DGAGetVidPageReply rep; +- +- if (stuff->screen > screenInfo.numScreens) +- return BadValue; +- +- REQUEST_SIZE_MATCH(xXF86DGAGetVidPageReq); +- rep.type = X_Reply; +- rep.length = 0; +- rep.sequenceNumber = client->sequence; +- rep.vpage = 0; /* silently fail */ +- +- WriteToClient(client, SIZEOF(xXF86DGAGetVidPageReply), (char *)&rep); +- return (client->noClientException); +-} +- +- +-static int +-ProcXF86DGASetVidPage(ClientPtr client) +-{ +- REQUEST(xXF86DGASetVidPageReq); +- +- if (stuff->screen > screenInfo.numScreens) +- return BadValue; +- +- REQUEST_SIZE_MATCH(xXF86DGASetVidPageReq); +- +- /* silently fail */ +- +- return (client->noClientException); +-} +- +- +-static int +-ProcXF86DGAInstallColormap(ClientPtr client) +-{ +- ColormapPtr pcmp; +- REQUEST(xXF86DGAInstallColormapReq); +- +- REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq); +- +- if (!DGAActive(stuff->screen)) +- return (DGAErrorBase + XF86DGADirectNotActivated); +- +- pcmp = (ColormapPtr )LookupIDByType(stuff->id, RT_COLORMAP); +- if (pcmp) { +- DGAInstallCmap(pcmp); +- return (client->noClientException); +- } else { +- client->errorValue = stuff->id; +- return (BadColor); +- } +-} +- +-static int +-ProcXF86DGAQueryDirectVideo(ClientPtr client) +-{ +- REQUEST(xXF86DGAQueryDirectVideoReq); +- xXF86DGAQueryDirectVideoReply rep; +- +- if (stuff->screen > screenInfo.numScreens) +- return BadValue; +- +- REQUEST_SIZE_MATCH(xXF86DGAQueryDirectVideoReq); +- rep.type = X_Reply; +- rep.length = 0; +- rep.sequenceNumber = client->sequence; +- rep.flags = 0; +- +- if (DGAAvailable(stuff->screen)) +- rep.flags = XF86DGADirectPresent; +- +- WriteToClient(client, SIZEOF(xXF86DGAQueryDirectVideoReply), (char *)&rep); +- return (client->noClientException); +-} +- +-static int +-ProcXF86DGAViewPortChanged(ClientPtr client) +-{ +- REQUEST(xXF86DGAViewPortChangedReq); +- xXF86DGAViewPortChangedReply rep; +- +- if (stuff->screen > screenInfo.numScreens) +- return BadValue; +- +- REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq); +- +- if (!DGAActive(stuff->screen)) +- return (DGAErrorBase + XF86DGADirectNotActivated); +- +- rep.type = X_Reply; +- rep.length = 0; +- rep.sequenceNumber = client->sequence; +- rep.result = 1; +- +- WriteToClient(client, SIZEOF(xXF86DGAViewPortChangedReply), (char *)&rep); +- return (client->noClientException); +-} +- +-int +-ProcXF86DGADispatch(register ClientPtr client) +-{ +- REQUEST(xReq); +- +- switch (stuff->data) +- { +- case X_XF86DGAGetVideoLL: +- return ProcXF86DGAGetVideoLL(client); +- case X_XF86DGADirectVideo: +- return ProcXF86DGADirectVideo(client); +- case X_XF86DGAGetViewPortSize: +- return ProcXF86DGAGetViewPortSize(client); +- case X_XF86DGASetViewPort: +- return ProcXF86DGASetViewPort(client); +- case X_XF86DGAGetVidPage: +- return ProcXF86DGAGetVidPage(client); +- case X_XF86DGASetVidPage: +- return ProcXF86DGASetVidPage(client); +- case X_XF86DGAInstallColormap: +- return ProcXF86DGAInstallColormap(client); +- case X_XF86DGAQueryDirectVideo: +- return ProcXF86DGAQueryDirectVideo(client); +- case X_XF86DGAViewPortChanged: +- return ProcXF86DGAViewPortChanged(client); +- default: +- return BadRequest; +- } +-} +- +diff --git a/hw/xfree86/dixmods/extmod/xf86dga2.c b/hw/xfree86/dixmods/extmod/xf86dga2.c +index c12178f..100bde9 100644 +--- a/hw/xfree86/dixmods/extmod/xf86dga2.c ++++ b/hw/xfree86/dixmods/extmod/xf86dga2.c +@@ -1,8 +1,10 @@ + /* +- Copyright (c) 1999 - The XFree86 Project Inc. +- +- Written by Mark Vojkovich +-*/ ++ * Copyright (c) 1995 Jon Tombs ++ * Copyright (c) 1995, 1996, 1999 XFree86 Inc ++ * Copyright (c) 1999 - The XFree86 Project Inc. ++ * ++ * Written by Mark Vojkovich ++ */ + + + #ifdef HAVE_XORG_CONFIG_H +@@ -33,6 +35,8 @@ + + #include "modinit.h" + ++#define DGA_PROTOCOL_OLD_SUPPORT 1 ++ + static DISPATCH_PROC(ProcXDGADispatch); + static DISPATCH_PROC(SProcXDGADispatch); + static DISPATCH_PROC(ProcXDGAQueryVersion); +@@ -141,7 +145,7 @@ ProcXDGAOpenFramebuffer(ClientPtr client) + if (stuff->screen > screenInfo.numScreens) + return BadValue; + +- if (!DGAAvailable(stuff->screen)) ++ if (!DGAAvailable(stuff->screen)) + return DGAErrorBase + XF86DGANoDirectVideoMode; + + REQUEST_SIZE_MATCH(xXDGAOpenFramebufferReq); +@@ -149,9 +153,9 @@ ProcXDGAOpenFramebuffer(ClientPtr client) + rep.length = 0; + rep.sequenceNumber = client->sequence; + +- if(!DGAOpenFramebuffer(stuff->screen, &deviceName, ++ if(!DGAOpenFramebuffer(stuff->screen, &deviceName, + (unsigned char**)(&rep.mem1), +- (int*)&rep.size, (int*)&rep.offset, (int*)&rep.extra)) ++ (int*)&rep.size, (int*)&rep.offset, (int*)&rep.extra)) + { + return BadAlloc; + } +@@ -175,7 +179,7 @@ ProcXDGACloseFramebuffer(ClientPtr client) + if (stuff->screen > screenInfo.numScreens) + return BadValue; + +- if (!DGAAvailable(stuff->screen)) ++ if (!DGAAvailable(stuff->screen)) + return DGAErrorBase + XF86DGANoDirectVideoMode; + + REQUEST_SIZE_MATCH(xXDGACloseFramebufferReq); +@@ -259,7 +263,7 @@ ProcXDGAQueryModes(ClientPtr client) + info.viewport_flags = mode[i].viewportFlags; + info.reserved1 = mode[i].reserved1; + info.reserved2 = mode[i].reserved2; +- ++ + WriteToClient(client, sz_xXDGAModeInfo, (char*)(&info)); + WriteToClient(client, size, mode[i].name); + } +@@ -270,7 +274,7 @@ ProcXDGAQueryModes(ClientPtr client) + } + + +-static void ++static void + DGAClientStateChange ( + CallbackListPtr* pcbl, + pointer nulldata, +@@ -287,7 +291,7 @@ DGAClientStateChange ( + } + } + +- if(client && ++ if(client && + ((client->clientState == ClientStateGone) || + (client->clientState == ClientStateRetained))) { + XDGAModeRec mode; +@@ -322,10 +326,10 @@ ProcXDGASetMode(ClientPtr client) + rep.flags = 0; + rep.sequenceNumber = client->sequence; + +- if (!DGAAvailable(stuff->screen)) ++ if (!DGAAvailable(stuff->screen)) + return DGAErrorBase + XF86DGANoDirectVideoMode; + +- if(DGAClients[stuff->screen] && ++ if(DGAClients[stuff->screen] && + (DGAClients[stuff->screen] != client)) + return DGAErrorBase + XF86DGANoDirectVideoMode; + +@@ -339,7 +343,7 @@ ProcXDGASetMode(ClientPtr client) + DGASetMode(stuff->screen, 0, &mode, &pPix); + WriteToClient(client, sz_xXDGASetModeReply, (char*)&rep); + return (client->noClientException); +- } ++ } + + if(Success != DGASetMode(stuff->screen, stuff->mode, &mode, &pPix)) + return BadValue; +@@ -359,7 +363,7 @@ ProcXDGASetMode(ClientPtr client) + } + + size = strlen(mode.name) + 1; +- ++ + info.byte_order = mode.byteOrder; + info.depth = mode.depth; + info.num = mode.num; +@@ -427,7 +431,7 @@ ProcXDGAInstallColormap(ClientPtr client) + return DGAErrorBase + XF86DGADirectNotActivated; + + REQUEST_SIZE_MATCH(xXDGAInstallColormapReq); +- ++ + cmap = (ColormapPtr)LookupIDByType(stuff->cmap, RT_COLORMAP); + if (cmap) { + DGAInstallCmap(cmap); +@@ -453,7 +457,7 @@ ProcXDGASelectInput(ClientPtr client) + return DGAErrorBase + XF86DGADirectNotActivated; + + REQUEST_SIZE_MATCH(xXDGASelectInputReq); +- ++ + if(DGAClients[stuff->screen] == client) + DGASelectInput(stuff->screen, client, stuff->mask); + +@@ -473,7 +477,7 @@ ProcXDGAFillRectangle(ClientPtr client) + return DGAErrorBase + XF86DGADirectNotActivated; + + REQUEST_SIZE_MATCH(xXDGAFillRectangleReq); +- ++ + if(Success != DGAFillRect(stuff->screen, stuff->x, stuff->y, + stuff->width, stuff->height, stuff->color)) + return BadMatch; +@@ -493,7 +497,7 @@ ProcXDGACopyArea(ClientPtr client) + return DGAErrorBase + XF86DGADirectNotActivated; + + REQUEST_SIZE_MATCH(xXDGACopyAreaReq); +- ++ + if(Success != DGABlitRect(stuff->screen, stuff->srcx, stuff->srcy, + stuff->width, stuff->height, stuff->dstx, stuff->dsty)) + return BadMatch; +@@ -514,7 +518,7 @@ ProcXDGACopyTransparentArea(ClientPtr client) + return DGAErrorBase + XF86DGADirectNotActivated; + + REQUEST_SIZE_MATCH(xXDGACopyTransparentAreaReq); +- ++ + if(Success != DGABlitTransRect(stuff->screen, stuff->srcx, stuff->srcy, + stuff->width, stuff->height, stuff->dstx, stuff->dsty, stuff->key)) + return BadMatch; +@@ -607,7 +611,7 @@ ProcXDGAChangePixmapMode(ClientPtr client) + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; +- ++ + x = stuff->x; + y = stuff->y; + +@@ -638,8 +642,8 @@ ProcXDGACreateColormap(ClientPtr client) + + if(!stuff->mode) + return BadValue; +- +- result = DGACreateColormap(stuff->screen, client, stuff->id, ++ ++ result = DGACreateColormap(stuff->screen, client, stuff->id, + stuff->mode, stuff->alloc); + if(result != Success) + return result; +@@ -647,6 +651,262 @@ ProcXDGACreateColormap(ClientPtr client) + return (client->noClientException); + } + ++/* ++ * ++ * Support for the old DGA protocol, used to live in xf86dga.c ++ * ++ */ ++ ++#ifdef DGA_PROTOCOL_OLD_SUPPORT ++ ++static DISPATCH_PROC(ProcXF86DGADirectVideo); ++static DISPATCH_PROC(ProcXF86DGAGetVidPage); ++static DISPATCH_PROC(ProcXF86DGAGetVideoLL); ++static DISPATCH_PROC(ProcXF86DGAGetViewPortSize); ++static DISPATCH_PROC(ProcXF86DGASetVidPage); ++static DISPATCH_PROC(ProcXF86DGASetViewPort); ++static DISPATCH_PROC(ProcXF86DGAInstallColormap); ++static DISPATCH_PROC(ProcXF86DGAQueryDirectVideo); ++static DISPATCH_PROC(ProcXF86DGAViewPortChanged); ++ ++ ++static int ++ProcXF86DGAGetVideoLL(ClientPtr client) ++{ ++ REQUEST(xXF86DGAGetVideoLLReq); ++ xXF86DGAGetVideoLLReply rep; ++ XDGAModeRec mode; ++ int num, offset, flags; ++ char *name; ++ ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ REQUEST_SIZE_MATCH(xXF86DGAGetVideoLLReq); ++ rep.type = X_Reply; ++ rep.length = 0; ++ rep.sequenceNumber = client->sequence; ++ ++ if(!DGAAvailable(stuff->screen)) ++ return (DGAErrorBase + XF86DGANoDirectVideoMode); ++ ++ if(!(num = DGAGetOldDGAMode(stuff->screen))) ++ return (DGAErrorBase + XF86DGANoDirectVideoMode); ++ ++ /* get the parameters for the mode that best matches */ ++ DGAGetModeInfo(stuff->screen, &mode, num); ++ ++ if(!DGAOpenFramebuffer(stuff->screen, &name, ++ (unsigned char**)(&rep.offset), ++ (int*)(&rep.bank_size), &offset, &flags)) ++ return BadAlloc; ++ ++ rep.offset += mode.offset; ++ rep.width = mode.bytesPerScanline / (mode.bitsPerPixel >> 3); ++ rep.ram_size = rep.bank_size >> 10; ++ ++ WriteToClient(client, SIZEOF(xXF86DGAGetVideoLLReply), (char *)&rep); ++ return (client->noClientException); ++} ++ ++static int ++ProcXF86DGADirectVideo(ClientPtr client) ++{ ++ int num; ++ PixmapPtr pix; ++ XDGAModeRec mode; ++ REQUEST(xXF86DGADirectVideoReq); ++ ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq); ++ ++ if (!DGAAvailable(stuff->screen)) ++ return DGAErrorBase + XF86DGANoDirectVideoMode; ++ ++ if (stuff->enable & XF86DGADirectGraphics) { ++ if(!(num = DGAGetOldDGAMode(stuff->screen))) ++ return (DGAErrorBase + XF86DGANoDirectVideoMode); ++ } else ++ num = 0; ++ ++ if(Success != DGASetMode(stuff->screen, num, &mode, &pix)) ++ return (DGAErrorBase + XF86DGAScreenNotActive); ++ ++ DGASetInputMode (stuff->screen, ++ (stuff->enable & XF86DGADirectKeyb) != 0, ++ (stuff->enable & XF86DGADirectMouse) != 0); ++ ++ return (client->noClientException); ++} ++ ++static int ++ProcXF86DGAGetViewPortSize(ClientPtr client) ++{ ++ int num; ++ XDGAModeRec mode; ++ REQUEST(xXF86DGAGetViewPortSizeReq); ++ xXF86DGAGetViewPortSizeReply rep; ++ ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ REQUEST_SIZE_MATCH(xXF86DGAGetViewPortSizeReq); ++ rep.type = X_Reply; ++ rep.length = 0; ++ rep.sequenceNumber = client->sequence; ++ ++ if (!DGAAvailable(stuff->screen)) ++ return (DGAErrorBase + XF86DGANoDirectVideoMode); ++ ++ if(!(num = DGAGetOldDGAMode(stuff->screen))) ++ return (DGAErrorBase + XF86DGANoDirectVideoMode); ++ ++ DGAGetModeInfo(stuff->screen, &mode, num); ++ ++ rep.width = mode.viewportWidth; ++ rep.height = mode.viewportHeight; ++ ++ WriteToClient(client, SIZEOF(xXF86DGAGetViewPortSizeReply), (char *)&rep); ++ return (client->noClientException); ++} ++ ++static int ++ProcXF86DGASetViewPort(ClientPtr client) ++{ ++ REQUEST(xXF86DGASetViewPortReq); ++ ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq); ++ ++ if (!DGAAvailable(stuff->screen)) ++ return (DGAErrorBase + XF86DGANoDirectVideoMode); ++ ++ if (!DGAActive(stuff->screen)) ++ { ++ int num; ++ PixmapPtr pix; ++ XDGAModeRec mode; ++ ++ if(!(num = DGAGetOldDGAMode(stuff->screen))) ++ return (DGAErrorBase + XF86DGANoDirectVideoMode); ++ if(Success != DGASetMode(stuff->screen, num, &mode, &pix)) ++ return (DGAErrorBase + XF86DGAScreenNotActive); ++ } ++ ++ if (DGASetViewport(stuff->screen, stuff->x, stuff->y, DGA_FLIP_RETRACE) ++ != Success) ++ return DGAErrorBase + XF86DGADirectNotActivated; ++ ++ return (client->noClientException); ++} ++ ++static int ++ProcXF86DGAGetVidPage(ClientPtr client) ++{ ++ REQUEST(xXF86DGAGetVidPageReq); ++ xXF86DGAGetVidPageReply rep; ++ ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ REQUEST_SIZE_MATCH(xXF86DGAGetVidPageReq); ++ rep.type = X_Reply; ++ rep.length = 0; ++ rep.sequenceNumber = client->sequence; ++ rep.vpage = 0; /* silently fail */ ++ ++ WriteToClient(client, SIZEOF(xXF86DGAGetVidPageReply), (char *)&rep); ++ return (client->noClientException); ++} ++ ++ ++static int ++ProcXF86DGASetVidPage(ClientPtr client) ++{ ++ REQUEST(xXF86DGASetVidPageReq); ++ ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ REQUEST_SIZE_MATCH(xXF86DGASetVidPageReq); ++ ++ /* silently fail */ ++ ++ return (client->noClientException); ++} ++ ++ ++static int ++ProcXF86DGAInstallColormap(ClientPtr client) ++{ ++ ColormapPtr pcmp; ++ REQUEST(xXF86DGAInstallColormapReq); ++ ++ REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq); ++ ++ if (!DGAActive(stuff->screen)) ++ return (DGAErrorBase + XF86DGADirectNotActivated); ++ ++ pcmp = (ColormapPtr )LookupIDByType(stuff->id, RT_COLORMAP); ++ if (pcmp) { ++ DGAInstallCmap(pcmp); ++ return (client->noClientException); ++ } else { ++ client->errorValue = stuff->id; ++ return (BadColor); ++ } ++} ++ ++static int ++ProcXF86DGAQueryDirectVideo(ClientPtr client) ++{ ++ REQUEST(xXF86DGAQueryDirectVideoReq); ++ xXF86DGAQueryDirectVideoReply rep; ++ ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ REQUEST_SIZE_MATCH(xXF86DGAQueryDirectVideoReq); ++ rep.type = X_Reply; ++ rep.length = 0; ++ rep.sequenceNumber = client->sequence; ++ rep.flags = 0; ++ ++ if (DGAAvailable(stuff->screen)) ++ rep.flags = XF86DGADirectPresent; ++ ++ WriteToClient(client, SIZEOF(xXF86DGAQueryDirectVideoReply), (char *)&rep); ++ return (client->noClientException); ++} ++ ++static int ++ProcXF86DGAViewPortChanged(ClientPtr client) ++{ ++ REQUEST(xXF86DGAViewPortChangedReq); ++ xXF86DGAViewPortChangedReply rep; ++ ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq); ++ ++ if (!DGAActive(stuff->screen)) ++ return (DGAErrorBase + XF86DGADirectNotActivated); ++ ++ rep.type = X_Reply; ++ rep.length = 0; ++ rep.sequenceNumber = client->sequence; ++ rep.result = 1; ++ ++ WriteToClient(client, SIZEOF(xXF86DGAViewPortChangedReply), (char *)&rep); ++ return (client->noClientException); ++} ++ ++#endif /* DGA_PROTOCOL_OLD_SUPPORT */ + + static int + SProcXDGADispatch (ClientPtr client) +@@ -702,15 +962,11 @@ ProcXDGADispatch (ClientPtr client) + if (stuff->data <= X_XDGACreateColormap) + fprintf (stderr, " DGA %s\n", dgaMinor[stuff->data]); + #endif +- +- /* divert old protocol */ +-#if 1 +- if( (stuff->data <= X_XF86DGAViewPortChanged) && +- (stuff->data >= X_XF86DGAGetVideoLL)) +- return ProcXF86DGADispatch(client); +-#endif + + switch (stuff->data){ ++ /* ++ * DGA2 Protocol ++ */ + case X_XDGAQueryVersion: + return ProcXDGAQueryVersion(client); + case X_XDGAQueryModes: +@@ -743,6 +999,29 @@ ProcXDGADispatch (ClientPtr client) + return ProcXDGAChangePixmapMode(client); + case X_XDGACreateColormap: + return ProcXDGACreateColormap(client); ++ /* ++ * Old DGA Protocol ++ */ ++#ifdef DGA_PROTOCOL_OLD_SUPPORT ++ case X_XF86DGAGetVideoLL: ++ return ProcXF86DGAGetVideoLL(client); ++ case X_XF86DGADirectVideo: ++ return ProcXF86DGADirectVideo(client); ++ case X_XF86DGAGetViewPortSize: ++ return ProcXF86DGAGetViewPortSize(client); ++ case X_XF86DGASetViewPort: ++ return ProcXF86DGASetViewPort(client); ++ case X_XF86DGAGetVidPage: ++ return ProcXF86DGAGetVidPage(client); ++ case X_XF86DGASetVidPage: ++ return ProcXF86DGASetVidPage(client); ++ case X_XF86DGAInstallColormap: ++ return ProcXF86DGAInstallColormap(client); ++ case X_XF86DGAQueryDirectVideo: ++ return ProcXF86DGAQueryDirectVideo(client); ++ case X_XF86DGAViewPortChanged: ++ return ProcXF86DGAViewPortChanged(client); ++#endif /* DGA_PROTOCOL_OLD_SUPPORT */ + default: + return BadRequest; + } +@@ -751,5 +1030,5 @@ ProcXDGADispatch (ClientPtr client) + void + XFree86DGARegister(INITARGS) + { +- XDGAEventBase = &DGAEventBase; ++ XDGAEventBase = &DGAEventBase; + } +commit 2d9da7a5f384d5f38b2be79b1ea0df5a3deb52d1 +Author: Luc Verhaegen +Date: Thu Oct 9 22:22:53 2008 +0200 + + DGA: Track client state even when using old style DGA. + + This fixes the issue that a badly killed DGA will keep on hogging + mode/framebuffer/mouse/keyboard. + +diff --git a/hw/xfree86/dixmods/extmod/xf86dga2.c b/hw/xfree86/dixmods/extmod/xf86dga2.c +index 100bde9..df0030e 100644 +--- a/hw/xfree86/dixmods/extmod/xf86dga2.c ++++ b/hw/xfree86/dixmods/extmod/xf86dga2.c +@@ -725,6 +725,10 @@ ProcXF86DGADirectVideo(ClientPtr client) + if (!DGAAvailable(stuff->screen)) + return DGAErrorBase + XF86DGANoDirectVideoMode; + ++ if (DGAClients[stuff->screen] && ++ (DGAClients[stuff->screen] != client)) ++ return DGAErrorBase + XF86DGANoDirectVideoMode; ++ + if (stuff->enable & XF86DGADirectGraphics) { + if(!(num = DGAGetOldDGAMode(stuff->screen))) + return (DGAErrorBase + XF86DGANoDirectVideoMode); +@@ -738,6 +742,24 @@ ProcXF86DGADirectVideo(ClientPtr client) + (stuff->enable & XF86DGADirectKeyb) != 0, + (stuff->enable & XF86DGADirectMouse) != 0); + ++ /* We need to track the client and attach the teardown callback */ ++ if (stuff->enable & ++ (XF86DGADirectGraphics | XF86DGADirectKeyb | XF86DGADirectMouse)) { ++ if (!DGAClients[stuff->screen]) { ++ if (DGACallbackRefCount++ == 0) ++ AddCallback (&ClientStateCallback, DGAClientStateChange, NULL); ++ } ++ ++ DGAClients[stuff->screen] = client; ++ } else { ++ if (DGAClients[stuff->screen]) { ++ if (--DGACallbackRefCount == 0) ++ DeleteCallback(&ClientStateCallback, DGAClientStateChange, NULL); ++ } ++ ++ DGAClients[stuff->screen] = NULL; ++ } ++ + return (client->noClientException); + } + +@@ -780,22 +802,16 @@ ProcXF86DGASetViewPort(ClientPtr client) + if (stuff->screen > screenInfo.numScreens) + return BadValue; + ++ if (DGAClients[stuff->screen] != client) ++ return DGAErrorBase + XF86DGADirectNotActivated; ++ + REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq); + + if (!DGAAvailable(stuff->screen)) + return (DGAErrorBase + XF86DGANoDirectVideoMode); + + if (!DGAActive(stuff->screen)) +- { +- int num; +- PixmapPtr pix; +- XDGAModeRec mode; +- +- if(!(num = DGAGetOldDGAMode(stuff->screen))) +- return (DGAErrorBase + XF86DGANoDirectVideoMode); +- if(Success != DGASetMode(stuff->screen, num, &mode, &pix)) +- return (DGAErrorBase + XF86DGAScreenNotActive); +- } ++ return DGAErrorBase + XF86DGADirectNotActivated; + + if (DGASetViewport(stuff->screen, stuff->x, stuff->y, DGA_FLIP_RETRACE) + != Success) +@@ -846,6 +862,12 @@ ProcXF86DGAInstallColormap(ClientPtr client) + ColormapPtr pcmp; + REQUEST(xXF86DGAInstallColormapReq); + ++ if (stuff->screen > screenInfo.numScreens) ++ return BadValue; ++ ++ if (DGAClients[stuff->screen] != client) ++ return DGAErrorBase + XF86DGADirectNotActivated; ++ + REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq); + + if (!DGAActive(stuff->screen)) +@@ -892,6 +914,9 @@ ProcXF86DGAViewPortChanged(ClientPtr client) + if (stuff->screen > screenInfo.numScreens) + return BadValue; + ++ if (DGAClients[stuff->screen] != client) ++ return DGAErrorBase + XF86DGADirectNotActivated; ++ + REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq); + + if (!DGAActive(stuff->screen)) diff --git a/xorg-server-commit-d1bb5e3.diff b/xorg-server-commit-d1bb5e3.diff new file mode 100644 index 0000000..2786b14 --- /dev/null +++ b/xorg-server-commit-d1bb5e3.diff @@ -0,0 +1,41 @@ +commit 1feb69eb63e6739ff5db255ad529e84adf941a10 +Author: Luc Verhaegen +Date: Wed Oct 8 14:55:29 2008 +0200 + + DGA: Fix ProcXF86DGASetViewPort for missing support in driver. + + Fixes a segfault when trying to activate a DGA mode without checking + whether DGA modesetting is at all possible. + +diff --git a/hw/xfree86/dixmods/extmod/xf86dga.c b/hw/xfree86/dixmods/extmod/xf86dga.c +index 0736167..c66bca2 100644 +--- a/hw/xfree86/dixmods/extmod/xf86dga.c ++++ b/hw/xfree86/dixmods/extmod/xf86dga.c +@@ -93,7 +93,7 @@ ProcXF86DGADirectVideo(ClientPtr client) + + REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq); + +- if (!DGAAvailable(stuff->screen)) ++ if (!DGAAvailable(stuff->screen)) + return DGAErrorBase + XF86DGANoDirectVideoMode; + + if (stuff->enable & XF86DGADirectGraphics) { +@@ -128,7 +128,7 @@ ProcXF86DGAGetViewPortSize(ClientPtr client) + rep.length = 0; + rep.sequenceNumber = client->sequence; + +- if (!DGAAvailable(stuff->screen)) ++ if (!DGAAvailable(stuff->screen)) + return (DGAErrorBase + XF86DGANoDirectVideoMode); + + if(!(num = DGAGetOldDGAMode(stuff->screen))) +@@ -153,6 +153,9 @@ ProcXF86DGASetViewPort(ClientPtr client) + + REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq); + ++ if (!DGAAvailable(stuff->screen)) ++ return (DGAErrorBase + XF86DGANoDirectVideoMode); ++ + if (!DGAActive(stuff->screen)) + { + int num; diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 2635162..b32c42d 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,3 +1,23 @@ +------------------------------------------------------------------- +Fri Oct 10 04:26:40 CEST 2008 - sndirsch@suse.de + +- dga_cleanup.diff + * DGA: Mash together xf86dga.c and xf86dga2.c for a client state + tracking fix. + * DGA: Track client state even when using old style DGA. This + fixes the issue that a badly killed DGA will keep on hogging + mode/framebuffer/mouse/keyboard. (bnc #310232) + +------------------------------------------------------------------- +Thu Oct 9 14:59:06 CEST 2008 - sndirsch@suse.de + +- xorg-server-commit-d1bb5e3.diff + * DGA: Fix ProcXF86DGASetViewPort for missing support in driver. + Fixes a segfault when trying to activate a DGA mode without + checking whether DGA modesetting is at all possible. + (Luc Verhaegen) + +------------------------------------------------------------------- Mon Sep 29 14:26:13 CEST 2008 - sndirsch@suse.de - make use of %configure macro diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 56d9b85..6e8f476 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -29,7 +29,7 @@ BuildRequires: libjpeg-devel Url: http://xorg.freedesktop.org/ %define EXPERIMENTAL 0 Version: 7.4 -Release: 6 +Release: 7 License: X11/MIT BuildRoot: %{_tmppath}/%{name}-%{version}-build Group: System/X11/Servers/XF86_4 @@ -98,6 +98,8 @@ Patch114: 64bit-portability-issue.diff Patch116: ppc.diff Patch117: acpi-warning.diff Patch118: exa-greedy.diff +Patch119: xorg-server-commit-d1bb5e3.diff +Patch120: dga_cleanup.diff %description This package contains the X.Org Server. @@ -216,6 +218,8 @@ popd %endif %patch117 %patch118 -p1 +%patch119 -p1 +%patch120 -p1 %build pushd xorg-docs-* @@ -531,6 +535,19 @@ exit 0 %endif %changelog +* Fri Oct 10 2008 sndirsch@suse.de +- dga_cleanup.diff + * DGA: Mash together xf86dga.c and xf86dga2.c for a client state + tracking fix. + * DGA: Track client state even when using old style DGA. This + fixes the issue that a badly killed DGA will keep on hogging + mode/framebuffer/mouse/keyboard. (bnc #310232) +* Thu Oct 09 2008 sndirsch@suse.de +- xorg-server-commit-d1bb5e3.diff + * DGA: Fix ProcXF86DGASetViewPort for missing support in driver. + Fixes a segfault when trying to activate a DGA mode without + checking whether DGA modesetting is at all possible. + (Luc Verhaegen) * Mon Sep 29 2008 sndirsch@suse.de - make use of %%configure macro * Tue Sep 23 2008 sndirsch@suse.de