Optimize set_origin() use in some screensavers to stop them eating
cpu power when the origin hasn't changed. PR: kern/100683 Submitted by: Gareth McCaughan <gareth -dot- mccaughan -at- pobox.com> MFC after: 3 days
This commit is contained in:
parent
9fad4c2a12
commit
0754972c5c
@ -52,6 +52,12 @@
|
||||
#define GREEN(n) ((n) * 3 + 1)
|
||||
#define BLUE(n) ((n) * 3 + 2)
|
||||
|
||||
#define SET_ORIGIN(adp, o) do { \
|
||||
int oo = o; \
|
||||
if (oo != last_origin) \
|
||||
set_origin(adp, last_origin = oo); \
|
||||
} while (0)
|
||||
|
||||
static u_char *buf;
|
||||
static u_char *vid;
|
||||
static int banksize, scrmode, bpsl, scrw, scrh;
|
||||
@ -63,6 +69,7 @@ fire_update(video_adapter_t *adp)
|
||||
{
|
||||
int x, y;
|
||||
int o, p;
|
||||
int last_origin = -1;
|
||||
|
||||
/* make a new bottom line */
|
||||
for (x = 0, y = scrh; x < scrw; x++)
|
||||
@ -87,12 +94,12 @@ fire_update(video_adapter_t *adp)
|
||||
p -= banksize;
|
||||
o += banksize;
|
||||
}
|
||||
set_origin(adp, o);
|
||||
SET_ORIGIN(adp, o);
|
||||
if (p + scrw < banksize) {
|
||||
bcopy(buf + y * scrw, vid + p, scrw);
|
||||
} else {
|
||||
bcopy(buf + y * scrw, vid + p, banksize - p);
|
||||
set_origin(adp, o + banksize);
|
||||
SET_ORIGIN(adp, o + banksize);
|
||||
bcopy(buf + y * scrw + (banksize - p), vid,
|
||||
scrw - (banksize - p));
|
||||
p -= banksize;
|
||||
|
@ -42,6 +42,12 @@
|
||||
|
||||
#define SAVER_NAME "logo_saver"
|
||||
|
||||
#define SET_ORIGIN(adp, o) do { \
|
||||
int oo = o; \
|
||||
if (oo != last_origin) \
|
||||
set_origin(adp, last_origin = oo); \
|
||||
} while (0)
|
||||
|
||||
extern unsigned int logo_w;
|
||||
extern unsigned int logo_h;
|
||||
extern unsigned char logo_pal[];
|
||||
@ -56,10 +62,11 @@ static void
|
||||
logo_blit(video_adapter_t *adp, int x, int y)
|
||||
{
|
||||
int d, l, o, p;
|
||||
int last_origin = -1;
|
||||
|
||||
for (o = 0, p = y * bpsl + x; p > banksize; p -= banksize)
|
||||
o += banksize;
|
||||
set_origin(adp, o);
|
||||
SET_ORIGIN(adp, o);
|
||||
|
||||
for (d = 0; d < logo_img_size; d += logo_w) {
|
||||
if (p + logo_w < banksize) {
|
||||
@ -68,12 +75,12 @@ logo_blit(video_adapter_t *adp, int x, int y)
|
||||
} else if (p < banksize) {
|
||||
l = banksize - p;
|
||||
bcopy(logo_img + d, vid + p, l);
|
||||
set_origin(adp, (o += banksize));
|
||||
SET_ORIGIN(adp, (o += banksize));
|
||||
bcopy(logo_img + d + l, vid, logo_w - l);
|
||||
p += bpsl - banksize;
|
||||
} else {
|
||||
p -= banksize;
|
||||
set_origin(adp, (o += banksize));
|
||||
SET_ORIGIN(adp, (o += banksize));
|
||||
bcopy(logo_img + d, vid + p, logo_w);
|
||||
p += bpsl;
|
||||
}
|
||||
|
@ -51,6 +51,12 @@
|
||||
#define GREEN(n) ((n) * 3 + 1)
|
||||
#define BLUE(n) ((n) * 3 + 2)
|
||||
|
||||
#define SET_ORIGIN(adp, o) do { \
|
||||
int oo = o; \
|
||||
if (oo != last_origin) \
|
||||
set_origin(adp, last_origin = oo); \
|
||||
} while (0)
|
||||
|
||||
static u_char *vid;
|
||||
static int banksize, scrmode, bpsl, scrw, scrh;
|
||||
static u_char rain_pal[768];
|
||||
@ -73,6 +79,7 @@ rain_saver(video_adapter_t *adp, int blank)
|
||||
{
|
||||
int i, j, o, p, pl;
|
||||
u_char temp;
|
||||
int last_origin = -1;
|
||||
|
||||
if (blank) {
|
||||
/* switch to graphics mode */
|
||||
@ -87,18 +94,18 @@ rain_saver(video_adapter_t *adp, int blank)
|
||||
bpsl = adp->va_line_width;
|
||||
splx(pl);
|
||||
for (i = 0; i < bpsl*scrh; i += banksize) {
|
||||
set_origin(adp, i);
|
||||
SET_ORIGIN(adp, i);
|
||||
if ((bpsl * scrh - i) < banksize)
|
||||
bzero(vid, bpsl * scrh - i);
|
||||
else
|
||||
bzero(vid, banksize);
|
||||
}
|
||||
set_origin(adp, 0);
|
||||
SET_ORIGIN(adp, 0);
|
||||
for (i = 0, o = 0, p = 0; i < scrw; i += 2, p += 2) {
|
||||
if (p > banksize) {
|
||||
p -= banksize;
|
||||
o += banksize;
|
||||
set_origin(adp, o);
|
||||
SET_ORIGIN(adp, o);
|
||||
}
|
||||
vid[p] = 1 + (random() % MAX);
|
||||
}
|
||||
@ -109,12 +116,12 @@ rain_saver(video_adapter_t *adp, int blank)
|
||||
p -= banksize;
|
||||
o += banksize;
|
||||
}
|
||||
set_origin(adp, o);
|
||||
SET_ORIGIN(adp, o);
|
||||
temp = (vid[p] < MAX) ? 1 + vid[p] : 1;
|
||||
if (p + bpsl < banksize) {
|
||||
vid[p + bpsl] = temp;
|
||||
} else {
|
||||
set_origin(adp, o + banksize);
|
||||
SET_ORIGIN(adp, o + banksize);
|
||||
vid[p + bpsl - banksize] = temp;
|
||||
}
|
||||
}
|
||||
|
@ -44,6 +44,12 @@
|
||||
#define SPP 15
|
||||
#define STARS (SPP * (1 + 2 + 4 + 8))
|
||||
|
||||
#define SET_ORIGIN(adp, o) do { \
|
||||
int oo = o; \
|
||||
if (oo != last_origin) \
|
||||
set_origin(adp, last_origin = oo); \
|
||||
} while (0)
|
||||
|
||||
static u_char *vid;
|
||||
static int banksize, scrmode, bpsl, scrw, scrh;
|
||||
static int blanked;
|
||||
@ -61,6 +67,7 @@ static void
|
||||
warp_update(video_adapter_t *adp)
|
||||
{
|
||||
int i, j, k, n, o, p;
|
||||
int last_origin = -1;
|
||||
|
||||
for (i = 1, k = 0, n = SPP*8; i < 5; i++, n /= 2) {
|
||||
for (j = 0; j < n; j++, k++) {
|
||||
@ -70,7 +77,7 @@ warp_update(video_adapter_t *adp)
|
||||
p -= banksize;
|
||||
o += banksize;
|
||||
}
|
||||
set_origin(adp, o);
|
||||
SET_ORIGIN(adp, o);
|
||||
vid[p] = 0;
|
||||
star[k] += i;
|
||||
if (star[k] > scrw*scrh)
|
||||
@ -81,7 +88,7 @@ warp_update(video_adapter_t *adp)
|
||||
p -= banksize;
|
||||
o += banksize;
|
||||
}
|
||||
set_origin(adp, o);
|
||||
SET_ORIGIN(adp, o);
|
||||
vid[p] = i;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user