summaryrefslogtreecommitdiff
path: root/src/framebuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/framebuffer.c')
-rw-r--r--src/framebuffer.c160
1 files changed, 0 insertions, 160 deletions
diff --git a/src/framebuffer.c b/src/framebuffer.c
deleted file mode 100644
index 3f8ae2b..0000000
--- a/src/framebuffer.c
+++ /dev/null
@@ -1,160 +0,0 @@
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <unistd.h>
-
-#include <sys/mman.h>
-
-#include <gbm.h>
-#include <xf86drm.h>
-#include <xf86drmMode.h>
-
-#include "common.h"
-
-
-/**
- * After we have found a crtc+connector+mode combination,
- * we need to actually create a suitable framebuffer that
- * we can use with it. There are two ways to do that:
- *
- * - We create a so-called "dumb buffer" (We do this here).
- * This is a buffer that we can mmap() and every driver
- * supports this. We can use it for unaccelerated software
- * rendering on the CPU.
- *
- * - We use libgbm to create buffers available for hardware
- * accelerated rendering. libgbm is an abstraction layer
- * that creates these buffers for each available DRM driver.
- * As there is no generic API for this, each driver provides
- * its own mechanism to create these buffers. We can then
- * use such buffers to create OpenGL contexts with the Mesa3D
- * library.
- */
-static int modeset_create_dumb_fb(struct drm_fb *dev, int fd)
-{
- struct drm_mode_create_dumb creq;
- struct drm_mode_destroy_dumb dreq;
- struct drm_mode_map_dumb mreq;
- int ret;
-
- /* create dumb buffer */
- memset(&creq, 0, sizeof(creq));
- creq.width = dev->width;
- creq.height = dev->height;
- creq.bpp = 32;
- ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
- if (ret < 0) {
- fprintf(stderr, "cannot create dumb buffer (%d): %m\n", errno);
- return -errno;
- }
- dev->stride = creq.pitch;
- dev->size = creq.size;
- dev->handle = creq.handle;
-
- /* create framebuffer object for the dumb-buffer */
- ret = drmModeAddFB(fd, dev->width, dev->height, 24, 32, dev->stride, dev->handle, &dev->fb);
- if (ret) {
- fprintf(stderr, "cannot create framebuffer (%d): %m\n", errno);
- ret = -errno;
- goto err_destroy;
- }
-
- /* prepare buffer for memory mapping */
- memset(&mreq, 0, sizeof(mreq));
- mreq.handle = dev->handle;
- ret = drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq);
- if (ret) {
- fprintf(stderr, "cannot map dumb buffer (%d): %m\n", errno);
- ret = -errno;
- goto err_fb;
- }
-
- /* preform the actual memory mapping */
- dev->map = mmap(0, dev->size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, mreq.offset);
- if (dev->map == MAP_FAILED) {
- fprintf(stderr, "cannot mmap dumb buffer (%d): %m\n", errno);
- ret = -errno;
- goto err_fb;
- }
-
- memset(dev->map, 0, dev->size);
-
- return 0;
-
-err_fb:
- drmModeRmFB(fd, dev->fb);
-err_destroy:
- memset(&dreq, 0, sizeof(dreq));
- dreq.handle = dev->handle;
- drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &dreq);
- return ret;
-}
-
-static int modeset_cleanup_dumb_fb(struct drm_fb *dev, int fd)
-{
- struct drm_mode_destroy_dumb dreq = {0};
-
- /* unmap buffer */
- munmap(dev->map, dev->size);
- /* remove framebuffer */
- drmModeRmFB(fd, dev->fb);
- /* delete dumb buffer */
- dreq.handle = dev->handle;
- drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &dreq);
-}
-
-static int modeset_create_gbm_fb(struct drm_fb *dev, int fd)
-{
- unsigned flags = GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT;
-
- int format = GBM_FORMAT_XRGB8888;
- uint32_t bpp = 32, depth = 24;
-
- int ret;
-
- struct gbm_device * gbm_dev = gbm_create_device(fd);
- if (!gbm_dev) {
- fprintf(stderr, "cannot create gbm device\n");
- return -1;
- }
- dev->gbm_dev = gbm_dev;
-
- 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");
- gbm_device_destroy(gbm_dev);
- dev->gbm_dev = NULL;
- return -1;
- }
-
- return 0;
-}
-
-static int modeset_cleanup_gbm_fb(struct drm_fb *dev, int fd)
-{
- gbm_surface_destroy(dev->gbm_surface);
- gbm_device_destroy(dev->gbm_dev);
-}
-
-int modeset_create_fb(struct drm_fb *dev, int fd, bool is_accelerated)
-{
- int ret;
-
- if (is_accelerated) // do accel path
- ret = modeset_create_gbm_fb(dev, fd);
- else // fallback
- ret = modeset_create_dumb_fb(dev, fd);
-
- return ret;
-}
-
-void modeset_cleanup_fb(struct drm_fb *dev, int fd, bool is_accelerated)
-{
- if (is_accelerated) // do accel path
- modeset_cleanup_gbm_fb(dev, fd);
- else // fallback
- modeset_cleanup_dumb_fb(dev, fd);
-}