+++ /dev/null
-/* $XFree86: xc/programs/Xserver/Xext/xf86dga.c,v 3.8 1997/01/18 06:53:01 dawes Exp $ */
-
-/*
-
-Copyright (c) 1995 Jon Tombs
-Copyright (c) 1995, 1996 XFree86 Inc
-
-*/
-
-#define NEED_REPLIES
-#define NEED_EVENTS
-#include "X.h"
-#include "Xproto.h"
-#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 "xf86dgastr.h"
-#include "swaprep.h"
-#include "../hw/xfree86/common/xf86.h"
-
-#include <X11/Xtrans.h>
-#include "../os/osdep.h"
-#include <X11/Xauth.h>
-#ifndef ESIX
-#ifndef Lynx
-#include <sys/socket.h>
-#else
-#include <socket.h>
-#endif
-#else
-#include <lan/socket.h>
-#endif
-
-extern int xf86ScreenIndex;
-
-static int DGAErrorBase;
-
-static DISPATCH_PROC(ProcDGAQueryVersion);
-static DISPATCH_PROC(ProcXF86DGADirectVideo);
-static DISPATCH_PROC(ProcXF86DGADispatch);
-static DISPATCH_PROC(ProcXF86DGAGetVidPage);
-static DISPATCH_PROC(ProcXF86DGAGetVideoLL);
-static DISPATCH_PROC(ProcXF86DGAGetViewPortSize);
-static DISPATCH_PROC(ProcXF86DGASetVidPage);
-static DISPATCH_PROC(ProcXF86DGASetViewPort);
-static DISPATCH_PROC(ProcDGAInstallColormap);
-static DISPATCH_PROC(ProcDGAQueryDirectVideo);
-static DISPATCH_PROC(ProcDGAViewPortChanged);
-
-/*
- * SProcs should probably be deleted, a local connection can never
- * be byte flipped!? - Jon.
- */
-static DISPATCH_PROC(SProcXF86DGADirectVideo);
-static DISPATCH_PROC(SProcXF86DGADispatch);
-static DISPATCH_PROC(SProcXF86DGAQueryVersion);
-
-static void XF86DGAResetProc(
-#if NeedFunctionPrototypes
- ExtensionEntry* /* extEntry */
-#endif
-);
-
-static unsigned char DGAReqCode = 0;
-
-void
-XFree86DGAExtensionInit()
-{
- ExtensionEntry* extEntry;
-#ifdef XF86DGA_EVENTS
- int i;
- ScreenPtr pScreen;
-
- EventType = CreateNewResourceType(XF86DGAFreeEvents);
- ScreenPrivateIndex = AllocateScreenPrivateIndex ();
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- pScreen = screenInfo.screens[i];
- SetScreenPrivate (pScreen, NULL);
- }
-#endif
-
- if (
-#ifdef XF86DGA_EVENTS
- EventType && ScreenPrivateIndex != -1 &&
-#endif
- (extEntry = AddExtension(XF86DGANAME,
- XF86DGANumberEvents,
- XF86DGANumberErrors,
- ProcXF86DGADispatch,
- SProcXF86DGADispatch,
- XF86DGAResetProc,
- StandardMinorOpcode))) {
- DGAReqCode = (unsigned char)extEntry->base;
- DGAErrorBase = extEntry->errorBase;
- }
-}
-
-/*ARGSUSED*/
-static void
-XF86DGAResetProc (extEntry)
- ExtensionEntry* extEntry;
-{
-}
-
-static int
-ProcDGAQueryVersion(client)
- register ClientPtr client;
-{
- xXF86DGAQueryVersionReply rep;
- register int n;
-
- REQUEST_SIZE_MATCH(xXF86DGAQueryVersionReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.majorVersion = XF86DGA_MAJOR_VERSION;
- rep.minorVersion = XF86DGA_MINOR_VERSION;
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- }
- WriteToClient(client, sizeof(xXF86DGAQueryVersionReply), (char *)&rep);
- return (client->noClientException);
-}
-
-static int
-ProcXF86DGAGetVideoLL(client)
- register ClientPtr client;
-{
- REQUEST(xXF86DGAGetVideoLLReq);
- xXF86DGAGetVideoLLReply rep;
- ScrnInfoPtr vptr;
- register int n;
-
- if (stuff->screen > screenInfo.numScreens)
- return BadValue;
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
- REQUEST_SIZE_MATCH(xXF86DGAGetVideoLLReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-#if 0
- xf86GetVidMemData(stuff->screen, &rep.offset, &rep.bank_size);
-#else
- rep.offset = vptr->physBase;
- rep.bank_size = vptr->physSize;
-#endif
- rep.width = vptr->displayWidth;
- rep.ram_size = vptr->videoRam;
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.offset, n);
- swapl(&rep.width, n);
- swapl(&rep.bank_size, n);
- swapl(&rep.ram_size, n);
- }
- WriteToClient(client, SIZEOF(xXF86DGAGetVideoLLReply), (char *)&rep);
- return (client->noClientException);
-}
-
-static int
-ProcXF86DGADirectVideo(client)
- register ClientPtr client;
-{
- REQUEST(xXF86DGADirectVideoReq);
- ScrnInfoPtr vptr;
-
- if (stuff->screen > screenInfo.numScreens)
- return BadValue;
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
-
- REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq);
- if (!(vptr->directMode&XF86DGADirectPresent)) {
- /* chipset doesn't know about directVideoMode */
- return DGAErrorBase + XF86DGANoDirectVideoMode;
- }
-
- /* Check that the current screen is active. */
- if (!xf86VTSema && !(vptr->directMode & XF86DGADirectGraphics)) {
- return DGAErrorBase + XF86DGAScreenNotActive;
- }
-
- if (stuff->enable&XF86DGADirectGraphics) {
- vptr->directMode = stuff->enable|XF86DGADirectPresent;
- if (xf86VTSema == TRUE) {
- vptr->EnterLeaveVT(LEAVE, stuff->screen);
- xf86VTSema = FALSE;
- }
- } else {
- if (xf86VTSema == FALSE) {
- xf86VTSema = TRUE;
- vptr->EnterLeaveVT(ENTER, stuff->screen);
- }
- vptr->directMode = (0x0f&stuff->enable)|XF86DGADirectPresent;
- }
-
- return (client->noClientException);
-}
-
-static int
-ProcXF86DGAGetViewPortSize(client)
- register ClientPtr client;
-{
- REQUEST(xXF86DGAGetViewPortSizeReq);
- xXF86DGAGetViewPortSizeReply rep;
- register int n;
- ScrnInfoPtr vptr;
-
- if (stuff->screen > screenInfo.numScreens)
- return BadValue;
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
-
- REQUEST_SIZE_MATCH(xXF86DGAGetViewPortSizeReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.width = vptr->modes->HDisplay;
- rep.height = vptr->modes->VDisplay;
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.width, n);
- swapl(&rep.height, n);
- }
- WriteToClient(client, SIZEOF(xXF86DGAGetViewPortSizeReply), (char *)&rep);
- return (client->noClientException);
-}
-
-static int
-ProcXF86DGASetViewPort(client)
- register ClientPtr client;
-{
- REQUEST(xXF86DGASetViewPortReq);
- ScrnInfoPtr vptr;
-
- if (stuff->screen > screenInfo.numScreens)
- return BadValue;
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
-
- REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq);
-
- if (vptr->AdjustFrame &&
- (xf86VTSema == TRUE || vptr->directMode&XF86DGADirectGraphics))
- vptr->AdjustFrame(stuff->x, stuff->y);
- else
- return DGAErrorBase + XF86DGAScreenNotActive;
-
- return (client->noClientException);
-}
-
-static int
-ProcXF86DGAGetVidPage(client)
- register ClientPtr client;
-{
- REQUEST(xXF86DGAGetVidPageReq);
- ScrnInfoPtr vptr;
-
- if (stuff->screen > screenInfo.numScreens)
- return BadValue;
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
- ErrorF("XF86DGAGetVidPage not yet implemented\n");
-
- REQUEST_SIZE_MATCH(xXF86DGAGetVidPageReq);
- return (client->noClientException);
-}
-
-
-static int
-ProcXF86DGASetVidPage(client)
- register ClientPtr client;
-{
- REQUEST(xXF86DGASetVidPageReq);
- ScrnInfoPtr vptr;
-
- if (stuff->screen > screenInfo.numScreens)
- return BadValue;
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
-
- REQUEST_SIZE_MATCH(xXF86DGASetVidPageReq);
-
- if (xf86VTSema == TRUE) {/* only valid when switched away! */
- return DGAErrorBase + XF86DGADirectNotActivated;
- }
- if (!xf86VTSema && !(vptr->directMode & XF86DGADirectGraphics)) {
- return DGAErrorBase + XF86DGAScreenNotActive;
- }
-
- if (vptr->setBank) {
- vptr->setBank(stuff->vpage);
- }
- return (client->noClientException);
-}
-
-
-static int
-ProcDGAInstallColormap(client)
- register ClientPtr client;
-{
- ColormapPtr pcmp;
- ScrnInfoPtr vptr;
- REQUEST(xXF86DGAInstallColormapReq);
-
- REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq);
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
-
- if (xf86VTSema == TRUE) {/* only valid when switched away! */
- return DGAErrorBase + XF86DGADirectNotActivated;
- }
- if (!xf86VTSema && !(vptr->directMode & XF86DGADirectGraphics)) {
- return DGAErrorBase + XF86DGAScreenNotActive;
- }
-
- pcmp = (ColormapPtr )LookupIDByType(stuff->id, RT_COLORMAP);
- if (pcmp)
- {
- vptr->directMode |= XF86DGADirectColormap;
- vptr->directMode |= XF86DGAHasColormap;
- (*(pcmp->pScreen->InstallColormap)) (pcmp);
- vptr->directMode &= ~XF86DGAHasColormap;
- return (client->noClientException);
- }
- else
- {
- client->errorValue = stuff->id;
- return (BadColor);
- }
-}
-
-static int
-ProcXF86DGAQueryDirectVideo(client)
- register ClientPtr client;
-{
- REQUEST(xXF86DGAQueryDirectVideoReq);
- xXF86DGAQueryDirectVideoReply rep;
- register int n;
- ScrnInfoPtr vptr;
-
- if (stuff->screen > screenInfo.numScreens)
- return BadValue;
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
-
- REQUEST_SIZE_MATCH(xXF86DGAQueryDirectVideoReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.flags = vptr->directMode;
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.flags, n);
- }
- WriteToClient(client, SIZEOF(xXF86DGAQueryDirectVideoReply), (char *)&rep);
- return (client->noClientException);
-}
-
-static int
-ProcXF86DGAViewPortChanged(client)
- register ClientPtr client;
-{
- REQUEST(xXF86DGAViewPortChangedReq);
- xXF86DGAViewPortChangedReply rep;
- register int n;
- ScrnInfoPtr vptr;
-
- if (stuff->screen > screenInfo.numScreens)
- return BadValue;
-
- vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
-
- REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- /* For the moment, always return TRUE. */
- rep.result = TRUE;
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.result, n);
- }
- WriteToClient(client, SIZEOF(xXF86DGAViewPortChangedReply), (char *)&rep);
- return (client->noClientException);
-}
-
-static int
-ProcXF86DGADispatch (client)
- register ClientPtr client;
-{
- REQUEST(xReq);
-
- if (!LocalClient(client))
- return DGAErrorBase + XF86DGAClientNotLocal;
-
- switch (stuff->data)
- {
- case X_XF86DGAQueryVersion:
- return ProcDGAQueryVersion(client);
- 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 ProcDGAInstallColormap(client);
- case X_XF86DGAQueryDirectVideo:
- return ProcXF86DGAQueryDirectVideo(client);
- case X_XF86DGAViewPortChanged:
- return ProcXF86DGAViewPortChanged(client);
- default:
- return BadRequest;
- }
-}
-
-static int
-SProcXF86DGAQueryVersion(client)
- register ClientPtr client;
-{
- register int n;
- REQUEST(xXF86DGAQueryVersionReq);
- swaps(&stuff->length, n);
- return ProcDGAQueryVersion(client);
-}
-
-static int
-SProcXF86DGADirectVideo(client)
- ClientPtr client;
-{
- register int n;
- REQUEST(xXF86DGADirectVideoReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq);
- swaps(&stuff->screen, n);
- swaps(&stuff->enable, n);
- return ProcXF86DGADirectVideo(client);
-}
-
-static int
-SProcXF86DGADispatch (client)
- register ClientPtr client;
-{
- REQUEST(xReq);
-
- /* It is bound to be non-local when there is byte swapping */
- if (!LocalClient(client))
- return DGAErrorBase + XF86DGAClientNotLocal;
-
- switch (stuff->data)
- {
- case X_XF86DGAQueryVersion:
- return SProcXF86DGAQueryVersion(client);
- case X_XF86DGADirectVideo:
- return SProcXF86DGADirectVideo(client);
- default:
- return BadRequest;
- }
-}
-