This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch devs/devilhorns/apos
in repository efl.
View the commit online.
commit 714b5a59db784f4ae2c6b1402ed83e8a2d3bad11
Author: Christopher Michael <devilho...@comcast.net>
AuthorDate: Wed Oct 9 11:08:15 2024 -0400
ecore_drm2: Add API function to create a new framebuffer
---
src/lib/ecore_drm2/ecore_drm2_fb.c | 100 +++++++++++++++++++++++++++++++++++++
1 file changed, 100 insertions(+)
diff --git a/src/lib/ecore_drm2/ecore_drm2_fb.c b/src/lib/ecore_drm2/ecore_drm2_fb.c
index b875d99ba3..13811dbcda 100644
--- a/src/lib/ecore_drm2/ecore_drm2_fb.c
+++ b/src/lib/ecore_drm2/ecore_drm2_fb.c
@@ -1 +1,101 @@
#include "ecore_drm2_private.h"
+
+static Eina_Bool
+_ecore_drm2_fb_add(Ecore_Drm2_Fb *fb)
+{
+ uint32_t offsets[4] = {0};
+ int ret;
+
+ ret = sym_drmModeAddFB2(fb->fd, fb->w, fb->h, fb->format, fb->handles,
+ fb->strides, offsets, &fb->id, 0);
+ if (ret) return EINA_FALSE;
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_drm2_fb_map(Ecore_Drm2_Fb *fb)
+{
+ struct drm_mode_map_dumb marg;
+ int ret;
+
+ memset(&marg, 0, sizeof(struct drm_mode_map_dumb));
+ marg.handle = fb->handles[0];
+ ret = sym_drmIoctl(fb->fd, DRM_IOCTL_MODE_MAP_DUMB, &marg);
+ if (ret)
+ {
+ ERR("Could not map Framebuffer: %m");
+ return EINA_FALSE;
+ }
+
+ fb->mmap = mmap(NULL, fb->sizes[0], PROT_WRITE, MAP_SHARED, fb->fd, marg.offset);
+ if (fb->mmap == MAP_FAILED)
+ {
+ ERR("Could not map Framebuffer: %m");
+ return EINA_FALSE;
+ }
+
+ return EINA_TRUE;
+}
+
+EAPI Ecore_Drm2_Fb *
+ecore_drm2_fb_create(Ecore_Drm2_Device *dev, int width, int height, int depth, int bpp, unsigned int format)
+{
+ Ecore_Drm2_Fb *fb;
+ struct drm_mode_create_dumb carg;
+ struct drm_mode_destroy_dumb darg;
+ int ret;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(dev, NULL);
+
+ fb = calloc(1, sizeof(Ecore_Drm2_Fb));
+ if (!fb) return NULL;
+
+ fb->fd = dev->fd;
+ fb->w = width;
+ fb->h = height;
+ fb->bpp = bpp;
+ fb->depth = depth;
+ fb->format = format;
+
+ memset(&carg, 0, sizeof(struct drm_mode_create_dumb));
+ carg.bpp = bpp;
+ carg.width = width;
+ carg.height = height;
+
+ ret = sym_drmIoctl(dev->fd, DRM_IOCTL_MODE_CREATE_DUMB, &carg);
+ if (!ret) goto err;
+
+ fb->handles[0] = carg.handle;
+ fb->sizes[0] = carg.size;
+ fb->strides[0] = carg.pitch;
+
+ if (!_ecore_drm2_fb_add(fb))
+ {
+ ret =
+ sym_drmModeAddFB(dev->fd, width, height, depth, bpp,
+ fb->strides[0], fb->handles[0], &fb->id);
+ if (ret)
+ {
+ ERR("Could not add Framebuffer: %m");
+ goto add_err;
+ }
+ }
+
+ if (!_ecore_drm2_fb_map(fb))
+ {
+ ERR("Could not map Framebuffer");
+ goto map_err;
+ }
+
+ return fb;
+
+map_err:
+ sym_drmModeRmFB(dev->fd, fb->id);
+add_err:
+ memset(&darg, 0, sizeof(struct drm_mode_destroy_dumb));
+ darg.handle = fb->handles[0];
+ sym_drmIoctl(dev->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &darg);
+err:
+ free(fb);
+ return NULL;
+}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.