1/**
2 * \file
3 * \brief Framebuffer glue
4 */
5
6/*
7 * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
8 * All rights reserved.
9 *
10 * This file is distributed under the terms in the attached LICENSE file.
11 * If you do not find this file, copies can be found by writing to:
12 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
13 */
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <barrelfish/barrelfish.h>
18#include <barrelfish/nameservice_client.h>
19#include <if/fb_defs.h>
20
21#include "demo.h"
22
23static struct fb_binding *fb_client;
24static bool init = false;
25
26static void fb_bind_cb(void *st, errval_t err, struct fb_binding *b)
27{
28    assert(err_is_ok(err));
29
30    fb_client = b;
31    fb_rpc_client_init(fb_client);
32    init = true;
33}
34
35static int fb_client_connect(void)
36{
37    iref_t iref;
38    errval_t err;
39
40    err = nameservice_blocking_lookup("framebuffer", &iref);
41    if (err_is_fail(err)) {
42        USER_PANIC_ERR(err, "nameserver lookup");
43    }
44
45    err = fb_bind(iref, fb_bind_cb, NULL, get_default_waitset(),
46                  IDC_BIND_FLAG_RPC_CAP_TRANSFER);
47    if (err_is_fail(err)) {
48        USER_PANIC_ERR(err, "fb bind");
49    }
50
51    while(!init) {
52        messages_wait_and_handle_next();
53    }
54
55    return 0;
56}
57
58void wait_for_vsync(void)
59{
60    errval_t err = fb_client->rpc_tx_vtbl.vsync(fb_client);
61    assert(err_is_ok(err));
62}
63
64int main(int argc, char *argv[])
65{
66    errval_t err, ret;
67
68    // Parse commandline
69    if(argc < 4) {
70        fprintf(stderr, "Usage: %s <xres> <yres> <bpp>\n",
71                argv[0]);
72        return EXIT_FAILURE;
73    }
74
75    int xres = atoi(argv[1]);
76    int yres = atoi(argv[2]);
77    int bpp = atoi(argv[3]);
78
79    fb_client_connect();
80
81    err = fb_client->rpc_tx_vtbl.set_videomode(fb_client, xres, yres, bpp, &ret);
82    assert(err_is_ok(err));
83    if(err_is_fail(ret)) {
84        fprintf(stderr, "Error: failed to set video mode %dx%d %dbpp\n",
85                xres, yres, bpp);
86        return EXIT_FAILURE;
87    }
88
89    // Get and map framebuffer
90    struct capref fbcap;
91    uint32_t fboffset;
92    err = fb_client->rpc_tx_vtbl.get_framebuffer(fb_client, &ret, &fbcap, &fboffset);
93    assert(err_is_ok(err));
94    assert(err_is_ok(ret));
95
96    struct frame_identity fbid = { .base = 0, .bytes = 0 };
97    err = frame_identify(fbcap, &fbid);
98    assert(err == 0);
99    char *vidmem;
100    err = vspace_map_one_frame((void**)&vidmem, fbid.bytes, fbcap,
101                               NULL, NULL);
102    assert(err_is_ok(err));
103
104    vidmem += fboffset;
105
106    vesa_demo(vidmem, xres, yres, bpp);
107
108    return 0;
109}
110