diff options
author | Vito Caputo <vcaputo@gnugeneration.com> | 2016-11-23 18:01:39 -0800 |
---|---|---|
committer | Vito Caputo <vcaputo@gnugeneration.com> | 2016-11-23 18:01:39 -0800 |
commit | 46a41227ab8f10ecbcb3d960703986692b64b62d (patch) | |
tree | fea99f51965a29bc3d0004411d69350a6efcf7a6 /fb.h | |
parent | 3ea61db55a9c21f7621f8a64d91153cb1955b2ff (diff) |
fb: add rudimentary drm fb and page api
This implementation uses a page flipping thread and very simple
pthreads mutex/condition variable synchronization. There is room
for improvement, but this combined with 3 fb pages enables the
rendering loop to fully overlap with page flipping with the next
ready page queued asynchronously.
Diffstat (limited to 'fb.h')
-rw-r--r-- | fb.h | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -0,0 +1,37 @@ +#ifndef _FB_H +#define _FB_H + +#include <stdint.h> +#include <sys/types.h> +#include <xf86drmMode.h> /* for drmModeModeInfoPtr */ + +/* All renderers should target fb_fragment_t, which may or may not represent + * a full-screen mmap. Helpers are provided for subdividing fragments for + * concurrent renderers. + */ +typedef struct fb_fragment_t { + uint32_t *buf; /* pointer to the first pixel in the fragment */ + unsigned x, y; /* absolute coordinates of the upper left corner of this fragment */ + unsigned width, height; /* width and height of this fragment */ + unsigned stride; /* number of bytes from the end of one row to the start of the next */ +} fb_fragment_t; + +/* This is a page handle object for page flip submission/life-cycle. + * Outside of fb_page_get()/fb_page_put(), you're going to be interested in + * fb_fragment_t. The fragment included here describes the whole page, + * it may be divided via fb_fragment_divide(). + */ +typedef struct fb_page_t { + fb_fragment_t fragment; +} fb_page_t; + +typedef struct fb_t fb_t; + +fb_page_t * fb_page_get(fb_t *fb); +void fb_page_put(fb_t *fb, fb_page_t *page); +void fb_free(fb_t *fb); +void fb_get_put_pages_count(fb_t *fb, unsigned *count); +fb_t * fb_new(int drm_fd, uint32_t crtc_id, uint32_t *connectors, int n_connectors, drmModeModeInfoPtr mode, int n_pages); +void fb_fragment_divide(fb_fragment_t *fragment, unsigned n_fragments, fb_fragment_t fragments[]); + +#endif |