forked from enlightenment/efl
evas-drm: Use Ecore_Drm_Fb for framebuffers
Summary: This commit changes the evas drm engine to use Ecore_Drm_Fb for framebuffers. We remove the old 'Buffer' structure from the evas engine and replace it in Outbuf with Ecore_Drm_Fb. This also removes unused functions from the evas_drm.c file as we can now use ecore_drm_fb calls @fix Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
parent
318f2c435a
commit
d815d9bd10
|
@ -233,7 +233,7 @@ evas_drm_outbuf_setup(Outbuf *ob)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer)
|
evas_drm_outbuf_framebuffer_set(Outbuf *ob, Ecore_Drm_Fb *buffer)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -242,115 +242,13 @@ evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer)
|
||||||
|
|
||||||
/* DBG("Drm Framebuffer Set: %d", buffer->fb); */
|
/* DBG("Drm Framebuffer Set: %d", buffer->fb); */
|
||||||
|
|
||||||
buffer->valid = EINA_FALSE;
|
ret = drmModeSetCrtc(ob->priv.fd, ob->priv.crtc, buffer->id, 0, 0,
|
||||||
ret = drmModeSetCrtc(ob->priv.fd, ob->priv.crtc, buffer->fb, 0, 0,
|
|
||||||
&ob->priv.conn, 1, &ob->priv.mode);
|
&ob->priv.conn, 1, &ob->priv.mode);
|
||||||
|
|
||||||
if (ret) ERR("Failed to set crtc: %m");
|
if (ret) ERR("Failed to set crtc: %m");
|
||||||
else buffer->valid = EINA_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Eina_Bool
|
Eina_Bool
|
||||||
evas_drm_framebuffer_create(int fd, Buffer *buffer, int depth)
|
evas_drm_framebuffer_send(Outbuf *ob, Ecore_Drm_Fb *buffer)
|
||||||
{
|
|
||||||
struct drm_mode_create_dumb carg;
|
|
||||||
struct drm_mode_destroy_dumb darg;
|
|
||||||
struct drm_mode_map_dumb marg;
|
|
||||||
|
|
||||||
/* check for valid info */
|
|
||||||
if (fd < 0) return EINA_FALSE;
|
|
||||||
|
|
||||||
/* try to create a dumb buffer */
|
|
||||||
memset(&carg, 0, sizeof(carg));
|
|
||||||
carg.width = buffer->w;
|
|
||||||
carg.height = buffer->h;
|
|
||||||
carg.bpp = depth;
|
|
||||||
|
|
||||||
if (drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &carg) < 0)
|
|
||||||
{
|
|
||||||
ERR("Could not create dumb buffer: %m");
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer->stride = carg.pitch;
|
|
||||||
buffer->size = carg.size;
|
|
||||||
buffer->handle = carg.handle;
|
|
||||||
|
|
||||||
DBG("Buffer: %d %d", buffer->w, buffer->h);
|
|
||||||
DBG("Buffer Stride: %d", buffer->stride);
|
|
||||||
DBG("Buffer Size: %d", buffer->size);
|
|
||||||
|
|
||||||
/* try to create a framebuffer object */
|
|
||||||
/* FIXME: Hardcoded bpp */
|
|
||||||
if (drmModeAddFB(fd, buffer->w, buffer->h, 24, depth, buffer->stride,
|
|
||||||
buffer->handle, &buffer->fb))
|
|
||||||
{
|
|
||||||
ERR("Could not create framebuffer object: %m");
|
|
||||||
goto add_err;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG("Creating dumb buffer: %d %d %d %d", buffer->fb,
|
|
||||||
buffer->w, buffer->h, depth);
|
|
||||||
|
|
||||||
/* try to mmap the buffer */
|
|
||||||
memset(&marg, 0, sizeof(marg));
|
|
||||||
marg.handle = buffer->handle;
|
|
||||||
if (drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &marg))
|
|
||||||
{
|
|
||||||
ERR("Could not map dumb buffer: %m");
|
|
||||||
goto map_err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do actual mmap of memory */
|
|
||||||
buffer->data =
|
|
||||||
mmap(NULL, buffer->size, (PROT_READ | PROT_WRITE),
|
|
||||||
MAP_SHARED, fd, marg.offset);
|
|
||||||
if (buffer->data == MAP_FAILED)
|
|
||||||
{
|
|
||||||
ERR("Could not mmap dumb buffer: %m");
|
|
||||||
goto map_err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clear memory */
|
|
||||||
memset(buffer->data, 0, buffer->size);
|
|
||||||
|
|
||||||
return EINA_TRUE;
|
|
||||||
|
|
||||||
map_err:
|
|
||||||
/* remove the framebuffer */
|
|
||||||
drmModeRmFB(fd, buffer->fb);
|
|
||||||
|
|
||||||
add_err:
|
|
||||||
/* destroy buffer */
|
|
||||||
memset(&darg, 0, sizeof(darg));
|
|
||||||
darg.handle = buffer->handle;
|
|
||||||
drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &darg);
|
|
||||||
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
evas_drm_framebuffer_destroy(int fd, Buffer *buffer)
|
|
||||||
{
|
|
||||||
struct drm_mode_destroy_dumb darg;
|
|
||||||
|
|
||||||
/* check for valid info */
|
|
||||||
if (fd < 0) return;
|
|
||||||
|
|
||||||
/* unmap the buffer data */
|
|
||||||
if (buffer->data) munmap(buffer->data, buffer->size);
|
|
||||||
|
|
||||||
/* remove the framebuffer */
|
|
||||||
drmModeRmFB(fd, buffer->fb);
|
|
||||||
|
|
||||||
/* destroy buffer */
|
|
||||||
memset(&darg, 0, sizeof(darg));
|
|
||||||
darg.handle = buffer->handle;
|
|
||||||
drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &darg);
|
|
||||||
}
|
|
||||||
|
|
||||||
Eina_Bool
|
|
||||||
evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer)
|
|
||||||
{
|
{
|
||||||
/* check for valid Output buffer */
|
/* check for valid Output buffer */
|
||||||
if ((!ob) || (ob->priv.fd < 0)) return EINA_FALSE;
|
if ((!ob) || (ob->priv.fd < 0)) return EINA_FALSE;
|
||||||
|
@ -361,7 +259,7 @@ evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer)
|
||||||
if (ob->vsync)
|
if (ob->vsync)
|
||||||
{
|
{
|
||||||
if (drmModePageFlip(ob->priv.fd, ob->priv.crtc,
|
if (drmModePageFlip(ob->priv.fd, ob->priv.crtc,
|
||||||
buffer->fb, DRM_MODE_PAGE_FLIP_EVENT, ob) < 0)
|
buffer->id, DRM_MODE_PAGE_FLIP_EVENT, ob) < 0)
|
||||||
{
|
{
|
||||||
ERR("Cannot flip crtc %u for connector %u: %m",
|
ERR("Cannot flip crtc %u for connector %u: %m",
|
||||||
ob->priv.crtc, ob->priv.conn);
|
ob->priv.crtc, ob->priv.conn);
|
||||||
|
|
|
@ -49,25 +49,8 @@ extern int _evas_engine_drm_log_dom;
|
||||||
/* define a maximum number of 'buffers' (double-buff, triple-buff, etc) */
|
/* define a maximum number of 'buffers' (double-buff, triple-buff, etc) */
|
||||||
# define NUM_BUFFERS 2
|
# define NUM_BUFFERS 2
|
||||||
|
|
||||||
typedef struct _Buffer Buffer;
|
|
||||||
typedef struct _Plane Plane;
|
typedef struct _Plane Plane;
|
||||||
|
|
||||||
struct _Buffer
|
|
||||||
{
|
|
||||||
int w, h;
|
|
||||||
int stride, size;
|
|
||||||
int handle;
|
|
||||||
unsigned int fb;
|
|
||||||
|
|
||||||
void *data; // used for software framebuffers
|
|
||||||
|
|
||||||
# ifdef HAVE_DRM_HW_ACCEL
|
|
||||||
void *bo; // used for hardware framebuffers
|
|
||||||
# endif
|
|
||||||
|
|
||||||
Eina_Bool valid : 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _Plane
|
struct _Plane
|
||||||
{
|
{
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
|
@ -93,7 +76,7 @@ struct _Outbuf
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
Buffer buffer[NUM_BUFFERS];
|
Ecore_Drm_Fb *buffer[NUM_BUFFERS];
|
||||||
|
|
||||||
Eina_List *pending_writes;
|
Eina_List *pending_writes;
|
||||||
Eina_List *planes;
|
Eina_List *planes;
|
||||||
|
@ -128,9 +111,7 @@ void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update);
|
||||||
void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
|
void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
|
||||||
|
|
||||||
Eina_Bool evas_drm_outbuf_setup(Outbuf *ob);
|
Eina_Bool evas_drm_outbuf_setup(Outbuf *ob);
|
||||||
void evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer);
|
void evas_drm_outbuf_framebuffer_set(Outbuf *ob, Ecore_Drm_Fb *buffer);
|
||||||
Eina_Bool evas_drm_framebuffer_create(int fd, Buffer *buffer, int depth);
|
Eina_Bool evas_drm_framebuffer_send(Outbuf *ob, Ecore_Drm_Fb *buffer);
|
||||||
void evas_drm_framebuffer_destroy(int fd, Buffer *buffer);
|
|
||||||
Eina_Bool evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -8,23 +8,8 @@
|
||||||
#define GREEN_MASK 0x00ff00
|
#define GREEN_MASK 0x00ff00
|
||||||
#define BLUE_MASK 0x0000ff
|
#define BLUE_MASK 0x0000ff
|
||||||
|
|
||||||
static Eina_Bool
|
|
||||||
_evas_outbuf_buffer_new(Outbuf *ob, Buffer *buff)
|
|
||||||
{
|
|
||||||
buff->w = ob->w;
|
|
||||||
buff->h = ob->h;
|
|
||||||
if (buff->w < ob->priv.mode.hdisplay) buff->w = ob->priv.mode.hdisplay;
|
|
||||||
if (buff->h < ob->priv.mode.vdisplay) buff->h = ob->priv.mode.vdisplay;
|
|
||||||
|
|
||||||
/* create a dumb framebuffer */
|
|
||||||
if (!evas_drm_framebuffer_create(ob->priv.fd, buff, ob->depth))
|
|
||||||
return EINA_FALSE;
|
|
||||||
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_evas_outbuf_buffer_put(Outbuf *ob, Buffer *buffer, Eina_Rectangle *rects, unsigned int count)
|
_evas_outbuf_buffer_put(Outbuf *ob, Ecore_Drm_Fb *buffer, Eina_Rectangle *rects, unsigned int count)
|
||||||
{
|
{
|
||||||
/* validate input params */
|
/* validate input params */
|
||||||
if ((!ob) || (!buffer)) return;
|
if ((!ob) || (!buffer)) return;
|
||||||
|
@ -44,7 +29,7 @@ _evas_outbuf_buffer_put(Outbuf *ob, Buffer *buffer, Eina_Rectangle *rects, unsig
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DBG("Marking FB Dirty: %d", buffer->fb); */
|
/* DBG("Marking FB Dirty: %d", buffer->fb); */
|
||||||
ret = drmModeDirtyFB(ob->priv.fd, buffer->fb, clip, count);
|
ret = drmModeDirtyFB(ob->priv.fd, buffer->id, clip, count);
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
if (ret == -EINVAL)
|
if (ret == -EINVAL)
|
||||||
|
@ -56,12 +41,12 @@ _evas_outbuf_buffer_put(Outbuf *ob, Buffer *buffer, Eina_Rectangle *rects, unsig
|
||||||
static void
|
static void
|
||||||
_evas_outbuf_buffer_swap(Outbuf *ob, Eina_Rectangle *rects, unsigned int count)
|
_evas_outbuf_buffer_swap(Outbuf *ob, Eina_Rectangle *rects, unsigned int count)
|
||||||
{
|
{
|
||||||
Buffer *buff;
|
Ecore_Drm_Fb *buff;
|
||||||
|
|
||||||
buff = &(ob->priv.buffer[ob->priv.curr]);
|
buff = ob->priv.buffer[ob->priv.curr];
|
||||||
|
|
||||||
/* if this buffer is not valid, we need to set it */
|
/* if this buffer is not valid, we need to set it */
|
||||||
if (!buff->valid) evas_drm_outbuf_framebuffer_set(ob, buff);
|
evas_drm_outbuf_framebuffer_set(ob, buff);
|
||||||
|
|
||||||
/* mark the fb as dirty */
|
/* mark the fb as dirty */
|
||||||
_evas_outbuf_buffer_put(ob, buff, rects, count);
|
_evas_outbuf_buffer_put(ob, buff, rects, count);
|
||||||
|
@ -84,6 +69,7 @@ evas_outbuf_setup(Evas_Engine_Info_Drm *info, int w, int h)
|
||||||
ob->w = w;
|
ob->w = w;
|
||||||
ob->h = h;
|
ob->h = h;
|
||||||
|
|
||||||
|
ob->info = info;
|
||||||
ob->depth = info->info.depth;
|
ob->depth = info->info.depth;
|
||||||
ob->rotation = info->info.rotation;
|
ob->rotation = info->info.rotation;
|
||||||
ob->destination_alpha = info->info.destination_alpha;
|
ob->destination_alpha = info->info.destination_alpha;
|
||||||
|
@ -124,18 +110,21 @@ evas_outbuf_setup(Evas_Engine_Info_Drm *info, int w, int h)
|
||||||
/* try to create buffers */
|
/* try to create buffers */
|
||||||
for (; i < ob->priv.num; i++)
|
for (; i < ob->priv.num; i++)
|
||||||
{
|
{
|
||||||
if (!_evas_outbuf_buffer_new(ob, &(ob->priv.buffer[i])))
|
ob->priv.buffer[i] =
|
||||||
break;
|
ecore_drm_fb_create(ob->info->info.dev, ob->w, ob->h);
|
||||||
|
if (!ob->priv.buffer[i])
|
||||||
|
{
|
||||||
|
ERR("Failed to create buffer %d", i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the front buffer to be the one on the crtc */
|
/* set the front buffer to be the one on the crtc */
|
||||||
evas_drm_outbuf_framebuffer_set(ob, &(ob->priv.buffer[0]));
|
evas_drm_outbuf_framebuffer_set(ob, ob->priv.buffer[0]);
|
||||||
|
|
||||||
/* set back buffer as first one to draw into */
|
/* set back buffer as first one to draw into */
|
||||||
/* ob->priv.curr = (ob->priv.num - 1); */
|
/* ob->priv.curr = (ob->priv.num - 1); */
|
||||||
|
|
||||||
ob->info = info;
|
|
||||||
|
|
||||||
return ob;
|
return ob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +135,7 @@ evas_outbuf_free(Outbuf *ob)
|
||||||
|
|
||||||
/* destroy the old buffers */
|
/* destroy the old buffers */
|
||||||
for (; i < ob->priv.num; i++)
|
for (; i < ob->priv.num; i++)
|
||||||
evas_drm_framebuffer_destroy(ob->priv.fd, &(ob->priv.buffer[i]));
|
ecore_drm_fb_destroy(ob->priv.buffer[i]);
|
||||||
|
|
||||||
/* free allocate space for outbuf */
|
/* free allocate space for outbuf */
|
||||||
free(ob);
|
free(ob);
|
||||||
|
@ -190,13 +179,15 @@ evas_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth)
|
||||||
|
|
||||||
/* destroy the old buffers */
|
/* destroy the old buffers */
|
||||||
for (; i < ob->priv.num; i++)
|
for (; i < ob->priv.num; i++)
|
||||||
evas_drm_framebuffer_destroy(ob->priv.fd, &(ob->priv.buffer[i]));
|
ecore_drm_fb_destroy(ob->priv.buffer[i]);
|
||||||
|
|
||||||
for (i = 0; i < ob->priv.num; i++)
|
for (i = 0; i < ob->priv.num; i++)
|
||||||
{
|
{
|
||||||
if (!_evas_outbuf_buffer_new(ob, &(ob->priv.buffer[i])))
|
ob->priv.buffer[i] =
|
||||||
|
ecore_drm_fb_create(ob->info->info.dev, ob->w, ob->h);
|
||||||
|
if (!ob->priv.buffer[i])
|
||||||
{
|
{
|
||||||
CRI("Failed to create buffer");
|
ERR("Failed to create buffer %d", i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -290,7 +281,7 @@ evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int
|
||||||
Eina_Rectangle rect = {0, 0, 0, 0}, pr;
|
Eina_Rectangle rect = {0, 0, 0, 0}, pr;
|
||||||
DATA32 *src;
|
DATA32 *src;
|
||||||
DATA8 *dst;
|
DATA8 *dst;
|
||||||
Buffer *buff;
|
Ecore_Drm_Fb *buff;
|
||||||
int bpp = 0, bpl = 0;
|
int bpp = 0, bpl = 0;
|
||||||
int rx = 0, ry = 0;
|
int rx = 0, ry = 0;
|
||||||
|
|
||||||
|
@ -304,8 +295,8 @@ evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int
|
||||||
if (!(src = update->image.data)) return;
|
if (!(src = update->image.data)) return;
|
||||||
|
|
||||||
/* check for valid desination data */
|
/* check for valid desination data */
|
||||||
buff = &(ob->priv.buffer[ob->priv.curr]);
|
buff = ob->priv.buffer[ob->priv.curr];
|
||||||
if (!(dst = buff->data)) return;
|
if (!(dst = buff->mmap)) return;
|
||||||
|
|
||||||
if ((ob->rotation == 0) || (ob->rotation == 180))
|
if ((ob->rotation == 0) || (ob->rotation == 180))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue