summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEdward O'Callaghan <funfunctor@folklore1984.net>2017-03-06 12:15:29 +1100
committerEdward O'Callaghan <funfunctor@folklore1984.net>2017-03-06 12:16:04 +1100
commitd76af6a2fccc296e74a870ad1f21d63b6d5e95f9 (patch)
treefe74c95b84f44d089f46dff7042276744cb8e196 /src
parentdf3bb3446af010268b5621cca9a04184c05964ac (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.txt1
-rw-r--r--src/drm.c53
-rw-r--r--src/drm.h22
-rw-r--r--src/framebuffer.c5
-rw-r--r--src/gl_minimal.c16
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...
}