diff options
author | Edward O'Callaghan <funfunctor@folklore1984.net> | 2017-03-06 12:15:29 +1100 |
---|---|---|
committer | Edward O'Callaghan <funfunctor@folklore1984.net> | 2017-03-06 12:16:04 +1100 |
commit | d76af6a2fccc296e74a870ad1f21d63b6d5e95f9 (patch) | |
tree | fe74c95b84f44d089f46dff7042276744cb8e196 /src | |
parent | df3bb3446af010268b5621cca9a04184c05964ac (diff) |
src: refactor drm/fb stuff out
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/drm.c | 53 | ||||
-rw-r--r-- | src/drm.h | 22 | ||||
-rw-r--r-- | src/framebuffer.c | 5 | ||||
-rw-r--r-- | src/gl_minimal.c | 16 |
5 files changed, 81 insertions, 16 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 90d177d..adc42f3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,7 @@ add_library(baregl_lib SHARED modesetting.c framebuffer.c egl.c + drm.c ) add_library(gl_app SHARED gl_minimal.c diff --git a/src/drm.c b/src/drm.c new file mode 100644 index 0000000..b70c6fd --- /dev/null +++ b/src/drm.c @@ -0,0 +1,53 @@ +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <xf86drm.h> +#include <xf86drmMode.h> + +#include "drm.h" + +static void drm_fb_destroy_callback(struct gbm_bo *bo, void *data) +{ + struct drm_fb_xxx *fb = data; + int drm_fd = gbm_device_get_fd(gbm_bo_get_device(bo)); + + if (fb->fb_id) + drmModeRmFB(drm_fd, fb->fb_id); + + free(fb); +} + +struct drm_fb_xxx * drm_fb_get_from_bo(struct gbm_bo *bo) +{ + struct drm_fb_xxx *fb = gbm_bo_get_user_data(bo); + int ret; + + if (fb) + return fb; + + uint32_t bpp = 32, depth = 24; + int drm_fd = gbm_device_get_fd(gbm_bo_get_device(bo)); + + fb = calloc(1, sizeof(*fb)); + fb->bo = bo; + + /* create framebuffer object for the gbm bo extracted from the gbm surf */ + ret = drmModeAddFB(drm_fd, + gbm_bo_get_width(bo), + gbm_bo_get_height(bo), + depth, bpp, + gbm_bo_get_stride(bo), + gbm_bo_get_handle(bo).u32, + &fb->fb_id); + if (ret) { + fprintf(stderr, "failed to create fb: %s\n", strerror(errno)); + free(fb); + return NULL; + } + + gbm_bo_set_user_data(bo, fb, drm_fb_destroy_callback); + + return fb; +} diff --git a/src/drm.h b/src/drm.h new file mode 100644 index 0000000..d15cd34 --- /dev/null +++ b/src/drm.h @@ -0,0 +1,22 @@ +#ifndef XXX_DRM_H +#define XXX_DRM_H + +#include <gbm.h> + +/** + * .. + */ +struct drm_fb_xxx { + uint32_t fb_id; + struct gbm_bo * bo; +}; + +/** + * Creates a framebuffer object for the gbm bo + * extracted from the gbm surface. The life-time of the + * returned framebuffer object attached to the gbm bo + * is handled by gbm for us. + */ +struct drm_fb_xxx * drm_fb_get_from_bo(struct gbm_bo *bo); + +#endif /* XXX_DRM_H */ diff --git a/src/framebuffer.c b/src/framebuffer.c index 15bf685..3f8ae2b 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -118,7 +118,6 @@ static int modeset_create_gbm_fb(struct drm_fb *dev, int fd) struct gbm_device * gbm_dev = gbm_create_device(fd); if (!gbm_dev) { fprintf(stderr, "cannot create gbm device\n"); - close(fd); return -1; } dev->gbm_dev = gbm_dev; @@ -126,7 +125,8 @@ static int modeset_create_gbm_fb(struct drm_fb *dev, int fd) dev->gbm_surface = gbm_surface_create(gbm_dev, dev->width, dev->height, format, flags); if (!dev->gbm_surface) { fprintf(stderr, "failed to create gbm surface\n"); - // XXX cleanup + gbm_device_destroy(gbm_dev); + dev->gbm_dev = NULL; return -1; } @@ -137,7 +137,6 @@ static int modeset_cleanup_gbm_fb(struct drm_fb *dev, int fd) { gbm_surface_destroy(dev->gbm_surface); gbm_device_destroy(dev->gbm_dev); - drmModeRmFB(fd, dev->fb); } int modeset_create_fb(struct drm_fb *dev, int fd, bool is_accelerated) diff --git a/src/gl_minimal.c b/src/gl_minimal.c index b5d29df..db63d72 100644 --- a/src/gl_minimal.c +++ b/src/gl_minimal.c @@ -7,6 +7,7 @@ #include "egl.h" #include "common.h" +#include "drm.h" void run_gl_example(struct display * d) { @@ -108,17 +109,6 @@ void run_gl_example(struct display * d) struct gbm_bo * bo; bo = gbm_surface_lock_front_buffer(d->dev->gbm_surface); assert(bo); - - uint32_t bpp = 32, depth = 24; - /* create framebuffer object for the gbm bo extracted from the gbm surf */ - int ret = drmModeAddFB(d->rnode.fd, - gbm_bo_get_width(bo), - gbm_bo_get_height(bo), - depth, bpp, - gbm_bo_get_stride(bo), - gbm_bo_get_handle(bo).u32, - &d->dev->fb); - if (ret) { - fprintf(stderr, "cannot create framebuffer\n"); - } + struct drm_fb_xxx * fb_xxx = drm_fb_get_from_bo(bo); + d->dev->fb = fb_xxx->fb_id; // XXX modeset_crtc() needs this state later... } |