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:
Chris Michael 2015-04-07 10:51:13 -04:00 committed by Stefan Schmidt
parent 318f2c435a
commit d815d9bd10
3 changed files with 30 additions and 160 deletions

View File

@ -233,7 +233,7 @@ evas_drm_outbuf_setup(Outbuf *ob)
}
void
evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer)
evas_drm_outbuf_framebuffer_set(Outbuf *ob, Ecore_Drm_Fb *buffer)
{
int ret;
@ -242,115 +242,13 @@ evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer)
/* DBG("Drm Framebuffer Set: %d", buffer->fb); */
buffer->valid = EINA_FALSE;
ret = drmModeSetCrtc(ob->priv.fd, ob->priv.crtc, buffer->fb, 0, 0,
ret = drmModeSetCrtc(ob->priv.fd, ob->priv.crtc, buffer->id, 0, 0,
&ob->priv.conn, 1, &ob->priv.mode);
if (ret) ERR("Failed to set crtc: %m");
else buffer->valid = EINA_TRUE;
}
Eina_Bool
evas_drm_framebuffer_create(int fd, Buffer *buffer, int depth)
{
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)
evas_drm_framebuffer_send(Outbuf *ob, Ecore_Drm_Fb *buffer)
{
/* check for valid Output buffer */
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 (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",
ob->priv.crtc, ob->priv.conn);

View File

@ -49,25 +49,8 @@ extern int _evas_engine_drm_log_dom;
/* define a maximum number of 'buffers' (double-buff, triple-buff, etc) */
# define NUM_BUFFERS 2
typedef struct _Buffer Buffer;
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
{
unsigned int id;
@ -93,7 +76,7 @@ struct _Outbuf
struct
{
Buffer buffer[NUM_BUFFERS];
Ecore_Drm_Fb *buffer[NUM_BUFFERS];
Eina_List *pending_writes;
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);
Eina_Bool evas_drm_outbuf_setup(Outbuf *ob);
void evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer);
Eina_Bool evas_drm_framebuffer_create(int fd, Buffer *buffer, int depth);
void evas_drm_framebuffer_destroy(int fd, Buffer *buffer);
Eina_Bool evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer);
void evas_drm_outbuf_framebuffer_set(Outbuf *ob, Ecore_Drm_Fb *buffer);
Eina_Bool evas_drm_framebuffer_send(Outbuf *ob, Ecore_Drm_Fb *buffer);
#endif

View File

@ -8,23 +8,8 @@
#define GREEN_MASK 0x00ff00
#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
_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 */
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); */
ret = drmModeDirtyFB(ob->priv.fd, buffer->fb, clip, count);
ret = drmModeDirtyFB(ob->priv.fd, buffer->id, clip, count);
if (ret)
{
if (ret == -EINVAL)
@ -56,12 +41,12 @@ _evas_outbuf_buffer_put(Outbuf *ob, Buffer *buffer, Eina_Rectangle *rects, unsig
static void
_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 (!buff->valid) evas_drm_outbuf_framebuffer_set(ob, buff);
evas_drm_outbuf_framebuffer_set(ob, buff);
/* mark the fb as dirty */
_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->h = h;
ob->info = info;
ob->depth = info->info.depth;
ob->rotation = info->info.rotation;
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 */
for (; i < ob->priv.num; i++)
{
if (!_evas_outbuf_buffer_new(ob, &(ob->priv.buffer[i])))
break;
ob->priv.buffer[i] =
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 */
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 */
/* ob->priv.curr = (ob->priv.num - 1); */
ob->info = info;
return ob;
}
@ -146,7 +135,7 @@ evas_outbuf_free(Outbuf *ob)
/* destroy the old buffers */
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(ob);
@ -190,13 +179,15 @@ evas_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth)
/* destroy the old buffers */
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++)
{
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;
}
}
@ -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;
DATA32 *src;
DATA8 *dst;
Buffer *buff;
Ecore_Drm_Fb *buff;
int bpp = 0, bpl = 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;
/* check for valid desination data */
buff = &(ob->priv.buffer[ob->priv.curr]);
if (!(dst = buff->data)) return;
buff = ob->priv.buffer[ob->priv.curr];
if (!(dst = buff->mmap)) return;
if ((ob->rotation == 0) || (ob->rotation == 180))
{