From 524db0cf19648e3c7c78d3e73103b7a0bdcd6bfc Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Wed, 18 Jan 2017 17:14:52 -0800 Subject: *: move source into src/ subdir Restoring some organizational sanity since adopting autotools. --- src/rototiller.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/rototiller.c (limited to 'src/rototiller.c') diff --git a/src/rototiller.c b/src/rototiller.c new file mode 100644 index 0000000..3fa9395 --- /dev/null +++ b/src/rototiller.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "drmsetup.h" +#include "fb.h" +#include "fps.h" +#include "rototiller.h" +#include "util.h" + +/* Copyright (C) 2016 Vito Caputo */ + +#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; +extern rototiller_renderer_t stars_renderer; + +static rototiller_renderer_t *renderers[] = { + &roto32_renderer, + &roto64_renderer, + &ray_renderer, + &sparkler_renderer, + &stars_renderer, +}; + + +static void renderer_select(int *renderer) +{ + int i; + + printf("\nRenderers\n"); + 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, "Select 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); + + pexit_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; +} -- cgit v1.2.1