61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/*
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Copyright © 2004 Philip Blundell
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Permission to use, copy, modify, distribute, and sell this software and its
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * documentation for any purpose is hereby granted without fee, provided that
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * the above copyright notice appear in all copies and that both that
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * copyright notice and this permission notice appear in supporting
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * documentation, and that the name of Philip Blundell not be used in
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * advertising or publicity pertaining to distribution of the software without
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * specific, written prior permission. Philip Blundell makes no
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * representations about the suitability of this software for any purpose. It
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * is provided "as is" without express or implied warranty.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * PHILIP BLUNDELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * EVENT SHALL PHILIP BLUNDELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * PERFORMANCE OF THIS SOFTWARE.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include <X11/X.h>
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "scrnintstr.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "windowstr.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "dixfontstr.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "mi.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "regionstr.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "globals.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "gcstruct.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "shadow.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "fb.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#if ROTATE == 270
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define WINSTEPX(stride) (stride)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define WINSTART(x,y) (((pScreen->height - 1) - y) + (x * winStride))
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define WINSTEPY() -1
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#elif ROTATE == 90
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define WINSTEPX(stride) (-stride)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define WINSTEPY() 1
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define WINSTART(x,y) (((pScreen->width - 1 - x) * winStride) + y)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#else
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#error This rotation is not supported here
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#endif
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#ifdef __arm__
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define PREFETCH
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#endif
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncFUNC(ScreenPtr pScreen, shadowBufPtr pBuf)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync{
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync RegionPtr damage = shadowDamage(pBuf);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync PixmapPtr pShadow = pBuf->pPixmap;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync int nbox = RegionNumRects(damage);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync BoxPtr pbox = RegionRects(damage);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync FbBits *shaBits;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync Data *shaBase, *shaLine, *sha;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync FbStride shaStride, winStride;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync int shaBpp;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync _X_UNUSED int shaXoff, shaYoff;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync int x, y, w, h;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync Data *winBase, *win, *winLine;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CARD32 winSize;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync fbGetDrawable(&pShadow->drawable, shaBits, shaStride, shaBpp, shaXoff,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync shaYoff);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync shaBase = (Data *) shaBits;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync shaStride = shaStride * sizeof(FbBits) / sizeof(Data);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync winBase = (Data *) (*pBuf->window) (pScreen, 0, 0,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync SHADOW_WINDOW_WRITE,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync &winSize, pBuf->closure);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync winStride = (Data *) (*pBuf->window) (pScreen, 1, 0,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync SHADOW_WINDOW_WRITE,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync &winSize, pBuf->closure) - winBase;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync while (nbox--) {
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync x = pbox->x1;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync y = pbox->y1;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync w = (pbox->x2 - pbox->x1);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync h = pbox->y2 - pbox->y1;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync shaLine = shaBase + (y * shaStride) + x;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#ifdef PREFETCH
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync __builtin_prefetch(shaLine);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#endif
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync winLine = winBase + WINSTART(x, y);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync while (h--) {
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync sha = shaLine;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win = winLine;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync while (sha < (shaLine + w - 16)) {
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#ifdef PREFETCH
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync __builtin_prefetch(sha + shaStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#endif
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync }
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync while (sha < (shaLine + w)) {
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *win = *sha++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync win += WINSTEPX(winStride);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync }
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync y++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync shaLine += shaStride;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync winLine += WINSTEPY();
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync }
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync pbox++;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync } /* nbox */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync}