diff options
author | Vito Caputo <vcaputo@gnugeneration.com> | 2016-12-13 08:02:53 -0800 |
---|---|---|
committer | Vito Caputo <vcaputo@gnugeneration.com> | 2016-12-13 08:02:53 -0800 |
commit | caa97fbe3e14d9ab9d377369ff9c2e1ee5aa2e18 (patch) | |
tree | ac64a7b9ef7780345c25019cce31119aab4f81cd | |
parent | 8340e615d46615894b44b4ffce5dc2dd86cbad40 (diff) |
rototiller: new main w/modular renderers
This will be replacing the old rototiller listings, and uses all the
new stuff (drm_setup, fb, fps, renderers...)
-rw-r--r-- | rototiller.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/rototiller.c b/rototiller.c new file mode 100644 index 0000000..b1c8c36 --- /dev/null +++ b/rototiller.c @@ -0,0 +1,85 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <inttypes.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#include <unistd.h> +#include <xf86drm.h> +#include <xf86drmMode.h> + +#include "drmsetup.h" +#include "fb.h" +#include "fps.h" +#include "rototiller.h" +#include "util.h" + +/* Copyright (C) 2016 Vito Caputo <vcaputo@pengaru.com> */ + +#define NUM_FB_PAGES 3 +/* ^ By triple-buffering, we can have a page tied up being displayed, another + * tied up submitted and waiting for vsync, and still not block on getting + * another page so we can begin rendering another frame before vsync. With + * just two pages we end up twiddling thumbs until the vsync arrives. + */ + +extern rototiller_renderer_t roto32_renderer; +extern rototiller_renderer_t roto64_renderer; +extern rototiller_renderer_t ray_renderer; +extern rototiller_renderer_t sparkler_renderer; + +static rototiller_renderer_t *renderers[] = { + &roto32_renderer, + &roto64_renderer, + &ray_renderer, + &sparkler_renderer, +}; + + +static void renderer_select(int *renderer) +{ + int i; + + puts(""); + for (i = 0; i < nelems(renderers); i++) { + printf("%i: %s - %s\n", i, renderers[i]->name, renderers[i]->description); + } + + ask_num(renderer, nelems(renderers) - 1, "Renderer", 0); +} + + +int main(int argc, const char *argv[]) +{ + int drm_fd; + drmModeModeInfoPtr drm_mode; + uint32_t drm_crtc_id; + uint32_t drm_connector_id; + fb_t *fb; + int renderer; + + drm_setup(&drm_fd, &drm_crtc_id, &drm_connector_id, &drm_mode); + renderer_select(&renderer); + + exit_if(!(fb = fb_new(drm_fd, drm_crtc_id, &drm_connector_id, 1, drm_mode, NUM_FB_PAGES)), + "unable to create fb"); + + pexit_if(!fps_setup(), + "unable to setup fps counter"); + + for (;;) { + fb_page_t *page; + + fps_print(fb); + + page = fb_page_get(fb); + renderers[renderer]->render(&page->fragment); + fb_page_put(fb, page); + } + + fb_free(fb); + close(drm_fd); + + return EXIT_SUCCESS; +} |