1fda9279dSmrg/*
2fda9279dSmrg * Copyright 1999 Mark Vojkovich
3fda9279dSmrg *
4fda9279dSmrg * Permission is hereby granted, free of charge, to any person obtaining a
5fda9279dSmrg * copy of this software and associated documentation files (the "Software"),
6fda9279dSmrg * to deal in the Software without restriction, including without limitation
7fda9279dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fda9279dSmrg * and/or sell copies of the Software, and to permit persons to whom the
9fda9279dSmrg * Software is furnished to do so, subject to the following conditions:
10fda9279dSmrg *
11fda9279dSmrg * The above copyright notice and this permission notice shall be included in
12fda9279dSmrg * all copies or substantial portions of the Software.
13fda9279dSmrg *
14fda9279dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fda9279dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fda9279dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fda9279dSmrg * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18fda9279dSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19fda9279dSmrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20fda9279dSmrg * SOFTWARE.
21fda9279dSmrg */
22fda9279dSmrg
23fda9279dSmrg#include "nv_include.h"
24fda9279dSmrg#include "nv_type.h"
25fda9279dSmrg#include "shadowfb.h"
26fda9279dSmrg#include "servermd.h"
27fda9279dSmrg
28fda9279dSmrg#define MIN(a, b) (((a) < (b)) ? (a) : (b))
29fda9279dSmrg#define MAX(a, b) (((a) > (b)) ? (a) : (b))
30fda9279dSmrg
31fda9279dSmrgvoid
32fda9279dSmrgNVRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
33fda9279dSmrg{
34fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
35fda9279dSmrg	int x1, y1, x2, y2, width, height, cpp, FBPitch;
36fda9279dSmrg	unsigned char *src, *dst;
37fda9279dSmrg
38fda9279dSmrg	cpp = pScrn->bitsPerPixel >> 3;
39fda9279dSmrg	FBPitch = pScrn->displayWidth * cpp;
40fda9279dSmrg
41fda9279dSmrg	nouveau_bo_map(pNv->scanout, NOUVEAU_BO_WR, pNv->client);
42fda9279dSmrg	while(num--) {
43fda9279dSmrg		x1 = MAX(pbox->x1, 0);
44fda9279dSmrg		y1 = MAX(pbox->y1, 0);
45fda9279dSmrg		x2 = MIN(pbox->x2, pScrn->virtualX);
46fda9279dSmrg		y2 = MIN(pbox->y2, pScrn->virtualY);
47fda9279dSmrg		width = (x2 - x1) * cpp;
48fda9279dSmrg		height = y2 - y1;
49fda9279dSmrg
50fda9279dSmrg		if (width > 0 && height > 0) {
51fda9279dSmrg			src = pNv->ShadowPtr + (y1 * pNv->ShadowPitch) + (x1 * cpp);
52fda9279dSmrg			dst = pNv->scanout->map + (y1 * FBPitch) + (x1 * cpp);
53fda9279dSmrg
54fda9279dSmrg			while(height--) {
55fda9279dSmrg				memcpy(dst, src, width);
56fda9279dSmrg				dst += FBPitch;
57fda9279dSmrg				src += pNv->ShadowPitch;
58fda9279dSmrg			}
59fda9279dSmrg		}
60fda9279dSmrg
61fda9279dSmrg		pbox++;
62fda9279dSmrg	}
63fda9279dSmrg}
64