xserver-multidpi/hw/xfree86/dri/dri.c

2407 lines
74 KiB
C
Raw Normal View History

2003-11-14 17:48:57 +01:00
/**************************************************************************
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
Copyright 2000 VA Linux Systems, Inc.
All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sub license, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice (including the
next paragraph) shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
/*
* Authors:
* Jens Owen <jens@tungstengraphics.com>
* Rickard E. (Rik) Faith <faith@valinux.com>
*
*/
#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
2003-11-14 17:48:57 +01:00
#include "xf86.h"
#include <sys/time.h>
#include <unistd.h>
2006-03-29 03:05:09 +02:00
#include <string.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <errno.h>
2003-11-14 17:48:57 +01:00
#include <X11/X.h>
#include <X11/Xproto.h>
#include "xf86drm.h"
#include "misc.h"
2003-11-14 17:48:57 +01:00
#include "dixstruct.h"
#include "extnsionst.h"
#include "extinit.h"
2003-11-14 17:48:57 +01:00
#include "colormapst.h"
#include "cursorstr.h"
#include "scrnintstr.h"
#include "windowstr.h"
#include "servermd.h"
#define _XF86DRI_SERVER_
#include <X11/dri/xf86driproto.h>
2003-11-14 17:48:57 +01:00
#include "swaprep.h"
2004-07-30 06:44:13 +02:00
#include "xf86str.h"
2003-11-14 17:48:57 +01:00
#include "dri.h"
#include "sarea.h"
#include "dristruct.h"
#include "mi.h"
#include "mipointer.h"
#include "xf86_OSproc.h"
#include "inputstr.h"
#include "xf86VGAarbiter.h"
#include "xf86Extensions.h"
2003-11-14 17:48:57 +01:00
static int DRIEntPrivIndex = -1;
static DevPrivateKeyRec DRIScreenPrivKeyRec;
#define DRIScreenPrivKey (&DRIScreenPrivKeyRec)
static DevPrivateKeyRec DRIWindowPrivKeyRec;
#define DRIWindowPrivKey (&DRIWindowPrivKeyRec)
2003-11-14 17:48:57 +01:00
static unsigned long DRIGeneration = 0;
static unsigned int DRIDrawableValidationStamp = 0;
static RESTYPE DRIDrawablePrivResType;
static RESTYPE DRIContextPrivResType;
static void DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv);
2003-11-14 17:48:57 +01:00
drmServerInfo DRIDRMServerInfo;
/* Wrapper just like xf86DrvMsg, but
without the verbosity level checking.
This will make it easy to turn off some
messages later, based on verbosity
level. */
2003-11-14 17:48:57 +01:00
/*
* Since we're already referencing things from the XFree86 common layer in
* this file, we'd might as well just call xf86VDrvMsgVerb, and have
* consistent message formatting. The verbosity of these messages can be
* easily changed here.
*/
#define DRI_MSG_VERBOSITY 1
static void
DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...)
_X_ATTRIBUTE_PRINTF(3,4);
2003-11-14 17:48:57 +01:00
static void
DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...)
{
va_list ap;
2003-11-14 17:48:57 +01:00
va_start(ap, format);
xf86VDrvMsgVerb(scrnIndex, type, DRI_MSG_VERBOSITY, format, ap);
va_end(ap);
}
static void
DRIOpenDRMCleanup(DRIEntPrivPtr pDRIEntPriv)
{
if (pDRIEntPriv->pLSAREA != NULL) {
drmUnmap(pDRIEntPriv->pLSAREA, pDRIEntPriv->sAreaSize);
pDRIEntPriv->pLSAREA = NULL;
}
if (pDRIEntPriv->hLSAREA != 0) {
drmRmMap(pDRIEntPriv->drmFD, pDRIEntPriv->hLSAREA);
}
if (pDRIEntPriv->drmFD >= 0) {
drmClose(pDRIEntPriv->drmFD);
pDRIEntPriv->drmFD = 0;
}
}
int
DRIMasterFD(ScrnInfoPtr pScrn)
{
return DRI_ENT_PRIV(pScrn)->drmFD;
}
void *
DRIMasterSareaPointer(ScrnInfoPtr pScrn)
{
return DRI_ENT_PRIV(pScrn)->pLSAREA;
}
drm_handle_t
DRIMasterSareaHandle(ScrnInfoPtr pScrn)
{
return DRI_ENT_PRIV(pScrn)->hLSAREA;
}
Bool
DRIOpenDRMMaster(ScrnInfoPtr pScrn,
unsigned long sAreaSize,
const char *busID, const char *drmDriverName)
{
drmSetVersion saveSv, sv;
Bool drmWasAvailable;
DRIEntPrivPtr pDRIEntPriv;
DRIEntPrivRec tmp;
int count;
int err;
if (DRIEntPrivIndex == -1)
DRIEntPrivIndex = xf86AllocateEntityPrivateIndex();
pDRIEntPriv = DRI_ENT_PRIV(pScrn);
if (pDRIEntPriv && pDRIEntPriv->drmFD != -1)
return TRUE;
drmWasAvailable = drmAvailable();
memset(&tmp, 0, sizeof(tmp));
tmp.drmFD = -1;
sv.drm_di_major = 1;
sv.drm_di_minor = 1;
sv.drm_dd_major = -1;
saveSv = sv;
count = 10;
while (count--) {
tmp.drmFD = drmOpen(drmDriverName, busID);
if (tmp.drmFD < 0) {
DRIDrvMsg(-1, X_ERROR, "[drm] drmOpen failed.\n");
goto out_err;
}
err = drmSetInterfaceVersion(tmp.drmFD, &sv);
if (err != -EPERM)
break;
sv = saveSv;
drmClose(tmp.drmFD);
tmp.drmFD = -1;
usleep(100000);
}
if (tmp.drmFD <= 0) {
DRIDrvMsg(-1, X_ERROR, "[drm] DRM was busy with another master.\n");
goto out_err;
}
if (!drmWasAvailable) {
DRIDrvMsg(-1, X_INFO,
"[drm] loaded kernel module for \"%s\" driver.\n",
drmDriverName);
}
if (err != 0) {
sv.drm_di_major = 1;
sv.drm_di_minor = 0;
}
DRIDrvMsg(-1, X_INFO, "[drm] DRM interface version %d.%d\n",
sv.drm_di_major, sv.drm_di_minor);
if (sv.drm_di_major == 1 && sv.drm_di_minor >= 1)
err = 0;
else
err = drmSetBusid(tmp.drmFD, busID);
if (err) {
DRIDrvMsg(-1, X_ERROR, "[drm] Could not set DRM device bus ID.\n");
goto out_err;
}
/*
* Create a lock-containing sarea.
*/
if (drmAddMap(tmp.drmFD, 0, sAreaSize, DRM_SHM,
DRM_CONTAINS_LOCK, &tmp.hLSAREA) < 0) {
DRIDrvMsg(-1, X_INFO, "[drm] Could not create SAREA for DRM lock.\n");
tmp.hLSAREA = 0;
goto out_err;
}
if (drmMap(tmp.drmFD, tmp.hLSAREA, sAreaSize,
(drmAddressPtr) (&tmp.pLSAREA)) < 0) {
DRIDrvMsg(-1, X_INFO, "[drm] Mapping SAREA for DRM lock failed.\n");
tmp.pLSAREA = NULL;
goto out_err;
}
memset(tmp.pLSAREA, 0, sAreaSize);
/*
* Reserved contexts are handled by the first opened screen.
*/
tmp.resOwner = NULL;
if (!pDRIEntPriv)
pDRIEntPriv = xnfcalloc(sizeof(*pDRIEntPriv), 1);
if (!pDRIEntPriv) {
DRIDrvMsg(-1, X_INFO, "[drm] Failed to allocate memory for "
"DRM device.\n");
goto out_err;
}
*pDRIEntPriv = tmp;
xf86GetEntityPrivate((pScrn)->entityList[0], DRIEntPrivIndex)->ptr =
pDRIEntPriv;
DRIDrvMsg(-1, X_INFO, "[drm] DRM open master succeeded.\n");
return TRUE;
out_err:
DRIOpenDRMCleanup(&tmp);
return FALSE;
}
static void
DRIClipNotifyAllDrawables(ScreenPtr pScreen);
static void
dri_crtc_notify(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIClipNotifyAllDrawables(pScreen);
xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
xf86_crtc_notify(pScreen);
pDRIPriv->xf86_crtc_notify =
xf86_wrap_crtc_notify(pScreen, dri_crtc_notify);
}
static void
drmSIGIOHandler(int interrupt, void *closure)
{
unsigned long key;
void *value;
ssize_t count;
drm_ctx_t ctx;
typedef void (*_drmCallback) (int, void *, void *);
char buf[256];
drm_context_t old;
drm_context_t new;
void *oldctx;
void *newctx;
char *pt;
drmHashEntry *entry;
void *hash_table;
hash_table = drmGetHashTable();
if (!hash_table)
return;
if (drmHashFirst(hash_table, &key, &value)) {
entry = value;
do {
if ((count = read(entry->fd, buf, sizeof(buf) - 1)) > 0) {
buf[count] = '\0';
for (pt = buf; *pt != ' '; ++pt); /* Find first space */
++pt;
old = strtol(pt, &pt, 0);
new = strtol(pt, NULL, 0);
oldctx = drmGetContextTag(entry->fd, old);
newctx = drmGetContextTag(entry->fd, new);
((_drmCallback) entry->f) (entry->fd, oldctx, newctx);
ctx.handle = new;
ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
}
} while (drmHashNext(hash_table, &key, &value));
}
}
static int
drmInstallSIGIOHandler(int fd, void (*f) (int, void *, void *))
{
drmHashEntry *entry;
entry = drmGetEntry(fd);
entry->f = f;
return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
}
static int
drmRemoveSIGIOHandler(int fd)
{
drmHashEntry *entry = drmGetEntry(fd);
entry->f = NULL;
return xf86RemoveSIGIOHandler(fd);
}
Bool
2003-11-14 17:48:57 +01:00
DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
{
DRIScreenPrivPtr pDRIPriv;
drm_context_t *reserved;
int reserved_count;
int i;
DRIEntPrivPtr pDRIEntPriv;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
DRIContextFlags flags = 0;
DRIContextPrivPtr pDRIContextPriv;
static Bool drm_server_inited;
2003-11-14 17:48:57 +01:00
/* If the DRI extension is disabled, do not initialize the DRI */
if (noXFree86DRIExtension) {
DRIDrvMsg(pScreen->myNum, X_WARNING,
"Direct rendering has been disabled.\n");
return FALSE;
}
if (!xf86VGAarbiterAllowDRI(pScreen)) {
DRIDrvMsg(pScreen->myNum, X_WARNING,
"Direct rendering is not supported when VGA arb is necessary for the device\n");
return FALSE;
}
#ifdef PANORAMIX
2003-11-14 17:48:57 +01:00
/*
* If Xinerama is on, don't allow DRI to initialise. It won't be usable
* anyway.
*/
if (!noPanoramiXExtension) {
DRIDrvMsg(pScreen->myNum, X_WARNING,
"Direct rendering is not supported when Xinerama is enabled\n");
return FALSE;
}
#endif
if (drm_server_inited == FALSE) {
drmSetServerInfo(&DRIDRMServerInfo);
drm_server_inited = TRUE;
}
2003-11-14 17:48:57 +01:00
if (!DRIOpenDRMMaster(pScrn, pDRIInfo->SAREASize,
pDRIInfo->busIdString, pDRIInfo->drmDriverName))
return FALSE;
2004-06-16 11:25:21 +02:00
pDRIEntPriv = DRI_ENT_PRIV(pScrn);
2003-11-14 17:48:57 +01:00
if (DRIGeneration != serverGeneration)
DRIGeneration = serverGeneration;
if (!dixRegisterPrivateKey(&DRIScreenPrivKeyRec, PRIVATE_SCREEN, 0))
return FALSE;
if (!dixRegisterPrivateKey(&DRIWindowPrivKeyRec, PRIVATE_WINDOW, 0))
return FALSE;
pDRIPriv = (DRIScreenPrivPtr) calloc(1, sizeof(DRIScreenPrivRec));
2003-11-14 17:48:57 +01:00
if (!pDRIPriv) {
dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
2003-11-14 17:48:57 +01:00
return FALSE;
}
dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, pDRIPriv);
pDRIPriv->drmFD = pDRIEntPriv->drmFD;
2003-11-14 17:48:57 +01:00
pDRIPriv->directRenderingSupport = TRUE;
pDRIPriv->pDriverInfo = pDRIInfo;
pDRIPriv->nrWindows = 0;
pDRIPriv->nrWindowsVisible = 0;
2003-11-14 17:48:57 +01:00
pDRIPriv->fullscreen = NULL;
pDRIPriv->createDummyCtx = pDRIInfo->createDummyCtx;
2003-11-14 17:48:57 +01:00
pDRIPriv->createDummyCtxPriv = pDRIInfo->createDummyCtxPriv;
pDRIPriv->grabbedDRILock = FALSE;
pDRIPriv->drmSIGIOHandlerInstalled = FALSE;
*pDRMFD = pDRIPriv->drmFD;
if (pDRIEntPriv->sAreaGrabbed || pDRIInfo->allocSarea) {
if (drmAddMap(pDRIPriv->drmFD,
0,
pDRIPriv->pDriverInfo->SAREASize,
DRM_SHM, 0, &pDRIPriv->hSAREA) < 0) {
pDRIPriv->directRenderingSupport = FALSE;
dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
drmClose(pDRIPriv->drmFD);
DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] drmAddMap failed\n");
return FALSE;
}
DRIDrvMsg(pScreen->myNum, X_INFO,
"[drm] added %d byte SAREA at %p\n",
(int) pDRIPriv->pDriverInfo->SAREASize, (void *) (uintptr_t) pDRIPriv->hSAREA);
/* Backwards compat. */
if (drmMap(pDRIPriv->drmFD,
pDRIPriv->hSAREA,
pDRIPriv->pDriverInfo->SAREASize,
(drmAddressPtr) (&pDRIPriv->pSAREA)) < 0) {
pDRIPriv->directRenderingSupport = FALSE;
dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
drmClose(pDRIPriv->drmFD);
DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] drmMap failed\n");
return FALSE;
}
DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] mapped SAREA %p to %p\n",
(void *) (uintptr_t) pDRIPriv->hSAREA, pDRIPriv->pSAREA);
memset(pDRIPriv->pSAREA, 0, pDRIPriv->pDriverInfo->SAREASize);
}
else {
DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] Using the DRM lock "
"SAREA also for drawables.\n");
pDRIPriv->hSAREA = pDRIEntPriv->hLSAREA;
pDRIPriv->pSAREA = (XF86DRISAREAPtr) pDRIEntPriv->pLSAREA;
pDRIEntPriv->sAreaGrabbed = TRUE;
2003-11-14 17:48:57 +01:00
}
pDRIPriv->hLSAREA = pDRIEntPriv->hLSAREA;
pDRIPriv->pLSAREA = pDRIEntPriv->pLSAREA;
2003-11-14 17:48:57 +01:00
if (!pDRIPriv->pDriverInfo->dontMapFrameBuffer) {
if (drmAddMap(pDRIPriv->drmFD,
(uintptr_t) pDRIPriv->pDriverInfo->
frameBufferPhysicalAddress,
pDRIPriv->pDriverInfo->frameBufferSize, DRM_FRAME_BUFFER,
0, &pDRIPriv->pDriverInfo->hFrameBuffer) < 0) {
pDRIPriv->directRenderingSupport = FALSE;
dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
drmUnmap(pDRIPriv->pSAREA, pDRIPriv->pDriverInfo->SAREASize);
drmClose(pDRIPriv->drmFD);
DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] drmAddMap failed\n");
return FALSE;
}
DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] framebuffer handle = %p\n",
(void *) (uintptr_t) pDRIPriv->pDriverInfo->hFrameBuffer);
}
else {
DRIDrvMsg(pScreen->myNum, X_INFO,
"[drm] framebuffer mapped by ddx driver\n");
2003-11-14 17:48:57 +01:00
}
if (pDRIEntPriv->resOwner == NULL) {
pDRIEntPriv->resOwner = pScreen;
/* Add tags for reserved contexts */
if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD,
&reserved_count))) {
int r;
void *tag;
for (r = 0; r < reserved_count; r++) {
tag = DRICreateContextPrivFromHandle(pScreen,
reserved[r],
DRI_CONTEXT_RESERVED);
drmAddContextTag(pDRIPriv->drmFD, reserved[r], tag);
}
drmFreeReservedContextList(reserved);
DRIDrvMsg(pScreen->myNum, X_INFO,
"[drm] added %d reserved context%s for kernel\n",
reserved_count, reserved_count > 1 ? "s" : "");
}
2003-11-14 17:48:57 +01:00
}
/* validate max drawable table entry set by driver */
if ((pDRIPriv->pDriverInfo->maxDrawableTableEntry <= 0) ||
(pDRIPriv->pDriverInfo->maxDrawableTableEntry > SAREA_MAX_DRAWABLES)) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"Invalid max drawable table size set by driver: %d\n",
pDRIPriv->pDriverInfo->maxDrawableTableEntry);
2003-11-14 17:48:57 +01:00
}
/* Initialize drawable tables (screen private and SAREA) */
for (i = 0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
pDRIPriv->DRIDrawables[i] = NULL;
pDRIPriv->pSAREA->drawableTable[i].stamp = 0;
pDRIPriv->pSAREA->drawableTable[i].flags = 0;
2003-11-14 17:48:57 +01:00
}
pDRIPriv->pLockRefCount = &pDRIEntPriv->lockRefCount;
pDRIPriv->pLockingContext = &pDRIEntPriv->lockingContext;
if (!pDRIEntPriv->keepFDOpen)
pDRIEntPriv->keepFDOpen = pDRIInfo->keepFDOpen;
pDRIEntPriv->refCount++;
/* Set up flags for DRICreateContextPriv */
2003-11-14 17:48:57 +01:00
switch (pDRIInfo->driverSwapMethod) {
case DRI_KERNEL_SWAP:
flags = DRI_CONTEXT_2DONLY;
break;
case DRI_HIDE_X_CONTEXT:
flags = DRI_CONTEXT_PRESERVED;
break;
2003-11-14 17:48:57 +01:00
}
if (!(pDRIContextPriv = DRICreateContextPriv(pScreen,
&pDRIPriv->myContext,
flags))) {
DRIDrvMsg(pScreen->myNum, X_ERROR, "failed to create server context\n");
return FALSE;
2003-11-14 17:48:57 +01:00
}
pDRIPriv->myContextPriv = pDRIContextPriv;
DRIDrvMsg(pScreen->myNum, X_INFO,
"X context handle = %p\n", (void *) (uintptr_t) pDRIPriv->myContext);
2003-11-14 17:48:57 +01:00
/* Now that we have created the X server's context, we can grab the
* hardware lock for the X server.
*/
DRILock(pScreen, 0);
pDRIPriv->grabbedDRILock = TRUE;
/* pointers so that we can prevent memory leaks later */
pDRIPriv->hiddenContextStore = NULL;
2003-11-14 17:48:57 +01:00
pDRIPriv->partial3DContextStore = NULL;
switch (pDRIInfo->driverSwapMethod) {
2003-11-14 17:48:57 +01:00
case DRI_HIDE_X_CONTEXT:
/* Server will handle 3D swaps, and hide 2D swaps from kernel.
* Register server context as a preserved context.
*/
/* allocate memory for hidden context store */
pDRIPriv->hiddenContextStore
= (void *) calloc(1, pDRIInfo->contextSize);
if (!pDRIPriv->hiddenContextStore) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"failed to allocate hidden context\n");
DRIDestroyContextPriv(pDRIContextPriv);
return FALSE;
}
/* allocate memory for partial 3D context store */
pDRIPriv->partial3DContextStore
= (void *) calloc(1, pDRIInfo->contextSize);
if (!pDRIPriv->partial3DContextStore) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[DRI] failed to allocate partial 3D context\n");
free(pDRIPriv->hiddenContextStore);
DRIDestroyContextPriv(pDRIContextPriv);
return FALSE;
}
/* save initial context store */
if (pDRIInfo->SwapContext) {
(*pDRIInfo->SwapContext) (pScreen,
DRI_NO_SYNC,
DRI_2D_CONTEXT,
pDRIPriv->hiddenContextStore,
DRI_NO_CONTEXT, NULL);
}
/* fall through */
2003-11-14 17:48:57 +01:00
case DRI_SERVER_SWAP:
/* For swap methods of DRI_SERVER_SWAP and DRI_HIDE_X_CONTEXT
* setup signal handler for receiving swap requests from kernel
*/
if (!(pDRIPriv->drmSIGIOHandlerInstalled =
drmInstallSIGIOHandler(pDRIPriv->drmFD, DRISwapContext))) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[drm] failed to setup DRM signal handler\n");
free(pDRIPriv->hiddenContextStore);
free(pDRIPriv->partial3DContextStore);
DRIDestroyContextPriv(pDRIContextPriv);
return FALSE;
}
else {
DRIDrvMsg(pScreen->myNum, X_INFO,
"[drm] installed DRM signal handler\n");
}
2003-11-14 17:48:57 +01:00
default:
break;
2003-11-14 17:48:57 +01:00
}
return TRUE;
}
Bool
DRIFinishScreenInit(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
2003-11-14 17:48:57 +01:00
/* Wrap DRI support */
if (pDRIInfo->wrap.WindowExposures) {
pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
pScreen->WindowExposures = pDRIInfo->wrap.WindowExposures;
2003-11-14 17:48:57 +01:00
}
pDRIPriv->DestroyWindow = pScreen->DestroyWindow;
pScreen->DestroyWindow = DRIDestroyWindow;
pDRIPriv->xf86_crtc_notify = xf86_wrap_crtc_notify(pScreen,
dri_crtc_notify);
2003-11-14 17:48:57 +01:00
if (pDRIInfo->wrap.CopyWindow) {
pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
pScreen->CopyWindow = pDRIInfo->wrap.CopyWindow;
2003-11-14 17:48:57 +01:00
}
if (pDRIInfo->wrap.ClipNotify) {
pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
pScreen->ClipNotify = pDRIInfo->wrap.ClipNotify;
2003-11-14 17:48:57 +01:00
}
if (pDRIInfo->wrap.AdjustFrame) {
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
pDRIPriv->wrap.AdjustFrame = pScrn->AdjustFrame;
pScrn->AdjustFrame = pDRIInfo->wrap.AdjustFrame;
2003-11-14 17:48:57 +01:00
}
pDRIPriv->wrapped = TRUE;
DRIDrvMsg(pScreen->myNum, X_INFO, "[DRI] installation complete\n");
return TRUE;
}
void
2003-11-14 17:48:57 +01:00
DRICloseScreen(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIInfoPtr pDRIInfo;
drm_context_t *reserved;
int reserved_count;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
DRIEntPrivPtr pDRIEntPriv = DRI_ENT_PRIV(pScrn);
Bool closeMaster;
2003-11-14 17:48:57 +01:00
if (pDRIPriv) {
2003-11-14 17:48:57 +01:00
pDRIInfo = pDRIPriv->pDriverInfo;
if (pDRIPriv->wrapped) {
/* Unwrap DRI Functions */
if (pDRIInfo->wrap.WindowExposures) {
pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
pDRIPriv->wrap.WindowExposures = NULL;
}
if (pDRIPriv->DestroyWindow) {
pScreen->DestroyWindow = pDRIPriv->DestroyWindow;
pDRIPriv->DestroyWindow = NULL;
}
xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
if (pDRIInfo->wrap.CopyWindow) {
pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
pDRIPriv->wrap.CopyWindow = NULL;
}
if (pDRIInfo->wrap.ClipNotify) {
pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
pDRIPriv->wrap.ClipNotify = NULL;
}
if (pDRIInfo->wrap.AdjustFrame) {
ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
scrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame;
pDRIPriv->wrap.AdjustFrame = NULL;
}
pDRIPriv->wrapped = FALSE;
}
if (pDRIPriv->drmSIGIOHandlerInstalled) {
if (!drmRemoveSIGIOHandler(pDRIPriv->drmFD)) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[drm] failed to remove DRM signal handler\n");
}
}
2003-11-14 17:48:57 +01:00
if (pDRIPriv->dummyCtxPriv && pDRIPriv->createDummyCtx) {
DRIDestroyDummyContext(pScreen, pDRIPriv->createDummyCtxPriv);
}
if (!DRIDestroyContextPriv(pDRIPriv->myContextPriv)) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"failed to destroy server context\n");
}
/* Remove tags for reserved contexts */
if (pDRIEntPriv->resOwner == pScreen) {
pDRIEntPriv->resOwner = NULL;
if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD,
&reserved_count))) {
int i;
for (i = 0; i < reserved_count; i++) {
DRIDestroyContextPriv(drmGetContextTag(pDRIPriv->drmFD,
reserved[i]));
}
drmFreeReservedContextList(reserved);
DRIDrvMsg(pScreen->myNum, X_INFO,
"[drm] removed %d reserved context%s for kernel\n",
reserved_count, reserved_count > 1 ? "s" : "");
}
}
/* Make sure signals get unblocked etc. */
drmUnlock(pDRIPriv->drmFD, pDRIPriv->myContext);
pDRIPriv->pLockRefCount = NULL;
closeMaster = (--pDRIEntPriv->refCount == 0) &&
!pDRIEntPriv->keepFDOpen;
if (closeMaster || pDRIPriv->hSAREA != pDRIEntPriv->hLSAREA) {
DRIDrvMsg(pScreen->myNum, X_INFO,
"[drm] unmapping %d bytes of SAREA %p at %p\n",
(int) pDRIInfo->SAREASize, (void *) (uintptr_t) pDRIPriv->hSAREA, pDRIPriv->pSAREA);
if (drmUnmap(pDRIPriv->pSAREA, pDRIInfo->SAREASize)) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[drm] unable to unmap %d bytes"
" of SAREA %p at %p\n",
(int) pDRIInfo->SAREASize,
(void *) (uintptr_t) pDRIPriv->hSAREA, pDRIPriv->pSAREA);
}
}
else {
pDRIEntPriv->sAreaGrabbed = FALSE;
}
if (closeMaster || (pDRIEntPriv->drmFD != pDRIPriv->drmFD)) {
drmClose(pDRIPriv->drmFD);
if (pDRIEntPriv->drmFD == pDRIPriv->drmFD) {
DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] Closed DRM master.\n");
pDRIEntPriv->drmFD = -1;
}
}
free(pDRIPriv);
dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
2003-11-14 17:48:57 +01:00
}
}
#define DRM_MSG_VERBOSITY 3
static int
dri_drm_debug_print(const char *format, va_list ap)
_X_ATTRIBUTE_PRINTF(1,0);
static int
dri_drm_debug_print(const char *format, va_list ap)
{
xf86VDrvMsgVerb(-1, X_NONE, DRM_MSG_VERBOSITY, format, ap);
return 0;
}
static void
dri_drm_get_perms(gid_t * group, mode_t * mode)
{
*group = xf86ConfigDRI.group;
*mode = xf86ConfigDRI.mode;
}
drmServerInfo DRIDRMServerInfo = {
dri_drm_debug_print,
xf86LoadKernelModule,
dri_drm_get_perms,
};
Bool
2003-11-14 17:48:57 +01:00
DRIExtensionInit(void)
{
if (DRIGeneration != serverGeneration) {
return FALSE;
2003-11-14 17:48:57 +01:00
}
DRIDrawablePrivResType = CreateNewResourceType(DRIDrawablePrivDelete,
"DRIDrawable");
DRIContextPrivResType = CreateNewResourceType(DRIContextPrivDelete,
"DRIContext");
2003-11-14 17:48:57 +01:00
if (!DRIDrawablePrivResType || !DRIContextPrivResType)
return FALSE;
2003-11-14 17:48:57 +01:00
RegisterBlockAndWakeupHandlers(DRIBlockHandler, DRIWakeupHandler, NULL);
return TRUE;
}
void
2003-11-14 17:48:57 +01:00
DRIReset(void)
{
/*
* This stub routine is called when the X Server recycles, resources
* allocated by DRIExtensionInit need to be managed here.
*
* Currently this routine is a stub because all the interesting resources
* are managed via the screen init process.
*/
}
Bool
DRIQueryDirectRenderingCapable(ScreenPtr pScreen, Bool *isCapable)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (pDRIPriv)
*isCapable = pDRIPriv->directRenderingSupport;
2003-11-14 17:48:57 +01:00
else
*isCapable = FALSE;
2003-11-14 17:48:57 +01:00
return TRUE;
}
Bool
2004-06-16 11:25:21 +02:00
DRIOpenConnection(ScreenPtr pScreen, drm_handle_t * hSAREA, char **busIdString)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
*hSAREA = pDRIPriv->hSAREA;
*busIdString = pDRIPriv->pDriverInfo->busIdString;
2003-11-14 17:48:57 +01:00
return TRUE;
}
Bool
2004-06-16 11:25:21 +02:00
DRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (drmAuthMagic(pDRIPriv->drmFD, magic))
return FALSE;
2003-11-14 17:48:57 +01:00
return TRUE;
}
Bool
2003-11-14 17:48:57 +01:00
DRICloseConnection(ScreenPtr pScreen)
{
return TRUE;
}
Bool
2003-11-14 17:48:57 +01:00
DRIGetClientDriverName(ScreenPtr pScreen,
int *ddxDriverMajorVersion,
int *ddxDriverMinorVersion,
int *ddxDriverPatchVersion, char **clientDriverName)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
*ddxDriverMajorVersion = pDRIPriv->pDriverInfo->ddxDriverMajorVersion;
*ddxDriverMinorVersion = pDRIPriv->pDriverInfo->ddxDriverMinorVersion;
*ddxDriverPatchVersion = pDRIPriv->pDriverInfo->ddxDriverPatchVersion;
*clientDriverName = pDRIPriv->pDriverInfo->clientDriverName;
2003-11-14 17:48:57 +01:00
return TRUE;
}
/* DRICreateContextPriv and DRICreateContextPrivFromHandle are helper
functions that layer on drmCreateContext and drmAddContextTag.
2004-06-16 11:25:21 +02:00
DRICreateContextPriv always creates a kernel drm_context_t and then calls
2003-11-14 17:48:57 +01:00
DRICreateContextPrivFromHandle to create a DRIContextPriv structure for
2004-06-16 11:25:21 +02:00
DRI tracking. For the SIGIO handler, the drm_context_t is associated with
2003-11-14 17:48:57 +01:00
DRIContextPrivPtr. Any special flags are stored in the DRIContextPriv
area and are passed to the kernel (if necessary).
DRICreateContextPriv returns a pointer to newly allocated
2004-06-16 11:25:21 +02:00
DRIContextPriv, and returns the kernel drm_context_t in pHWContext. */
2003-11-14 17:48:57 +01:00
DRIContextPrivPtr
2003-11-14 17:48:57 +01:00
DRICreateContextPriv(ScreenPtr pScreen,
drm_context_t * pHWContext, DRIContextFlags flags)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
2003-11-14 17:48:57 +01:00
if (drmCreateContext(pDRIPriv->drmFD, pHWContext)) {
return NULL;
2003-11-14 17:48:57 +01:00
}
return DRICreateContextPrivFromHandle(pScreen, *pHWContext, flags);
}
DRIContextPrivPtr
2003-11-14 17:48:57 +01:00
DRICreateContextPrivFromHandle(ScreenPtr pScreen,
drm_context_t hHWContext, DRIContextFlags flags)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
2003-11-14 17:48:57 +01:00
DRIContextPrivPtr pDRIContextPriv;
int contextPrivSize;
2003-11-14 17:48:57 +01:00
contextPrivSize = sizeof(DRIContextPrivRec) +
pDRIPriv->pDriverInfo->contextSize;
if (!(pDRIContextPriv = calloc(1, contextPrivSize))) {
return NULL;
2003-11-14 17:48:57 +01:00
}
pDRIContextPriv->pContextStore = (void *) (pDRIContextPriv + 1);
2003-11-14 17:48:57 +01:00
drmAddContextTag(pDRIPriv->drmFD, hHWContext, pDRIContextPriv);
pDRIContextPriv->hwContext = hHWContext;
pDRIContextPriv->pScreen = pScreen;
pDRIContextPriv->flags = flags;
pDRIContextPriv->valid3D = FALSE;
2003-11-14 17:48:57 +01:00
if (flags & DRI_CONTEXT_2DONLY) {
if (drmSetContextFlags(pDRIPriv->drmFD, hHWContext, DRM_CONTEXT_2DONLY)) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[drm] failed to set 2D context flag\n");
DRIDestroyContextPriv(pDRIContextPriv);
return NULL;
}
2003-11-14 17:48:57 +01:00
}
if (flags & DRI_CONTEXT_PRESERVED) {
if (drmSetContextFlags(pDRIPriv->drmFD,
hHWContext, DRM_CONTEXT_PRESERVED)) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[drm] failed to set preserved flag\n");
DRIDestroyContextPriv(pDRIContextPriv);
return NULL;
}
2003-11-14 17:48:57 +01:00
}
return pDRIContextPriv;
}
Bool
2003-11-14 17:48:57 +01:00
DRIDestroyContextPriv(DRIContextPrivPtr pDRIContextPriv)
{
DRIScreenPrivPtr pDRIPriv;
if (!pDRIContextPriv)
return TRUE;
2003-11-14 17:48:57 +01:00
pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
if (!(pDRIContextPriv->flags & DRI_CONTEXT_RESERVED)) {
/* Don't delete reserved contexts from
kernel area -- the kernel manages its
reserved contexts itself. */
if (drmDestroyContext(pDRIPriv->drmFD, pDRIContextPriv->hwContext))
return FALSE;
}
/* Remove the tag last to prevent a race
condition where the context has pending
buffers. The context can't be re-used
while in this thread, but buffers can be
dispatched asynchronously. */
2003-11-14 17:48:57 +01:00
drmDelContextTag(pDRIPriv->drmFD, pDRIContextPriv->hwContext);
free(pDRIContextPriv);
2003-11-14 17:48:57 +01:00
return TRUE;
}
static Bool
DRICreateDummyContext(ScreenPtr pScreen, Bool needCtxPriv)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIContextPrivPtr pDRIContextPriv;
void *contextStore;
if (!(pDRIContextPriv =
DRICreateContextPriv(pScreen, &pDRIPriv->pSAREA->dummy_context, 0))) {
return FALSE;
2003-11-14 17:48:57 +01:00
}
contextStore = DRIGetContextStore(pDRIContextPriv);
if (pDRIPriv->pDriverInfo->CreateContext && needCtxPriv) {
if (!pDRIPriv->pDriverInfo->CreateContext(pScreen, NULL,
pDRIPriv->pSAREA->
dummy_context, NULL,
(DRIContextType) (long)
contextStore)) {
DRIDestroyContextPriv(pDRIContextPriv);
return FALSE;
}
2003-11-14 17:48:57 +01:00
}
pDRIPriv->dummyCtxPriv = pDRIContextPriv;
return TRUE;
}
static void
DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIContextPrivPtr pDRIContextPriv = pDRIPriv->dummyCtxPriv;
void *contextStore;
if (!pDRIContextPriv)
return;
2003-11-14 17:48:57 +01:00
if (pDRIPriv->pDriverInfo->DestroyContext && hasCtxPriv) {
contextStore = DRIGetContextStore(pDRIContextPriv);
pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
pDRIContextPriv->hwContext,
(DRIContextType) (long)
contextStore);
2003-11-14 17:48:57 +01:00
}
DRIDestroyContextPriv(pDRIPriv->dummyCtxPriv);
pDRIPriv->dummyCtxPriv = NULL;
}
Bool
2003-11-14 17:48:57 +01:00
DRICreateContext(ScreenPtr pScreen, VisualPtr visual,
2004-06-16 11:25:21 +02:00
XID context, drm_context_t * pHWContext)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIContextPrivPtr pDRIContextPriv;
void *contextStore;
if (pDRIPriv->createDummyCtx && !pDRIPriv->dummyCtxPriv) {
if (!DRICreateDummyContext(pScreen, pDRIPriv->createDummyCtxPriv)) {
DRIDrvMsg(pScreen->myNum, X_INFO,
"[drm] Could not create dummy context\n");
return FALSE;
}
2003-11-14 17:48:57 +01:00
}
if (!(pDRIContextPriv = DRICreateContextPriv(pScreen, pHWContext, 0))) {
return FALSE;
2003-11-14 17:48:57 +01:00
}
contextStore = DRIGetContextStore(pDRIContextPriv);
if (pDRIPriv->pDriverInfo->CreateContext) {
if (!((*pDRIPriv->pDriverInfo->CreateContext) (pScreen, NULL,
*pHWContext, NULL,
(DRIContextType) (long)
contextStore))) {
DRIDestroyContextPriv(pDRIContextPriv);
return FALSE;
}
2003-11-14 17:48:57 +01:00
}
/* track this in case the client dies before cleanup */
if (!AddResource(context, DRIContextPrivResType, (void *) pDRIContextPriv))
return FALSE;
2003-11-14 17:48:57 +01:00
return TRUE;
}
Bool
2003-11-14 17:48:57 +01:00
DRIDestroyContext(ScreenPtr pScreen, XID context)
{
FreeResourceByType(context, DRIContextPrivResType, FALSE);
return TRUE;
}
/* DRIContextPrivDelete is called by the resource manager. */
Bool
DRIContextPrivDelete(void *pResource, XID id)
2003-11-14 17:48:57 +01:00
{
DRIContextPrivPtr pDRIContextPriv = (DRIContextPrivPtr) pResource;
2003-11-14 17:48:57 +01:00
DRIScreenPrivPtr pDRIPriv;
void *contextStore;
pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
if (pDRIPriv->pDriverInfo->DestroyContext) {
contextStore = DRIGetContextStore(pDRIContextPriv);
pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
pDRIContextPriv->hwContext,
(DRIContextType) (long)
contextStore);
2003-11-14 17:48:57 +01:00
}
return DRIDestroyContextPriv(pDRIContextPriv);
}
/* This walks the drawable timestamp array and invalidates all of them
* in the case of transition from private to shared backbuffers. It's
* not necessary for correctness, because DRIClipNotify gets called in
* time to prevent any conflict, but the transition from
* shared->private is sometimes missed if we don't do this.
*/
static void
DRIClipNotifyAllDrawables(ScreenPtr pScreen)
{
int i;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
2003-11-14 17:48:57 +01:00
for (i = 0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
pDRIPriv->pSAREA->drawableTable[i].stamp = DRIDrawableValidationStamp++;
}
2003-11-14 17:48:57 +01:00
}
static void
DRITransitionToSharedBuffers(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIClipNotifyAllDrawables(pScreen);
2003-11-14 17:48:57 +01:00
if (pDRIInfo->TransitionSingleToMulti3D)
pDRIInfo->TransitionSingleToMulti3D(pScreen);
2003-11-14 17:48:57 +01:00
}
static void
DRITransitionToPrivateBuffers(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIClipNotifyAllDrawables(pScreen);
2003-11-14 17:48:57 +01:00
if (pDRIInfo->TransitionMultiToSingle3D)
pDRIInfo->TransitionMultiToSingle3D(pScreen);
2003-11-14 17:48:57 +01:00
}
static void
DRITransitionTo3d(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIClipNotifyAllDrawables(pScreen);
2003-11-14 17:48:57 +01:00
if (pDRIInfo->TransitionTo3d)
pDRIInfo->TransitionTo3d(pScreen);
2003-11-14 17:48:57 +01:00
}
static void
DRITransitionTo2d(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIClipNotifyAllDrawables(pScreen);
2003-11-14 17:48:57 +01:00
if (pDRIInfo->TransitionTo2d)
pDRIInfo->TransitionTo2d(pScreen);
2003-11-14 17:48:57 +01:00
}
static int
DRIDCNTreeTraversal(WindowPtr pWin, void *data)
{
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
if (pDRIDrawablePriv) {
ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (RegionNumRects(&pWin->clipList) > 0) {
WindowPtr *pDRIWindows = (WindowPtr *) data;
int i = 0;
while (pDRIWindows[i])
i++;
pDRIWindows[i] = pWin;
pDRIPriv->nrWalked++;
}
if (pDRIPriv->nrWindows == pDRIPriv->nrWalked)
return WT_STOPWALKING;
}
return WT_WALKCHILDREN;
}
static void
DRIDriverClipNotify(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (pDRIPriv->pDriverInfo->ClipNotify) {
WindowPtr *pDRIWindows = calloc(sizeof(WindowPtr), pDRIPriv->nrWindows);
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
if (pDRIPriv->nrWindows > 0) {
pDRIPriv->nrWalked = 0;
TraverseTree(pScreen->root, DRIDCNTreeTraversal,
(void *) pDRIWindows);
}
pDRIInfo->ClipNotify(pScreen, pDRIWindows, pDRIPriv->nrWindows);
free(pDRIWindows);
}
}
static void
DRIIncreaseNumberVisible(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
switch (++pDRIPriv->nrWindowsVisible) {
case 1:
DRITransitionTo3d(pScreen);
break;
case 2:
DRITransitionToSharedBuffers(pScreen);
break;
default:
break;
}
DRIDriverClipNotify(pScreen);
}
static void
DRIDecreaseNumberVisible(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
switch (--pDRIPriv->nrWindowsVisible) {
case 0:
DRITransitionTo2d(pScreen);
break;
case 1:
DRITransitionToPrivateBuffers(pScreen);
break;
default:
break;
}
DRIDriverClipNotify(pScreen);
}
Bool
DRICreateDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable,
drm_drawable_t * hHWDrawable)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv;
WindowPtr pWin;
2003-11-14 17:48:57 +01:00
if (pDrawable->type == DRAWABLE_WINDOW) {
pWin = (WindowPtr) pDrawable;
if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
pDRIDrawablePriv->refCount++;
if (!pDRIDrawablePriv->hwDrawable) {
drmCreateDrawable(pDRIPriv->drmFD,
&pDRIDrawablePriv->hwDrawable);
}
}
else {
/* allocate a DRI Window Private record */
if (!(pDRIDrawablePriv = malloc(sizeof(DRIDrawablePrivRec)))) {
return FALSE;
}
/* Only create a drm_drawable_t once */
if (drmCreateDrawable(pDRIPriv->drmFD,
&pDRIDrawablePriv->hwDrawable)) {
free(pDRIDrawablePriv);
return FALSE;
}
/* add it to the list of DRI drawables for this screen */
pDRIDrawablePriv->pScreen = pScreen;
pDRIDrawablePriv->refCount = 1;
pDRIDrawablePriv->drawableIndex = -1;
pDRIDrawablePriv->nrects = RegionNumRects(&pWin->clipList);
/* save private off of preallocated index */
dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey,
pDRIDrawablePriv);
pDRIPriv->nrWindows++;
if (pDRIDrawablePriv->nrects)
DRIIncreaseNumberVisible(pScreen);
}
/* track this in case the client dies */
if (!AddResource(FakeClientID(client->index), DRIDrawablePrivResType,
(void *) (intptr_t) pDrawable->id))
return FALSE;
if (pDRIDrawablePriv->hwDrawable) {
drmUpdateDrawableInfo(pDRIPriv->drmFD,
pDRIDrawablePriv->hwDrawable,
DRM_DRAWABLE_CLIPRECTS,
RegionNumRects(&pWin->clipList),
RegionRects(&pWin->clipList));
*hHWDrawable = pDRIDrawablePriv->hwDrawable;
}
}
else if (pDrawable->type != DRAWABLE_PIXMAP) { /* PBuffer */
/* NOT_DONE */
return FALSE;
2003-11-14 17:48:57 +01:00
}
return TRUE;
}
static void
DRIDrawablePrivDestroy(WindowPtr pWin)
2003-11-14 17:48:57 +01:00
{
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
ScreenPtr pScreen;
DRIScreenPrivPtr pDRIPriv;
if (!pDRIDrawablePriv)
return;
pScreen = pWin->drawable.pScreen;
pDRIPriv = DRI_SCREEN_PRIV(pScreen);
2003-11-14 17:48:57 +01:00
if (pDRIDrawablePriv->drawableIndex != -1) {
/* bump stamp to force outstanding 3D requests to resync */
pDRIPriv->pSAREA->drawableTable[pDRIDrawablePriv->drawableIndex].stamp
= DRIDrawableValidationStamp++;
/* release drawable table entry */
pDRIPriv->DRIDrawables[pDRIDrawablePriv->drawableIndex] = NULL;
}
2003-11-14 17:48:57 +01:00
pDRIPriv->nrWindows--;
if (pDRIDrawablePriv->nrects)
DRIDecreaseNumberVisible(pScreen);
drmDestroyDrawable(pDRIPriv->drmFD, pDRIDrawablePriv->hwDrawable);
free(pDRIDrawablePriv);
dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, NULL);
}
2003-11-14 17:48:57 +01:00
static Bool
DRIDestroyDrawableCB(void *value, XID id, void *data)
{
if (value == data) {
/* This calls back DRIDrawablePrivDelete which frees private area */
FreeResourceByType(id, DRIDrawablePrivResType, FALSE);
2003-11-14 17:48:57 +01:00
return TRUE;
}
return FALSE;
}
Bool
DRIDestroyDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable)
{
2003-11-14 17:48:57 +01:00
if (pDrawable->type == DRAWABLE_WINDOW) {
LookupClientResourceComplex(client, DRIDrawablePrivResType,
DRIDestroyDrawableCB,
(void *) (intptr_t) pDrawable->id);
2003-11-14 17:48:57 +01:00
}
else { /* pixmap (or for GLX 1.3, a PBuffer) */
/* NOT_DONE */
return FALSE;
2003-11-14 17:48:57 +01:00
}
return TRUE;
}
Bool
DRIDrawablePrivDelete(void *pResource, XID id)
2003-11-14 17:48:57 +01:00
{
WindowPtr pWin;
int rc;
2003-11-14 17:48:57 +01:00
/* For DRIDrawablePrivResType, the XID is the client's fake ID. The
* important XID is the value in pResource. */
id = (XID) (intptr_t) pResource;
rc = dixLookupWindow(&pWin, id, serverClient, DixGetAttrAccess);
2003-11-14 17:48:57 +01:00
if (rc == Success) {
DRIDrawablePrivPtr pDRIDrwPriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
2003-11-14 17:48:57 +01:00
if (!pDRIDrwPriv)
return FALSE;
2003-11-14 17:48:57 +01:00
if (--pDRIDrwPriv->refCount == 0)
DRIDrawablePrivDestroy(pWin);
return TRUE;
2003-11-14 17:48:57 +01:00
}
else { /* pixmap (or for GLX 1.3, a PBuffer) */
/* NOT_DONE */
return FALSE;
2003-11-14 17:48:57 +01:00
}
}
Bool
2003-11-14 17:48:57 +01:00
DRIGetDrawableInfo(ScreenPtr pScreen,
DrawablePtr pDrawable,
unsigned int *index,
unsigned int *stamp,
int *X,
int *Y,
int *W,
int *H,
int *numClipRects,
2004-06-16 11:25:21 +02:00
drm_clip_rect_t ** pClipRects,
int *backX,
int *backY,
int *numBackClipRects, drm_clip_rect_t ** pBackClipRects)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv, pOldDrawPriv;
WindowPtr pWin, pOldWin;
int i;
2003-11-14 17:48:57 +01:00
2006-03-29 03:05:09 +02:00
#if 0
printf("maxDrawableTableEntry = %d\n",
pDRIPriv->pDriverInfo->maxDrawableTableEntry);
2006-03-29 03:05:09 +02:00
#endif
2003-11-14 17:48:57 +01:00
if (pDrawable->type == DRAWABLE_WINDOW) {
pWin = (WindowPtr) pDrawable;
if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
/* Manage drawable table */
if (pDRIDrawablePriv->drawableIndex == -1) { /* load SAREA table */
/* Search table for empty entry */
i = 0;
while (i < pDRIPriv->pDriverInfo->maxDrawableTableEntry) {
if (!(pDRIPriv->DRIDrawables[i])) {
pDRIPriv->DRIDrawables[i] = pDrawable;
pDRIDrawablePriv->drawableIndex = i;
pDRIPriv->pSAREA->drawableTable[i].stamp =
DRIDrawableValidationStamp++;
break;
}
i++;
}
/* Search table for oldest entry */
if (i == pDRIPriv->pDriverInfo->maxDrawableTableEntry) {
2003-11-14 17:48:57 +01:00
unsigned int oldestStamp = ~0;
int oldestIndex = 0;
i = pDRIPriv->pDriverInfo->maxDrawableTableEntry;
while (i--) {
if (pDRIPriv->pSAREA->drawableTable[i].stamp <
oldestStamp) {
oldestIndex = i;
oldestStamp =
pDRIPriv->pSAREA->drawableTable[i].stamp;
}
}
pDRIDrawablePriv->drawableIndex = oldestIndex;
/* release oldest drawable table entry */
pOldWin = (WindowPtr) pDRIPriv->DRIDrawables[oldestIndex];
pOldDrawPriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pOldWin);
pOldDrawPriv->drawableIndex = -1;
/* claim drawable table entry */
pDRIPriv->DRIDrawables[oldestIndex] = pDrawable;
/* validate SAREA entry */
pDRIPriv->pSAREA->drawableTable[oldestIndex].stamp =
DRIDrawableValidationStamp++;
/* check for stamp wrap around */
if (oldestStamp > DRIDrawableValidationStamp) {
/* walk SAREA table and invalidate all drawables */
for (i = 0;
2003-11-14 17:48:57 +01:00
i < pDRIPriv->pDriverInfo->maxDrawableTableEntry;
i++) {
pDRIPriv->pSAREA->drawableTable[i].stamp =
DRIDrawableValidationStamp++;
}
}
}
/* If the driver wants to be notified when the index is
* set for a drawable, let it know now.
*/
if (pDRIPriv->pDriverInfo->SetDrawableIndex)
pDRIPriv->pDriverInfo->SetDrawableIndex(pWin,
pDRIDrawablePriv->
drawableIndex);
/* reinit drawable ID if window is visible */
if ((pWin->viewable) &&
(pDRIPriv->pDriverInfo->bufferRequests != DRI_NO_WINDOWS)) {
(*pDRIPriv->pDriverInfo->InitBuffers) (pWin,
&pWin->clipList,
pDRIDrawablePriv->
drawableIndex);
}
}
*index = pDRIDrawablePriv->drawableIndex;
*stamp = pDRIPriv->pSAREA->drawableTable[*index].stamp;
*X = (int) (pWin->drawable.x);
*Y = (int) (pWin->drawable.y);
*W = (int) (pWin->drawable.width);
*H = (int) (pWin->drawable.height);
*numClipRects = RegionNumRects(&pWin->clipList);
*pClipRects = (drm_clip_rect_t *) RegionRects(&pWin->clipList);
if (!*numClipRects && pDRIPriv->fullscreen) {
/* use fake full-screen clip rect */
pDRIPriv->fullscreen_rect.x1 = *X;
pDRIPriv->fullscreen_rect.y1 = *Y;
pDRIPriv->fullscreen_rect.x2 = *X + *W;
pDRIPriv->fullscreen_rect.y2 = *Y + *H;
*numClipRects = 1;
*pClipRects = &pDRIPriv->fullscreen_rect;
}
*backX = *X;
*backY = *Y;
if (pDRIPriv->nrWindowsVisible == 1 && *numClipRects) {
/* Use a single cliprect. */
int x0 = *X;
int y0 = *Y;
int x1 = x0 + *W;
int y1 = y0 + *H;
if (x0 < 0)
x0 = 0;
if (y0 < 0)
y0 = 0;
if (x1 > pScreen->width)
x1 = pScreen->width;
if (y1 > pScreen->height)
y1 = pScreen->height;
if (y0 >= y1 || x0 >= x1) {
*numBackClipRects = 0;
*pBackClipRects = NULL;
}
else {
pDRIPriv->private_buffer_rect.x1 = x0;
pDRIPriv->private_buffer_rect.y1 = y0;
pDRIPriv->private_buffer_rect.x2 = x1;
pDRIPriv->private_buffer_rect.y2 = y1;
*numBackClipRects = 1;
*pBackClipRects = &(pDRIPriv->private_buffer_rect);
}
}
else {
/* Use the frontbuffer cliprects for back buffers. */
*numBackClipRects = 0;
*pBackClipRects = 0;
}
}
else {
/* Not a DRIDrawable */
return FALSE;
}
}
else { /* pixmap (or for GLX 1.3, a PBuffer) */
/* NOT_DONE */
return FALSE;
2003-11-14 17:48:57 +01:00
}
return TRUE;
}
Bool
2003-11-14 17:48:57 +01:00
DRIGetDeviceInfo(ScreenPtr pScreen,
2004-06-16 11:25:21 +02:00
drm_handle_t * hFrameBuffer,
int *fbOrigin,
int *fbSize,
int *fbStride, int *devPrivateSize, void **pDevPrivate)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
*hFrameBuffer = pDRIPriv->pDriverInfo->hFrameBuffer;
2003-11-14 17:48:57 +01:00
*fbOrigin = 0;
*fbSize = pDRIPriv->pDriverInfo->frameBufferSize;
*fbStride = pDRIPriv->pDriverInfo->frameBufferStride;
*devPrivateSize = pDRIPriv->pDriverInfo->devPrivateSize;
*pDevPrivate = pDRIPriv->pDriverInfo->devPrivate;
return TRUE;
}
DRIInfoPtr
2003-11-14 17:48:57 +01:00
DRICreateInfoRec(void)
{
DRIInfoPtr inforec = (DRIInfoPtr) calloc(1, sizeof(DRIInfoRec));
if (!inforec)
return NULL;
2003-11-14 17:48:57 +01:00
/* Initialize defaults */
inforec->busIdString = NULL;
/* Wrapped function defaults */
inforec->wrap.WakeupHandler = DRIDoWakeupHandler;
inforec->wrap.BlockHandler = DRIDoBlockHandler;
inforec->wrap.WindowExposures = DRIWindowExposures;
inforec->wrap.CopyWindow = DRICopyWindow;
inforec->wrap.ClipNotify = DRIClipNotify;
inforec->wrap.AdjustFrame = DRIAdjustFrame;
2003-11-14 17:48:57 +01:00
inforec->TransitionTo2d = 0;
inforec->TransitionTo3d = 0;
inforec->SetDrawableIndex = 0;
return inforec;
}
void
2003-11-14 17:48:57 +01:00
DRIDestroyInfoRec(DRIInfoPtr DRIInfo)
{
free(DRIInfo->busIdString);
free((char *) DRIInfo);
2003-11-14 17:48:57 +01:00
}
void
DRIWakeupHandler(void *wakeupData, int result)
2003-11-14 17:48:57 +01:00
{
int i;
for (i = 0; i < screenInfo.numScreens; i++) {
ScreenPtr pScreen = screenInfo.screens[i];
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
2003-11-14 17:48:57 +01:00
if (pDRIPriv && pDRIPriv->pDriverInfo->wrap.WakeupHandler)
(*pDRIPriv->pDriverInfo->wrap.WakeupHandler) (pScreen, result);
2003-11-14 17:48:57 +01:00
}
}
void
DRIBlockHandler(void *blockData, void *pTimeout)
2003-11-14 17:48:57 +01:00
{
int i;
for (i = 0; i < screenInfo.numScreens; i++) {
ScreenPtr pScreen = screenInfo.screens[i];
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
2003-11-14 17:48:57 +01:00
if (pDRIPriv && pDRIPriv->pDriverInfo->wrap.BlockHandler)
(*pDRIPriv->pDriverInfo->wrap.BlockHandler) (pScreen, pTimeout);
2003-11-14 17:48:57 +01:00
}
}
void
DRIDoWakeupHandler(ScreenPtr pScreen, int result)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRILock(pScreen, 0);
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
/* hide X context by swapping 2D component here */
(*pDRIPriv->pDriverInfo->SwapContext) (pScreen,
DRI_3D_SYNC,
DRI_2D_CONTEXT,
pDRIPriv->partial3DContextStore,
DRI_2D_CONTEXT,
pDRIPriv->hiddenContextStore);
2003-11-14 17:48:57 +01:00
}
}
void
DRIDoBlockHandler(ScreenPtr pScreen, void *timeout)
2003-11-14 17:48:57 +01:00
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
/* hide X context by swapping 2D component here */
(*pDRIPriv->pDriverInfo->SwapContext) (pScreen,
DRI_2D_SYNC,
DRI_NO_CONTEXT,
NULL,
DRI_2D_CONTEXT,
pDRIPriv->partial3DContextStore);
2003-11-14 17:48:57 +01:00
}
if (pDRIPriv->windowsTouched)
DRM_SPINUNLOCK(&pDRIPriv->pSAREA->drawable_lock, 1);
pDRIPriv->windowsTouched = FALSE;
2003-11-14 17:48:57 +01:00
DRIUnlock(pScreen);
}
void
2003-11-14 17:48:57 +01:00
DRISwapContext(int drmFD, void *oldctx, void *newctx)
{
DRIContextPrivPtr oldContext = (DRIContextPrivPtr) oldctx;
DRIContextPrivPtr newContext = (DRIContextPrivPtr) newctx;
ScreenPtr pScreen = newContext->pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
void *oldContextStore = NULL;
DRIContextType oldContextType;
void *newContextStore = NULL;
DRIContextType newContextType;
DRISyncType syncType;
2003-11-14 17:48:57 +01:00
#ifdef DEBUG
static int count = 0;
2003-11-14 17:48:57 +01:00
if (!newContext) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[DRI] Context Switch Error: oldContext=%p, newContext=%p\n",
oldContext, newContext);
return;
2003-11-14 17:48:57 +01:00
}
/* useful for debugging, just print out after n context switches */
2003-11-14 17:48:57 +01:00
if (!count || !(count % 1)) {
DRIDrvMsg(pScreen->myNum, X_INFO,
"[DRI] Context switch %5d from %p/0x%08x (%d)\n",
count,
oldContext,
oldContext ? oldContext->flags : 0,
oldContext ? oldContext->hwContext : -1);
DRIDrvMsg(pScreen->myNum, X_INFO,
"[DRI] Context switch %5d to %p/0x%08x (%d)\n",
count,
newContext,
newContext ? newContext->flags : 0,
newContext ? newContext->hwContext : -1);
2003-11-14 17:48:57 +01:00
}
++count;
#endif
if (!pDRIPriv->pDriverInfo->SwapContext) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[DRI] DDX driver missing context swap call back\n");
return;
2003-11-14 17:48:57 +01:00
}
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
/* only 3D contexts are swapped in this case */
if (oldContext) {
oldContextStore = DRIGetContextStore(oldContext);
oldContext->valid3D = TRUE;
oldContextType = DRI_3D_CONTEXT;
}
else {
oldContextType = DRI_NO_CONTEXT;
}
newContextStore = DRIGetContextStore(newContext);
if ((newContext->valid3D) &&
(newContext->hwContext != pDRIPriv->myContext)) {
newContextType = DRI_3D_CONTEXT;
}
else {
newContextType = DRI_2D_CONTEXT;
}
syncType = DRI_3D_SYNC;
}
else { /* default: driverSwapMethod == DRI_SERVER_SWAP */
2003-11-14 17:48:57 +01:00
/* optimize 2D context swaps */
if (newContext->flags & DRI_CONTEXT_2DONLY) {
/* go from 3D context to 2D context and only save 2D
2003-11-14 17:48:57 +01:00
* subset of 3D state
*/
oldContextStore = DRIGetContextStore(oldContext);
oldContextType = DRI_2D_CONTEXT;
newContextStore = DRIGetContextStore(newContext);
newContextType = DRI_2D_CONTEXT;
syncType = DRI_3D_SYNC;
pDRIPriv->lastPartial3DContext = oldContext;
}
else if (oldContext->flags & DRI_CONTEXT_2DONLY) {
if (pDRIPriv->lastPartial3DContext == newContext) {
/* go from 2D context back to previous 3D context and
* only restore 2D subset of previous 3D state
*/
oldContextStore = DRIGetContextStore(oldContext);
oldContextType = DRI_2D_CONTEXT;
newContextStore = DRIGetContextStore(newContext);
newContextType = DRI_2D_CONTEXT;
syncType = DRI_2D_SYNC;
}
else {
/* go from 2D context to a different 3D context */
/* call DDX driver to do partial restore */
oldContextStore = DRIGetContextStore(oldContext);
newContextStore =
DRIGetContextStore(pDRIPriv->lastPartial3DContext);
(*pDRIPriv->pDriverInfo->SwapContext) (pScreen,
DRI_2D_SYNC,
DRI_2D_CONTEXT,
oldContextStore,
DRI_2D_CONTEXT,
newContextStore);
/* now setup for a complete 3D swap */
oldContextStore = newContextStore;
oldContext->valid3D = TRUE;
oldContextType = DRI_3D_CONTEXT;
newContextStore = DRIGetContextStore(newContext);
if ((newContext->valid3D) &&
(newContext->hwContext != pDRIPriv->myContext)) {
newContextType = DRI_3D_CONTEXT;
}
else {
newContextType = DRI_2D_CONTEXT;
}
syncType = DRI_NO_SYNC;
}
}
else {
/* now setup for a complete 3D swap */
oldContextStore = newContextStore;
oldContext->valid3D = TRUE;
oldContextType = DRI_3D_CONTEXT;
newContextStore = DRIGetContextStore(newContext);
if ((newContext->valid3D) &&
(newContext->hwContext != pDRIPriv->myContext)) {
newContextType = DRI_3D_CONTEXT;
}
else {
newContextType = DRI_2D_CONTEXT;
}
syncType = DRI_3D_SYNC;
}
2003-11-14 17:48:57 +01:00
}
/* call DDX driver to perform the swap */
(*pDRIPriv->pDriverInfo->SwapContext) (pScreen,
syncType,
oldContextType,
oldContextStore,
newContextType, newContextStore);
2003-11-14 17:48:57 +01:00
}
void *
2003-11-14 17:48:57 +01:00
DRIGetContextStore(DRIContextPrivPtr context)
{
return ((void *) context->pContextStore);
2003-11-14 17:48:57 +01:00
}
void
DRIWindowExposures(WindowPtr pWin, RegionPtr prgn)
2003-11-14 17:48:57 +01:00
{
ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
if (pDRIDrawablePriv) {
(*pDRIPriv->pDriverInfo->InitBuffers) (pWin, prgn,
2003-11-14 17:48:57 +01:00
pDRIDrawablePriv->drawableIndex);
}
/* call lower wrapped functions */
if (pDRIPriv && pDRIPriv->wrap.WindowExposures) {
/* unwrap */
pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
2003-11-14 17:48:57 +01:00
/* call lower layers */
(*pScreen->WindowExposures) (pWin, prgn);
2003-11-14 17:48:57 +01:00
/* rewrap */
pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
pScreen->WindowExposures = DRIWindowExposures;
2003-11-14 17:48:57 +01:00
}
}
static int
DRITreeTraversal(WindowPtr pWin, void *data)
2003-11-14 17:48:57 +01:00
{
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
if (pDRIDrawablePriv) {
2003-11-14 17:48:57 +01:00
ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (RegionNumRects(&(pWin->clipList)) > 0) {
RegionPtr reg = (RegionPtr) data;
2003-11-14 17:48:57 +01:00
RegionUnion(reg, reg, &(pWin->clipList));
pDRIPriv->nrWalked++;
}
2003-11-14 17:48:57 +01:00
if (pDRIPriv->nrWindows == pDRIPriv->nrWalked)
return WT_STOPWALKING;
2003-11-14 17:48:57 +01:00
}
return WT_WALKCHILDREN;
}
Bool
DRIDestroyWindow(WindowPtr pWin)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Bool retval = TRUE;
DRIDrawablePrivDestroy(pWin);
/* call lower wrapped functions */
if (pDRIPriv->DestroyWindow) {
/* unwrap */
pScreen->DestroyWindow = pDRIPriv->DestroyWindow;
/* call lower layers */
retval = (*pScreen->DestroyWindow) (pWin);
/* rewrap */
pDRIPriv->DestroyWindow = pScreen->DestroyWindow;
pScreen->DestroyWindow = DRIDestroyWindow;
}
return retval;
}
void
2003-11-14 17:48:57 +01:00
DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
2003-11-14 17:48:57 +01:00
if (pDRIPriv->nrWindowsVisible > 0) {
RegionRec reg;
2003-11-14 17:48:57 +01:00
RegionNull(&reg);
pDRIPriv->nrWalked = 0;
TraverseTree(pWin, DRITreeTraversal, (void *) (&reg));
2003-11-14 17:48:57 +01:00
if (RegionNotEmpty(&reg)) {
RegionTranslate(&reg, ptOldOrg.x - pWin->drawable.x,
ptOldOrg.y - pWin->drawable.y);
RegionIntersect(&reg, &reg, prgnSrc);
2003-11-14 17:48:57 +01:00
/* The MoveBuffers interface is not ideal */
(*pDRIPriv->pDriverInfo->MoveBuffers) (pWin, ptOldOrg, &reg,
pDRIPriv->pDriverInfo->
ddxDrawableTableEntry);
}
2003-11-14 17:48:57 +01:00
RegionUninit(&reg);
2003-11-14 17:48:57 +01:00
}
/* call lower wrapped functions */
if (pDRIPriv->wrap.CopyWindow) {
/* unwrap */
pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
2003-11-14 17:48:57 +01:00
/* call lower layers */
(*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc);
2003-11-14 17:48:57 +01:00
/* rewrap */
pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
pScreen->CopyWindow = DRICopyWindow;
2003-11-14 17:48:57 +01:00
}
}
static void
DRIGetSecs(long *secs, long *usecs)
{
struct timeval tv;
gettimeofday(&tv, NULL);
*secs = tv.tv_sec;
2003-11-14 17:48:57 +01:00
*usecs = tv.tv_usec;
}
static unsigned long
DRIComputeMilliSeconds(unsigned long s_secs, unsigned long s_usecs,
unsigned long f_secs, unsigned long f_usecs)
2003-11-14 17:48:57 +01:00
{
if (f_usecs < s_usecs) {
--f_secs;
f_usecs += 1000000;
2003-11-14 17:48:57 +01:00
}
return (f_secs - s_secs) * 1000 + (f_usecs - s_usecs) / 1000;
}
static void
DRISpinLockTimeout(drmLock * lock, int val, unsigned long timeout /* in mS */ )
2003-11-14 17:48:57 +01:00
{
int count = 10000;
2003-11-14 17:48:57 +01:00
#if !defined(__alpha__) && !defined(__powerpc__)
char ret;
#else
int ret;
#endif
long s_secs, s_usecs;
long f_secs, f_usecs;
long msecs;
long prev = 0;
2003-11-14 17:48:57 +01:00
DRIGetSecs(&s_secs, &s_usecs);
do {
DRM_SPINLOCK_COUNT(lock, val, count, ret);
if (!ret)
return; /* Got lock */
DRIGetSecs(&f_secs, &f_usecs);
msecs = DRIComputeMilliSeconds(s_secs, s_usecs, f_secs, f_usecs);
if (msecs - prev < 250)
count *= 2; /* Not more than 0.5S */
2003-11-14 17:48:57 +01:00
} while (msecs < timeout);
/* Didn't get lock, so take it. The worst
that can happen is that there is some
garbage written to the wrong part of the
framebuffer that a refresh will repair.
That's undesirable, but better than
locking the server. This should be a
very rare event. */
2003-11-14 17:48:57 +01:00
DRM_SPINLOCK_TAKE(lock, val);
}
static void
DRILockTree(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
2003-11-14 17:48:57 +01:00
/* Restore the last known 3D context if the X context is hidden */
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
(*pDRIPriv->pDriverInfo->SwapContext) (pScreen,
DRI_2D_SYNC,
DRI_NO_CONTEXT,
NULL,
DRI_2D_CONTEXT,
pDRIPriv->partial3DContextStore);
2003-11-14 17:48:57 +01:00
}
/* Call kernel to release lock */
DRIUnlock(pScreen);
/* Grab drawable spin lock: a time out between 10 and 30 seconds is
appropriate, since this should never time out except in the case of
client death while the lock is being held. The timeout must be
greater than any reasonable rendering time. */
DRISpinLockTimeout(&pDRIPriv->pSAREA->drawable_lock, 1, 10000); /*10 secs */
2003-11-14 17:48:57 +01:00
/* Call kernel flush outstanding buffers and relock */
DRILock(pScreen, DRM_LOCK_QUIESCENT | DRM_LOCK_FLUSH_ALL);
2003-11-14 17:48:57 +01:00
/* Switch back to our 2D context if the X context is hidden */
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
/* hide X context by swapping 2D component here */
(*pDRIPriv->pDriverInfo->SwapContext) (pScreen,
DRI_3D_SYNC,
DRI_2D_CONTEXT,
pDRIPriv->partial3DContextStore,
DRI_2D_CONTEXT,
pDRIPriv->hiddenContextStore);
2003-11-14 17:48:57 +01:00
}
}
void
2003-11-14 17:48:57 +01:00
DRIClipNotify(WindowPtr pWin, int dx, int dy)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv;
2003-11-14 17:48:57 +01:00
if (!pDRIPriv)
return;
2003-11-14 17:48:57 +01:00
if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
int nrects = RegionNumRects(&pWin->clipList);
2003-11-14 17:48:57 +01:00
if (!pDRIPriv->windowsTouched) {
2003-11-14 17:48:57 +01:00
DRILockTree(pScreen);
pDRIPriv->windowsTouched = TRUE;
2003-11-14 17:48:57 +01:00
}
if (nrects && !pDRIDrawablePriv->nrects)
DRIIncreaseNumberVisible(pScreen);
else if (!nrects && pDRIDrawablePriv->nrects)
DRIDecreaseNumberVisible(pScreen);
else
DRIDriverClipNotify(pScreen);
pDRIDrawablePriv->nrects = nrects;
pDRIPriv->pSAREA->drawableTable[pDRIDrawablePriv->drawableIndex].stamp
= DRIDrawableValidationStamp++;
drmUpdateDrawableInfo(pDRIPriv->drmFD, pDRIDrawablePriv->hwDrawable,
DRM_DRAWABLE_CLIPRECTS,
nrects, RegionRects(&pWin->clipList));
2003-11-14 17:48:57 +01:00
}
/* call lower wrapped functions */
if (pDRIPriv->wrap.ClipNotify) {
2003-11-14 17:48:57 +01:00
/* unwrap */
2003-11-14 17:48:57 +01:00
pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
/* call lower layers */
(*pScreen->ClipNotify) (pWin, dx, dy);
2003-11-14 17:48:57 +01:00
/* rewrap */
2003-11-14 17:48:57 +01:00
pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
pScreen->ClipNotify = DRIClipNotify;
}
}
CARD32
2003-11-14 17:48:57 +01:00
DRIGetDrawableIndex(WindowPtr pWin)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
CARD32 index;
if (pDRIDrawablePriv) {
index = pDRIDrawablePriv->drawableIndex;
2003-11-14 17:48:57 +01:00
}
else {
index = pDRIPriv->pDriverInfo->ddxDrawableTableEntry;
2003-11-14 17:48:57 +01:00
}
return index;
}
unsigned int
2003-11-14 17:48:57 +01:00
DRIGetDrawableStamp(ScreenPtr pScreen, CARD32 drawable_index)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
2003-11-14 17:48:57 +01:00
return pDRIPriv->pSAREA->drawableTable[drawable_index].stamp;
}
void
2003-11-14 17:48:57 +01:00
DRIPrintDrawableLock(ScreenPtr pScreen, char *msg)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
ErrorF("%s: %d\n", msg, pDRIPriv->pSAREA->drawable_lock.lock);
2003-11-14 17:48:57 +01:00
}
void
2003-11-14 17:48:57 +01:00
DRILock(ScreenPtr pScreen, int flags)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv || !pDRIPriv->pLockRefCount)
return;
if (!*pDRIPriv->pLockRefCount) {
DRM_LOCK(pDRIPriv->drmFD, pDRIPriv->pLSAREA, pDRIPriv->myContext,
flags);
*pDRIPriv->pLockingContext = pDRIPriv->myContext;
}
else if (*pDRIPriv->pLockingContext != pDRIPriv->myContext) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[DRI] Locking deadlock.\n"
"\tAlready locked with context %p,\n"
"\ttrying to lock with context %p.\n",
pDRIPriv->pLockingContext, (void *) (uintptr_t) pDRIPriv->myContext);
}
(*pDRIPriv->pLockRefCount)++;
2003-11-14 17:48:57 +01:00
}
void
2003-11-14 17:48:57 +01:00
DRIUnlock(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv || !pDRIPriv->pLockRefCount)
return;
if (*pDRIPriv->pLockRefCount > 0) {
if (pDRIPriv->myContext != *pDRIPriv->pLockingContext) {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"[DRI] Unlocking inconsistency:\n"
"\tContext %p trying to unlock lock held by context %p\n",
pDRIPriv->pLockingContext, (void *) (uintptr_t) pDRIPriv->myContext);
}
(*pDRIPriv->pLockRefCount)--;
}
else {
DRIDrvMsg(pScreen->myNum, X_ERROR,
"DRIUnlock called when not locked.\n");
2003-11-14 17:48:57 +01:00
return;
}
if (!*pDRIPriv->pLockRefCount)
DRM_UNLOCK(pDRIPriv->drmFD, pDRIPriv->pLSAREA, pDRIPriv->myContext);
2003-11-14 17:48:57 +01:00
}
void *
2003-11-14 17:48:57 +01:00
DRIGetSAREAPrivate(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return 0;
return (void *) (((char *) pDRIPriv->pSAREA) + sizeof(XF86DRISAREARec));
2003-11-14 17:48:57 +01:00
}
drm_context_t
2003-11-14 17:48:57 +01:00
DRIGetContext(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return 0;
2003-11-14 17:48:57 +01:00
return pDRIPriv->myContext;
}
void
DRIGetTexOffsetFuncs(ScreenPtr pScreen,
DRITexOffsetStartProcPtr * texOffsetStartFunc,
DRITexOffsetFinishProcPtr * texOffsetFinishFunc)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
*texOffsetStartFunc = pDRIPriv->pDriverInfo->texOffsetStart;
*texOffsetFinishFunc = pDRIPriv->pDriverInfo->texOffsetFinish;
}
2003-11-14 17:48:57 +01:00
/* This lets get at the unwrapped functions so that they can correctly
* call the lowerlevel functions, and choose whether they will be
* called at every level of recursion (eg in validatetree).
*/
DRIWrappedFuncsRec *
2003-11-14 17:48:57 +01:00
DRIGetWrappedFuncs(ScreenPtr pScreen)
{
return &(DRI_SCREEN_PRIV(pScreen)->wrap);
}
/* note that this returns the library version, not the protocol version */
void
DRIQueryVersion(int *majorVersion, int *minorVersion, int *patchVersion)
2003-11-14 17:48:57 +01:00
{
*majorVersion = DRIINFO_MAJOR_VERSION;
*minorVersion = DRIINFO_MINOR_VERSION;
*patchVersion = DRIINFO_PATCH_VERSION;
2003-11-14 17:48:57 +01:00
}
static void
_DRIAdjustFrame(ScrnInfoPtr pScrn, DRIScreenPrivPtr pDRIPriv, int x, int y)
{
pDRIPriv->pSAREA->frame.x = x;
pDRIPriv->pSAREA->frame.y = y;
pDRIPriv->pSAREA->frame.width = pScrn->frameX1 - x + 1;
2003-11-14 17:48:57 +01:00
pDRIPriv->pSAREA->frame.height = pScrn->frameY1 - y + 1;
}
void
api: rework the X server driver API to avoid global arrays. This is a squash merge containing all the API changes, as well as the video ABI bump. Its been squashed to make bisection easier. Full patch log below: commit b202738bbf0c5a1c1172767119c2c71f1e7f8070 Author: Aaron Plattner <aplattner@nvidia.com> Date: Mon May 14 15:16:11 2012 -0700 xfree86: Bump video ABI to 13.0 The ABI was broken by changes to convert from screen index numbers to ScreenPtr / ScrnInfoPtr in various structures and function signatures. Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3d5f7d9f8d408bcad3f83277d255f25d3b0edbf3 Author: Dave Airlie <airlied@redhat.com> Date: Thu May 24 10:56:57 2012 +0100 xf86: xf86ClearEntityListForScreen should take a pScrn When adding GPU screens this make life easier. (also fix comment, as pointed out by Alan) Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Dave Airlie <airlied@redhat.com> commit afee8b5ab4501597ecc1ade34124d7ca227ab055 Author: Dave Airlie <airlied@redhat.com> Date: Thu May 24 07:07:32 2012 +0100 xf86i2c: add pscrn for drivers to use This just adds a pScrn pointer into the struct for the drivers to use instead of scrnIndex. Mostly scrnIndex is used for logging, but some drivers use it to lookup xf86Screens, so let them stash a pScrn instead. Removing the scrnIndex is a bit more involved and I'm not sure its worth the effort. Doing i2c in the X server is legacy code as far as I'm concerned. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit ea5092f1f679691d187f1eee9427e6057beec56e Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 19:25:20 2012 +0100 dix/gc: consolidate GC object creation in one place The standard GC create and scratch GC create were 90% the same really, and I have a need in the future for creating GC objects without the other bits, so wanted to avoid a third copy. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3d91482ea9b4883e64e496f2768168e0ffa21ba1 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 10:24:06 2012 +0100 xf86: add a define to denote the new non-index interfaces are being used This can be used by drivers to provide compatible APIs. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 37c3ae3e6cd4f3dedc72f371096d6743f8f99df3 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 15:09:12 2012 +0100 dix: make Create/Free scratch pixmaps take a ScreenPtr While technically an API/ABI change I doubt anyone uses it, but it helps in splitting screens up. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 75f2062a3fe94f04764ecc7d2ff2fbbeccb9da60 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:57:55 2012 +0100 xf86/xv: remove scrnIndexfrom xf86FindXvOptions. Move this interface to taking an ScrnInfoPtr. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit f80c2374f40ea7b2ee0556e2e76cc07406f3d843 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:53:59 2012 +0100 xf86: make xf86DeleteScreen take a ScrnInfoPtr (v2) stop passing indices into this function. v2: drop flags argument. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 58824e414f35682435f15bfe6c4b656bd90b9235 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:48:09 2012 +0100 xf86: fix xf86IsScreenPrimary interface to take a pScrn (API/ABI) Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 6b4fc1f9d391bcdf7ca288766e49bce60f4635cd Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:18:59 2012 +0100 xserver: convert block/wakeup handlers to passing ScreenPtr (ABI/API) (v2) Instead of passing an index, pass the actual ScreenPtr. This allows more moving towards not abusing xf86Screens + screenInfo. v2: drop the blockData/wakeupData args as per ajax's suggestion., fix docs. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 790d003de20fb47674420a24dadd92412d78620d Author: Dave Airlie <airlied@gmail.com> Date: Wed Apr 11 09:53:14 2012 +0100 xf86/common: remove some more pScrn->pScreen uses remove some more conversions that appeared after api cleanups. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit aac85e18d1dd093f2cad6bd29375e40bd7af0b8f Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:34:53 2012 +0100 ddc: change API to take ScrnInfoPtr (v2) This removes all xf86Screens usage from ddc code, it modifies the API for some functions to avoid taking indices. v2: address Alan's comments about dropping DDC2Init parameter. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit fe3f57b6eaf6860a33876a54f9439f69578f03a5 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:31:26 2012 +0100 vbe: don't use index for VBEInterpretPanelID (API) Remove use of xf86screens from vbe module. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit abf1965f4ed91529036d3fdb470d6a3ce6f29675 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:25:11 2012 +0100 int10/vbe: don't use xf86Screens. (ABI) (v3) Pass the ScrnInfoPtr instead of the index in the int10 struct. This saves us using it to dereference xf86Screens. v2: address Alan's comment to fix struct alignment. v3: squash in all the int10 fixes, test the vm86 code builds, after comments by Keith. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 23cca612b4fb5efc33683c7624b803b457387e3d Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:30:18 2012 +0100 xserver: drop index argument to ScreenInit (ABI/API) (v2) This drops the index argument, its the same as pScreen->myNum, and its the last major index abuse I can find. v2: address Alan's review - update docs, fix xwin/xnest/darwin Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 40d360e2d7e832407f3ed64e3a02c27ecc89a960 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:23:01 2012 +0100 xf86: migrate PointerMoved from index to ScrnInfoPtr (ABI/API) This migrates PointerMoved from an index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit aa60a2f38679d0eeb979a9c2648c9bc771409bf9 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:20:46 2012 +0100 xf86: migrate PMEvent to a ScrnInfoPtr (ABI/API) This migrates the PMEvent from index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit d3f28ef44371ed4a039ffc5dd7eb6408d1269ba2 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:18:30 2012 +0100 xf86: migrate SetDGAMode from index to ScrnInfoPtr (ABI/API) This migrates the SetDGAMode callback from an index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit baf5e4818a74f2b68c3dfdcc56f54322351039a0 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:14:11 2012 +0100 xf86: migrate ChangeGamma from index to ScrnInfoPtr (ABI/API) (v2) This migrates the ChangeGamma interface to avoid passing a index. v2: fix xf86RandR12.c + xf86cmap.c call Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 51e5f90ada929d6b23176090badbb42fdb3fa550 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:11:09 2012 +0100 xf86/exa: migrate index to screen types for EnableDisableFBAccess (ABI/API) The EXA interface migrates to ScreenPtr, and the xf86 interface migrated to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 94f1f21d17e86f96d4a54292a399160950087675 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:02:11 2012 +0100 xf86: migrate ValidMode callback to ScrnInfoPtr (ABI/API) This migrates the ValidMode to passing a ScrnInfoPtr instead of an index. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3f8f18198fed4f39ec805b508a3482e91eea26b2 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:59:46 2012 +0100 xf86: migrate SwitchMode to taking ScrnInfoPtr (ABI/API) (v2) This migrate the SwitchMode interface to take a ScrnInfoPtr instead of an index. v2: drop flags. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit d06a038a5c49328ab3a8d969d24f9fcd22c63202 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:50:37 2012 +0100 xf86: move AdjustFrame to passing ScrnInfoPtr (ABI/API) (v2) This converts AdjustFrame code paths to passing a ScrnInfoPtr instead of an integer index. v2: drop flags args. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 53d2f8608ffd4090d08e7d5cf2e92fb954959b90 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:41:27 2012 +0100 xf86: modify FreeScreen callback to take pScrn instead of index. (ABI/API) (v2) Another index->pScrn conversion. v2: drop flags arg. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 60db37c0b247052e0f5c54b1921fe58a3609c2e3 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:35:41 2012 +0100 xf86: change EnterVT/LeaveVT to take a ScrnInfoPtr (ABI/API break) (v2) This modifies the EnterVT/LeaveVT interfaces to take a ScrnInfoPtr instead of an index into xf86Screens. This allows dropping more public dereferences of the xf86Screens and screenInfo. v2: drop flags args as suggested by Keith, fix docs. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 06729dbbc804a20242e6499f446acb5d94023c3c Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:04:59 2012 +0100 xserver: remove index from CloseScreen (API/ABI breakage) This drops the index from the CloseScreen callback, its always been useless really, since the pScreen contains it. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
2012-06-05 14:22:18 +02:00
DRIAdjustFrame(ScrnInfoPtr pScrn, int x, int y)
2003-11-14 17:48:57 +01:00
{
api: rework the X server driver API to avoid global arrays. This is a squash merge containing all the API changes, as well as the video ABI bump. Its been squashed to make bisection easier. Full patch log below: commit b202738bbf0c5a1c1172767119c2c71f1e7f8070 Author: Aaron Plattner <aplattner@nvidia.com> Date: Mon May 14 15:16:11 2012 -0700 xfree86: Bump video ABI to 13.0 The ABI was broken by changes to convert from screen index numbers to ScreenPtr / ScrnInfoPtr in various structures and function signatures. Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3d5f7d9f8d408bcad3f83277d255f25d3b0edbf3 Author: Dave Airlie <airlied@redhat.com> Date: Thu May 24 10:56:57 2012 +0100 xf86: xf86ClearEntityListForScreen should take a pScrn When adding GPU screens this make life easier. (also fix comment, as pointed out by Alan) Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Dave Airlie <airlied@redhat.com> commit afee8b5ab4501597ecc1ade34124d7ca227ab055 Author: Dave Airlie <airlied@redhat.com> Date: Thu May 24 07:07:32 2012 +0100 xf86i2c: add pscrn for drivers to use This just adds a pScrn pointer into the struct for the drivers to use instead of scrnIndex. Mostly scrnIndex is used for logging, but some drivers use it to lookup xf86Screens, so let them stash a pScrn instead. Removing the scrnIndex is a bit more involved and I'm not sure its worth the effort. Doing i2c in the X server is legacy code as far as I'm concerned. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit ea5092f1f679691d187f1eee9427e6057beec56e Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 19:25:20 2012 +0100 dix/gc: consolidate GC object creation in one place The standard GC create and scratch GC create were 90% the same really, and I have a need in the future for creating GC objects without the other bits, so wanted to avoid a third copy. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3d91482ea9b4883e64e496f2768168e0ffa21ba1 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 10:24:06 2012 +0100 xf86: add a define to denote the new non-index interfaces are being used This can be used by drivers to provide compatible APIs. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 37c3ae3e6cd4f3dedc72f371096d6743f8f99df3 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 15:09:12 2012 +0100 dix: make Create/Free scratch pixmaps take a ScreenPtr While technically an API/ABI change I doubt anyone uses it, but it helps in splitting screens up. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 75f2062a3fe94f04764ecc7d2ff2fbbeccb9da60 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:57:55 2012 +0100 xf86/xv: remove scrnIndexfrom xf86FindXvOptions. Move this interface to taking an ScrnInfoPtr. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit f80c2374f40ea7b2ee0556e2e76cc07406f3d843 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:53:59 2012 +0100 xf86: make xf86DeleteScreen take a ScrnInfoPtr (v2) stop passing indices into this function. v2: drop flags argument. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 58824e414f35682435f15bfe6c4b656bd90b9235 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:48:09 2012 +0100 xf86: fix xf86IsScreenPrimary interface to take a pScrn (API/ABI) Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 6b4fc1f9d391bcdf7ca288766e49bce60f4635cd Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:18:59 2012 +0100 xserver: convert block/wakeup handlers to passing ScreenPtr (ABI/API) (v2) Instead of passing an index, pass the actual ScreenPtr. This allows more moving towards not abusing xf86Screens + screenInfo. v2: drop the blockData/wakeupData args as per ajax's suggestion., fix docs. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 790d003de20fb47674420a24dadd92412d78620d Author: Dave Airlie <airlied@gmail.com> Date: Wed Apr 11 09:53:14 2012 +0100 xf86/common: remove some more pScrn->pScreen uses remove some more conversions that appeared after api cleanups. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit aac85e18d1dd093f2cad6bd29375e40bd7af0b8f Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:34:53 2012 +0100 ddc: change API to take ScrnInfoPtr (v2) This removes all xf86Screens usage from ddc code, it modifies the API for some functions to avoid taking indices. v2: address Alan's comments about dropping DDC2Init parameter. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit fe3f57b6eaf6860a33876a54f9439f69578f03a5 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:31:26 2012 +0100 vbe: don't use index for VBEInterpretPanelID (API) Remove use of xf86screens from vbe module. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit abf1965f4ed91529036d3fdb470d6a3ce6f29675 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:25:11 2012 +0100 int10/vbe: don't use xf86Screens. (ABI) (v3) Pass the ScrnInfoPtr instead of the index in the int10 struct. This saves us using it to dereference xf86Screens. v2: address Alan's comment to fix struct alignment. v3: squash in all the int10 fixes, test the vm86 code builds, after comments by Keith. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 23cca612b4fb5efc33683c7624b803b457387e3d Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:30:18 2012 +0100 xserver: drop index argument to ScreenInit (ABI/API) (v2) This drops the index argument, its the same as pScreen->myNum, and its the last major index abuse I can find. v2: address Alan's review - update docs, fix xwin/xnest/darwin Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 40d360e2d7e832407f3ed64e3a02c27ecc89a960 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:23:01 2012 +0100 xf86: migrate PointerMoved from index to ScrnInfoPtr (ABI/API) This migrates PointerMoved from an index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit aa60a2f38679d0eeb979a9c2648c9bc771409bf9 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:20:46 2012 +0100 xf86: migrate PMEvent to a ScrnInfoPtr (ABI/API) This migrates the PMEvent from index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit d3f28ef44371ed4a039ffc5dd7eb6408d1269ba2 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:18:30 2012 +0100 xf86: migrate SetDGAMode from index to ScrnInfoPtr (ABI/API) This migrates the SetDGAMode callback from an index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit baf5e4818a74f2b68c3dfdcc56f54322351039a0 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:14:11 2012 +0100 xf86: migrate ChangeGamma from index to ScrnInfoPtr (ABI/API) (v2) This migrates the ChangeGamma interface to avoid passing a index. v2: fix xf86RandR12.c + xf86cmap.c call Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 51e5f90ada929d6b23176090badbb42fdb3fa550 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:11:09 2012 +0100 xf86/exa: migrate index to screen types for EnableDisableFBAccess (ABI/API) The EXA interface migrates to ScreenPtr, and the xf86 interface migrated to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 94f1f21d17e86f96d4a54292a399160950087675 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:02:11 2012 +0100 xf86: migrate ValidMode callback to ScrnInfoPtr (ABI/API) This migrates the ValidMode to passing a ScrnInfoPtr instead of an index. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3f8f18198fed4f39ec805b508a3482e91eea26b2 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:59:46 2012 +0100 xf86: migrate SwitchMode to taking ScrnInfoPtr (ABI/API) (v2) This migrate the SwitchMode interface to take a ScrnInfoPtr instead of an index. v2: drop flags. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit d06a038a5c49328ab3a8d969d24f9fcd22c63202 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:50:37 2012 +0100 xf86: move AdjustFrame to passing ScrnInfoPtr (ABI/API) (v2) This converts AdjustFrame code paths to passing a ScrnInfoPtr instead of an integer index. v2: drop flags args. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 53d2f8608ffd4090d08e7d5cf2e92fb954959b90 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:41:27 2012 +0100 xf86: modify FreeScreen callback to take pScrn instead of index. (ABI/API) (v2) Another index->pScrn conversion. v2: drop flags arg. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 60db37c0b247052e0f5c54b1921fe58a3609c2e3 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:35:41 2012 +0100 xf86: change EnterVT/LeaveVT to take a ScrnInfoPtr (ABI/API break) (v2) This modifies the EnterVT/LeaveVT interfaces to take a ScrnInfoPtr instead of an index into xf86Screens. This allows dropping more public dereferences of the xf86Screens and screenInfo. v2: drop flags args as suggested by Keith, fix docs. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 06729dbbc804a20242e6499f446acb5d94023c3c Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:04:59 2012 +0100 xserver: remove index from CloseScreen (API/ABI breakage) This drops the index from the CloseScreen callback, its always been useless really, since the pScreen contains it. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
2012-06-05 14:22:18 +02:00
ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
2003-11-14 17:48:57 +01:00
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
int px, py;
2003-11-14 17:48:57 +01:00
if (!pDRIPriv || !pDRIPriv->pSAREA) {
api: rework the X server driver API to avoid global arrays. This is a squash merge containing all the API changes, as well as the video ABI bump. Its been squashed to make bisection easier. Full patch log below: commit b202738bbf0c5a1c1172767119c2c71f1e7f8070 Author: Aaron Plattner <aplattner@nvidia.com> Date: Mon May 14 15:16:11 2012 -0700 xfree86: Bump video ABI to 13.0 The ABI was broken by changes to convert from screen index numbers to ScreenPtr / ScrnInfoPtr in various structures and function signatures. Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3d5f7d9f8d408bcad3f83277d255f25d3b0edbf3 Author: Dave Airlie <airlied@redhat.com> Date: Thu May 24 10:56:57 2012 +0100 xf86: xf86ClearEntityListForScreen should take a pScrn When adding GPU screens this make life easier. (also fix comment, as pointed out by Alan) Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Dave Airlie <airlied@redhat.com> commit afee8b5ab4501597ecc1ade34124d7ca227ab055 Author: Dave Airlie <airlied@redhat.com> Date: Thu May 24 07:07:32 2012 +0100 xf86i2c: add pscrn for drivers to use This just adds a pScrn pointer into the struct for the drivers to use instead of scrnIndex. Mostly scrnIndex is used for logging, but some drivers use it to lookup xf86Screens, so let them stash a pScrn instead. Removing the scrnIndex is a bit more involved and I'm not sure its worth the effort. Doing i2c in the X server is legacy code as far as I'm concerned. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit ea5092f1f679691d187f1eee9427e6057beec56e Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 19:25:20 2012 +0100 dix/gc: consolidate GC object creation in one place The standard GC create and scratch GC create were 90% the same really, and I have a need in the future for creating GC objects without the other bits, so wanted to avoid a third copy. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3d91482ea9b4883e64e496f2768168e0ffa21ba1 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 10:24:06 2012 +0100 xf86: add a define to denote the new non-index interfaces are being used This can be used by drivers to provide compatible APIs. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 37c3ae3e6cd4f3dedc72f371096d6743f8f99df3 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 15:09:12 2012 +0100 dix: make Create/Free scratch pixmaps take a ScreenPtr While technically an API/ABI change I doubt anyone uses it, but it helps in splitting screens up. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 75f2062a3fe94f04764ecc7d2ff2fbbeccb9da60 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:57:55 2012 +0100 xf86/xv: remove scrnIndexfrom xf86FindXvOptions. Move this interface to taking an ScrnInfoPtr. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit f80c2374f40ea7b2ee0556e2e76cc07406f3d843 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:53:59 2012 +0100 xf86: make xf86DeleteScreen take a ScrnInfoPtr (v2) stop passing indices into this function. v2: drop flags argument. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 58824e414f35682435f15bfe6c4b656bd90b9235 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:48:09 2012 +0100 xf86: fix xf86IsScreenPrimary interface to take a pScrn (API/ABI) Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 6b4fc1f9d391bcdf7ca288766e49bce60f4635cd Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:18:59 2012 +0100 xserver: convert block/wakeup handlers to passing ScreenPtr (ABI/API) (v2) Instead of passing an index, pass the actual ScreenPtr. This allows more moving towards not abusing xf86Screens + screenInfo. v2: drop the blockData/wakeupData args as per ajax's suggestion., fix docs. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 790d003de20fb47674420a24dadd92412d78620d Author: Dave Airlie <airlied@gmail.com> Date: Wed Apr 11 09:53:14 2012 +0100 xf86/common: remove some more pScrn->pScreen uses remove some more conversions that appeared after api cleanups. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit aac85e18d1dd093f2cad6bd29375e40bd7af0b8f Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:34:53 2012 +0100 ddc: change API to take ScrnInfoPtr (v2) This removes all xf86Screens usage from ddc code, it modifies the API for some functions to avoid taking indices. v2: address Alan's comments about dropping DDC2Init parameter. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit fe3f57b6eaf6860a33876a54f9439f69578f03a5 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:31:26 2012 +0100 vbe: don't use index for VBEInterpretPanelID (API) Remove use of xf86screens from vbe module. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit abf1965f4ed91529036d3fdb470d6a3ce6f29675 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:25:11 2012 +0100 int10/vbe: don't use xf86Screens. (ABI) (v3) Pass the ScrnInfoPtr instead of the index in the int10 struct. This saves us using it to dereference xf86Screens. v2: address Alan's comment to fix struct alignment. v3: squash in all the int10 fixes, test the vm86 code builds, after comments by Keith. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 23cca612b4fb5efc33683c7624b803b457387e3d Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:30:18 2012 +0100 xserver: drop index argument to ScreenInit (ABI/API) (v2) This drops the index argument, its the same as pScreen->myNum, and its the last major index abuse I can find. v2: address Alan's review - update docs, fix xwin/xnest/darwin Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 40d360e2d7e832407f3ed64e3a02c27ecc89a960 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:23:01 2012 +0100 xf86: migrate PointerMoved from index to ScrnInfoPtr (ABI/API) This migrates PointerMoved from an index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit aa60a2f38679d0eeb979a9c2648c9bc771409bf9 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:20:46 2012 +0100 xf86: migrate PMEvent to a ScrnInfoPtr (ABI/API) This migrates the PMEvent from index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit d3f28ef44371ed4a039ffc5dd7eb6408d1269ba2 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:18:30 2012 +0100 xf86: migrate SetDGAMode from index to ScrnInfoPtr (ABI/API) This migrates the SetDGAMode callback from an index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit baf5e4818a74f2b68c3dfdcc56f54322351039a0 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:14:11 2012 +0100 xf86: migrate ChangeGamma from index to ScrnInfoPtr (ABI/API) (v2) This migrates the ChangeGamma interface to avoid passing a index. v2: fix xf86RandR12.c + xf86cmap.c call Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 51e5f90ada929d6b23176090badbb42fdb3fa550 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:11:09 2012 +0100 xf86/exa: migrate index to screen types for EnableDisableFBAccess (ABI/API) The EXA interface migrates to ScreenPtr, and the xf86 interface migrated to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 94f1f21d17e86f96d4a54292a399160950087675 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:02:11 2012 +0100 xf86: migrate ValidMode callback to ScrnInfoPtr (ABI/API) This migrates the ValidMode to passing a ScrnInfoPtr instead of an index. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3f8f18198fed4f39ec805b508a3482e91eea26b2 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:59:46 2012 +0100 xf86: migrate SwitchMode to taking ScrnInfoPtr (ABI/API) (v2) This migrate the SwitchMode interface to take a ScrnInfoPtr instead of an index. v2: drop flags. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit d06a038a5c49328ab3a8d969d24f9fcd22c63202 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:50:37 2012 +0100 xf86: move AdjustFrame to passing ScrnInfoPtr (ABI/API) (v2) This converts AdjustFrame code paths to passing a ScrnInfoPtr instead of an integer index. v2: drop flags args. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 53d2f8608ffd4090d08e7d5cf2e92fb954959b90 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:41:27 2012 +0100 xf86: modify FreeScreen callback to take pScrn instead of index. (ABI/API) (v2) Another index->pScrn conversion. v2: drop flags arg. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 60db37c0b247052e0f5c54b1921fe58a3609c2e3 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:35:41 2012 +0100 xf86: change EnterVT/LeaveVT to take a ScrnInfoPtr (ABI/API break) (v2) This modifies the EnterVT/LeaveVT interfaces to take a ScrnInfoPtr instead of an index into xf86Screens. This allows dropping more public dereferences of the xf86Screens and screenInfo. v2: drop flags args as suggested by Keith, fix docs. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 06729dbbc804a20242e6499f446acb5d94023c3c Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:04:59 2012 +0100 xserver: remove index from CloseScreen (API/ABI breakage) This drops the index from the CloseScreen callback, its always been useless really, since the pScreen contains it. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
2012-06-05 14:22:18 +02:00
DRIDrvMsg(pScrn->scrnIndex, X_ERROR, "[DRI] No SAREA (%p %p)\n",
pDRIPriv, pDRIPriv ? pDRIPriv->pSAREA : NULL);
return;
2003-11-14 17:48:57 +01:00
}
if (pDRIPriv->fullscreen) {
/* Fix up frame */
pScrn->frameX0 = pDRIPriv->pSAREA->frame.x;
pScrn->frameY0 = pDRIPriv->pSAREA->frame.y;
pScrn->frameX1 = pScrn->frameX0 + pDRIPriv->pSAREA->frame.width - 1;
pScrn->frameY1 = pScrn->frameY0 + pDRIPriv->pSAREA->frame.height - 1;
/* Fix up cursor */
miPointerGetPosition(inputInfo.pointer, &px, &py);
if (px < pScrn->frameX0)
px = pScrn->frameX0;
if (px > pScrn->frameX1)
px = pScrn->frameX1;
if (py < pScrn->frameY0)
py = pScrn->frameY0;
if (py > pScrn->frameY1)
py = pScrn->frameY1;
pScreen->SetCursorPosition(inputInfo.pointer, pScreen, px, py, TRUE);
return;
2003-11-14 17:48:57 +01:00
}
if (pDRIPriv->wrap.AdjustFrame) {
/* unwrap */
pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame;
/* call lower layers */
api: rework the X server driver API to avoid global arrays. This is a squash merge containing all the API changes, as well as the video ABI bump. Its been squashed to make bisection easier. Full patch log below: commit b202738bbf0c5a1c1172767119c2c71f1e7f8070 Author: Aaron Plattner <aplattner@nvidia.com> Date: Mon May 14 15:16:11 2012 -0700 xfree86: Bump video ABI to 13.0 The ABI was broken by changes to convert from screen index numbers to ScreenPtr / ScrnInfoPtr in various structures and function signatures. Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3d5f7d9f8d408bcad3f83277d255f25d3b0edbf3 Author: Dave Airlie <airlied@redhat.com> Date: Thu May 24 10:56:57 2012 +0100 xf86: xf86ClearEntityListForScreen should take a pScrn When adding GPU screens this make life easier. (also fix comment, as pointed out by Alan) Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Dave Airlie <airlied@redhat.com> commit afee8b5ab4501597ecc1ade34124d7ca227ab055 Author: Dave Airlie <airlied@redhat.com> Date: Thu May 24 07:07:32 2012 +0100 xf86i2c: add pscrn for drivers to use This just adds a pScrn pointer into the struct for the drivers to use instead of scrnIndex. Mostly scrnIndex is used for logging, but some drivers use it to lookup xf86Screens, so let them stash a pScrn instead. Removing the scrnIndex is a bit more involved and I'm not sure its worth the effort. Doing i2c in the X server is legacy code as far as I'm concerned. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit ea5092f1f679691d187f1eee9427e6057beec56e Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 19:25:20 2012 +0100 dix/gc: consolidate GC object creation in one place The standard GC create and scratch GC create were 90% the same really, and I have a need in the future for creating GC objects without the other bits, so wanted to avoid a third copy. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3d91482ea9b4883e64e496f2768168e0ffa21ba1 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 10:24:06 2012 +0100 xf86: add a define to denote the new non-index interfaces are being used This can be used by drivers to provide compatible APIs. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 37c3ae3e6cd4f3dedc72f371096d6743f8f99df3 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 15:09:12 2012 +0100 dix: make Create/Free scratch pixmaps take a ScreenPtr While technically an API/ABI change I doubt anyone uses it, but it helps in splitting screens up. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 75f2062a3fe94f04764ecc7d2ff2fbbeccb9da60 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:57:55 2012 +0100 xf86/xv: remove scrnIndexfrom xf86FindXvOptions. Move this interface to taking an ScrnInfoPtr. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit f80c2374f40ea7b2ee0556e2e76cc07406f3d843 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:53:59 2012 +0100 xf86: make xf86DeleteScreen take a ScrnInfoPtr (v2) stop passing indices into this function. v2: drop flags argument. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 58824e414f35682435f15bfe6c4b656bd90b9235 Author: Dave Airlie <airlied@redhat.com> Date: Wed May 23 14:48:09 2012 +0100 xf86: fix xf86IsScreenPrimary interface to take a pScrn (API/ABI) Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 6b4fc1f9d391bcdf7ca288766e49bce60f4635cd Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:18:59 2012 +0100 xserver: convert block/wakeup handlers to passing ScreenPtr (ABI/API) (v2) Instead of passing an index, pass the actual ScreenPtr. This allows more moving towards not abusing xf86Screens + screenInfo. v2: drop the blockData/wakeupData args as per ajax's suggestion., fix docs. Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 790d003de20fb47674420a24dadd92412d78620d Author: Dave Airlie <airlied@gmail.com> Date: Wed Apr 11 09:53:14 2012 +0100 xf86/common: remove some more pScrn->pScreen uses remove some more conversions that appeared after api cleanups. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit aac85e18d1dd093f2cad6bd29375e40bd7af0b8f Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:34:53 2012 +0100 ddc: change API to take ScrnInfoPtr (v2) This removes all xf86Screens usage from ddc code, it modifies the API for some functions to avoid taking indices. v2: address Alan's comments about dropping DDC2Init parameter. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit fe3f57b6eaf6860a33876a54f9439f69578f03a5 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:31:26 2012 +0100 vbe: don't use index for VBEInterpretPanelID (API) Remove use of xf86screens from vbe module. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit abf1965f4ed91529036d3fdb470d6a3ce6f29675 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 16:25:11 2012 +0100 int10/vbe: don't use xf86Screens. (ABI) (v3) Pass the ScrnInfoPtr instead of the index in the int10 struct. This saves us using it to dereference xf86Screens. v2: address Alan's comment to fix struct alignment. v3: squash in all the int10 fixes, test the vm86 code builds, after comments by Keith. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 23cca612b4fb5efc33683c7624b803b457387e3d Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:30:18 2012 +0100 xserver: drop index argument to ScreenInit (ABI/API) (v2) This drops the index argument, its the same as pScreen->myNum, and its the last major index abuse I can find. v2: address Alan's review - update docs, fix xwin/xnest/darwin Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 40d360e2d7e832407f3ed64e3a02c27ecc89a960 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:23:01 2012 +0100 xf86: migrate PointerMoved from index to ScrnInfoPtr (ABI/API) This migrates PointerMoved from an index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit aa60a2f38679d0eeb979a9c2648c9bc771409bf9 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:20:46 2012 +0100 xf86: migrate PMEvent to a ScrnInfoPtr (ABI/API) This migrates the PMEvent from index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit d3f28ef44371ed4a039ffc5dd7eb6408d1269ba2 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:18:30 2012 +0100 xf86: migrate SetDGAMode from index to ScrnInfoPtr (ABI/API) This migrates the SetDGAMode callback from an index to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit baf5e4818a74f2b68c3dfdcc56f54322351039a0 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:14:11 2012 +0100 xf86: migrate ChangeGamma from index to ScrnInfoPtr (ABI/API) (v2) This migrates the ChangeGamma interface to avoid passing a index. v2: fix xf86RandR12.c + xf86cmap.c call Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 51e5f90ada929d6b23176090badbb42fdb3fa550 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:11:09 2012 +0100 xf86/exa: migrate index to screen types for EnableDisableFBAccess (ABI/API) The EXA interface migrates to ScreenPtr, and the xf86 interface migrated to ScrnInfoPtr. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 94f1f21d17e86f96d4a54292a399160950087675 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 15:02:11 2012 +0100 xf86: migrate ValidMode callback to ScrnInfoPtr (ABI/API) This migrates the ValidMode to passing a ScrnInfoPtr instead of an index. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 3f8f18198fed4f39ec805b508a3482e91eea26b2 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:59:46 2012 +0100 xf86: migrate SwitchMode to taking ScrnInfoPtr (ABI/API) (v2) This migrate the SwitchMode interface to take a ScrnInfoPtr instead of an index. v2: drop flags. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit d06a038a5c49328ab3a8d969d24f9fcd22c63202 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:50:37 2012 +0100 xf86: move AdjustFrame to passing ScrnInfoPtr (ABI/API) (v2) This converts AdjustFrame code paths to passing a ScrnInfoPtr instead of an integer index. v2: drop flags args. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 53d2f8608ffd4090d08e7d5cf2e92fb954959b90 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:41:27 2012 +0100 xf86: modify FreeScreen callback to take pScrn instead of index. (ABI/API) (v2) Another index->pScrn conversion. v2: drop flags arg. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 60db37c0b247052e0f5c54b1921fe58a3609c2e3 Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:35:41 2012 +0100 xf86: change EnterVT/LeaveVT to take a ScrnInfoPtr (ABI/API break) (v2) This modifies the EnterVT/LeaveVT interfaces to take a ScrnInfoPtr instead of an index into xf86Screens. This allows dropping more public dereferences of the xf86Screens and screenInfo. v2: drop flags args as suggested by Keith, fix docs. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> commit 06729dbbc804a20242e6499f446acb5d94023c3c Author: Dave Airlie <airlied@gmail.com> Date: Tue Apr 10 14:04:59 2012 +0100 xserver: remove index from CloseScreen (API/ABI breakage) This drops the index from the CloseScreen callback, its always been useless really, since the pScreen contains it. Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com> Acked-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
2012-06-05 14:22:18 +02:00
(*pScrn->AdjustFrame) (pScrn, x, y);
/* rewrap */
pDRIPriv->wrap.AdjustFrame = pScrn->AdjustFrame;
pScrn->AdjustFrame = DRIAdjustFrame;
2003-11-14 17:48:57 +01:00
}
_DRIAdjustFrame(pScrn, pDRIPriv, x, y);
}
/*
2003-11-14 17:48:57 +01:00
* DRIMoveBuffersHelper swaps the regions rects in place leaving you
* a region with the rects in the order that you need to blit them,
* but it is possibly (likely) an invalid region afterwards. If you
* need to use the region again for anything you have to call
2003-11-14 17:48:57 +01:00
* REGION_VALIDATE on it, or better yet, save a copy first.
*/
void
DRIMoveBuffersHelper(ScreenPtr pScreen,
int dx, int dy, int *xdir, int *ydir, RegionPtr reg)
{
BoxPtr extents, pbox, firstBox, lastBox;
BoxRec tmpBox;
int y, nbox;
extents = RegionExtents(reg);
nbox = RegionNumRects(reg);
pbox = RegionRects(reg);
if ((dy > 0) && (dy < (extents->y2 - extents->y1))) {
*ydir = -1;
if (nbox > 1) {
firstBox = pbox;
lastBox = pbox + nbox - 1;
while ((unsigned long) firstBox < (unsigned long) lastBox) {
tmpBox = *firstBox;
*firstBox = *lastBox;
*lastBox = tmpBox;
firstBox++;
lastBox--;
}
2003-11-14 17:48:57 +01:00
}
}
else
*ydir = 1;
if ((dx > 0) && (dx < (extents->x2 - extents->x1))) {
*xdir = -1;
if (nbox > 1) {
firstBox = lastBox = pbox;
y = pbox->y1;
while (--nbox) {
pbox++;
if (pbox->y1 == y)
lastBox++;
else {
while ((unsigned long) firstBox < (unsigned long) lastBox) {
tmpBox = *firstBox;
*firstBox = *lastBox;
*lastBox = tmpBox;
firstBox++;
lastBox--;
}
firstBox = lastBox = pbox;
y = pbox->y1;
}
}
while ((unsigned long) firstBox < (unsigned long) lastBox) {
tmpBox = *firstBox;
*firstBox = *lastBox;
*lastBox = tmpBox;
firstBox++;
lastBox--;
}
2003-11-14 17:48:57 +01:00
}
}
else
*xdir = 1;
2003-11-14 17:48:57 +01:00
}