1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/*
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License.
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License.
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h>
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h>
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <fcntl.h>
21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h>
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/ioctl.h>
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/mman.h>
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h>
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <time.h>
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <linux/fb.h>
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <linux/kd.h>
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
31480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinstruct simple_fb {
32480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    void *data;
33480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    int width;
34480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    int height;
35480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    int stride;
36480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    int bpp;
37480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin};
38480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
39480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinstatic struct simple_fb gr_fbs[2];
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic unsigned gr_active_fb = 0;
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int gr_fb_fd = -1;
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int gr_vt_fd = -1;
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic struct fb_var_screeninfo vi;
46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct fb_fix_screeninfo fi;
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct timespec tv, tv2;
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void dumpinfo(struct fb_fix_screeninfo *fi,
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                     struct fb_var_screeninfo *vi);
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
52480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinstatic int get_framebuffer(struct simple_fb *fb, unsigned bpp)
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int fd;
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    void *bits;
56480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    int bytes_per_pixel;
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fd = open("/dev/graphics/fb0", O_RDWR);
59acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    if (fd < 0) {
60acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        printf("cannot open /dev/graphics/fb0, retrying with /dev/fb0\n");
61acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        if ((fd = open("/dev/fb0", O_RDWR)) < 0) {
62acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            perror("cannot open /dev/fb0");
63acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            return -1;
64acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        }
65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
67480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    if(ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) {
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        perror("failed to get fb0 info");
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return -1;
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
72480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    if (bpp && vi.bits_per_pixel != bpp) {
73480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        printf("bpp != %d, forcing...\n", bpp);
74480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        vi.bits_per_pixel = bpp;
75480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        if(ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
76480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            perror("failed to force bpp");
77480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            return -1;
78480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        }
79480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    }
80480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
81480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    if(ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) {
82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        perror("failed to get fb0 info");
83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return -1;
84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    dumpinfo(&fi, &vi);
87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(bits == MAP_FAILED) {
90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        perror("failed to mmap framebuffer");
91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return -1;
92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
94480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    bytes_per_pixel = vi.bits_per_pixel >> 3;
95480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->width = vi.xres;
97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->height = vi.yres;
98480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    fb->stride = fi.line_length / bytes_per_pixel;
99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->data = bits;
100480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    fb->bpp = vi.bits_per_pixel;
101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb++;
103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->width = vi.xres;
105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->height = vi.yres;
106480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    fb->stride = fi.line_length / bytes_per_pixel;
107480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    fb->data = (void *)((unsigned long)bits +
108480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                        vi.yres * vi.xres * bytes_per_pixel);
109480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    fb->bpp = vi.bits_per_pixel;
110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return fd;
112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void set_active_framebuffer(unsigned n)
115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(n > 1) return;
117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    vi.yres_virtual = vi.yres * 2;
118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    vi.yoffset = n * vi.yres;
119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        fprintf(stderr,"active fb swap failed!\n");
121365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin    } else
122365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin        printf("active buffer: %d\n", n);
123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void dumpinfo(struct fb_fix_screeninfo *fi, struct fb_var_screeninfo *vi)
126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.xres = %d\n", vi->xres);
128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.yres = %d\n", vi->yres);
129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.xresv = %d\n", vi->xres_virtual);
130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.yresv = %d\n", vi->yres_virtual);
131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.xoff = %d\n", vi->xoffset);
132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.yoff = %d\n", vi->yoffset);
133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr, "vi.bits_per_pixel = %d\n", vi->bits_per_pixel);
134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
135e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr, "fi.line_length = %d\n", fi->line_length);
136e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
138e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
139480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinint gr_init(int bpp, int id)
140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
141acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    int fd = -1;
142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
143acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    if (!access("/dev/tty0", F_OK)) {
144acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        fd = open("/dev/tty0", O_RDWR | O_SYNC);
145acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        if(fd < 0)
146acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            return -1;
147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
148acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        if(ioctl(fd, KDSETMODE, (void*) KD_GRAPHICS)) {
149acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            close(fd);
150acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            return -1;
151acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        }
152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
154480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    gr_fb_fd = get_framebuffer(gr_fbs, bpp);
155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(gr_fb_fd < 0) {
157acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        if (fd >= 0) {
158acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            ioctl(fd, KDSETMODE, (void*) KD_TEXT);
159acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            close(fd);
160acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        }
161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return -1;
162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    gr_vt_fd = fd;
165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        /* start with 0 as front (displayed) and 1 as back (drawing) */
167480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    gr_active_fb = id;
168480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    set_active_framebuffer(id);
169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
172e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
173e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid gr_exit(void)
174e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
175e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    close(gr_fb_fd);
176e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    gr_fb_fd = -1;
177e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
178acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    if (gr_vt_fd >= 0) {
179acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        ioctl(gr_vt_fd, KDSETMODE, (void*) KD_TEXT);
180acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        close(gr_vt_fd);
181acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        gr_vt_fd = -1;
182acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    }
183e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
184e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
185e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint gr_fb_width(void)
186e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
187480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    return gr_fbs[0].width;
188e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
189e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
190e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint gr_fb_height(void)
191e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
192480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    return gr_fbs[0].height;
193e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
194e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
195e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t red = 0xf800;
196e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t green = 0x07e0;
197e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t blue = 0x001f;
198480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint16_t white = 0xffff;
199480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint16_t black = 0x0;
200480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
201480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t red32 = 0x00ff0000;
202480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t green32 = 0x0000ff00;
203480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t blue32 = 0x000000ff;
204480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t white32 = 0x00ffffff;
205480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t black32 = 0x0;
206480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
207480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinvoid draw_grid(int w, int h, void* _loc) {
208480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    int i, j;
209480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    int v;
210480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    int stride = fi.line_length / (vi.bits_per_pixel >> 3);
211480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    uint16_t *loc = _loc;
212480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    uint32_t *loc32 = _loc;
213480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
214480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    for (j = 0; j < h/2; j++) {
215480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        for (i = 0; i < w/2; i++)
216480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            if (vi.bits_per_pixel == 16)
217480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc[i + j*(stride)] = red;
218480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            else
219480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc32[i + j*(stride)] = red32;
220480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        for (; i < w; i++)
221480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            if (vi.bits_per_pixel == 16)
222480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc[i + j*(stride)] = green;
223480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            else
224480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc32[i + j*(stride)] = green32;
225480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    }
226e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
227480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    for (; j < h; j++) {
228480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        for (i = 0; i < w/2; i++)
229480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            if (vi.bits_per_pixel == 16)
230480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc[i + j*(stride)] = blue;
231480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            else
232480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc32[i + j*(stride)] = blue32;
233480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        for (; i < w; i++)
234480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            if (vi.bits_per_pixel == 16)
235480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc[i + j*(stride)] = white;
236480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            else
237480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc32[i + j*(stride)] = white32;
238480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    }
239e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
240e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
241e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
242480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinvoid clear_screen(int w, int h, void* _loc)
243e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
244e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int i,j;
245e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int stride = fi.line_length / (vi.bits_per_pixel >> 3);
246480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    uint16_t *loc = _loc;
247480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    uint32_t *loc32 = _loc;
248480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
249480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin    for (j = 0; j < h; j++)
250480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin        for (i = 0; i < w; i++)
251480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            if (vi.bits_per_pixel == 16)
252480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc[i + j*(stride)] = black;
253480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin            else
254480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin                loc32[i + j*(stride)] = black32;
255e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
256e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
257e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, char **argv) {
258e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  int w;
259e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  int h;
260365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  int id = 0;
261480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  int bpp = 0;
262480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
263480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  if (argc > 1)
264480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin      bpp = atoi(argv[1]);
265480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
266480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  if (argc > 4)
267480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin      id = !!atoi(argv[4]);
268480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
269480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  gr_init(bpp, id);
270480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
271480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  if (argc > 3) {
272480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin      w = atoi(argv[2]);
273480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin      h = atoi(argv[3]);
274480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  } else {
275480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin      w = vi.xres;
276480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin      h = vi.yres;
277e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  }
278e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
279480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  clear_screen(vi.xres, vi.yres, gr_fbs[0].data);
280480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  clear_screen(vi.xres, vi.yres, gr_fbs[1].data);
281480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin
282480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin  draw_grid(w, h, gr_fbs[id].data);
283365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin
284365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  set_active_framebuffer(!id);
285365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  set_active_framebuffer(id);
286e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
287e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  return 0;
288e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
289