diff options
Diffstat (limited to 'src/framebuffer.c')
-rw-r--r-- | src/framebuffer.c | 160 |
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); -} |