2016-03-09 05:22:22 -08:00
|
|
|
/* Portions of this code have been derived from Weston
|
|
|
|
*
|
|
|
|
* Copyright © 2008-2012 Kristian Høgsberg
|
|
|
|
* Copyright © 2010-2012 Intel Corporation
|
|
|
|
* Copyright © 2010-2011 Benjamin Franzke
|
|
|
|
* Copyright © 2011-2012 Collabora, Ltd.
|
|
|
|
* Copyright © 2010 Red Hat <mjg@redhat.com>
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice (including the next
|
|
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
|
|
* Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
* DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
2014-03-06 01:43:48 -08:00
|
|
|
#include "ecore_drm_private.h"
|
|
|
|
|
|
|
|
/**
|
2014-03-15 04:03:08 -07:00
|
|
|
* @defgroup Ecore_Drm_Sprites_Group Ecore DRM Sprites
|
|
|
|
*
|
|
|
|
* Functions for managing DRM sprites.
|
2014-03-06 01:43:48 -08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* TODO: DOXY !! */
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
ecore_drm_sprites_create(Ecore_Drm_Device *dev)
|
|
|
|
{
|
|
|
|
drmModePlaneRes *res;
|
|
|
|
drmModePlane *p;
|
|
|
|
unsigned int i = 0;
|
|
|
|
|
|
|
|
/* check for valid device */
|
2015-04-24 09:51:34 -07:00
|
|
|
EINA_SAFETY_ON_TRUE_RETURN_VAL((!dev) || (dev->drm.fd < 0), EINA_FALSE);
|
2014-03-06 01:43:48 -08:00
|
|
|
|
|
|
|
/* get plane resources */
|
|
|
|
if (!(res = drmModeGetPlaneResources(dev->drm.fd))) return EINA_FALSE;
|
|
|
|
|
|
|
|
for (i = 0; i < res->count_planes; i++)
|
|
|
|
{
|
|
|
|
Ecore_Drm_Sprite *sprite;
|
|
|
|
|
|
|
|
if (!(p = drmModeGetPlane(dev->drm.fd, res->planes[i])))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
/* allocate space for sprite */
|
|
|
|
if (!(sprite =
|
|
|
|
malloc(sizeof(Ecore_Drm_Sprite) +
|
|
|
|
((sizeof(unsigned int)) * p->count_formats))))
|
|
|
|
{
|
|
|
|
drmModeFreePlane(p);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2014-03-13 01:14:27 -07:00
|
|
|
sprite->output = NULL;
|
2014-03-06 01:43:48 -08:00
|
|
|
sprite->drm_fd = dev->drm.fd;
|
|
|
|
sprite->crtcs = p->possible_crtcs;
|
|
|
|
sprite->plane_id = p->plane_id;
|
|
|
|
sprite->num_formats = p->count_formats;
|
|
|
|
memcpy(sprite->formats, p->formats,
|
|
|
|
p->count_formats * sizeof(p->formats[0]));
|
|
|
|
drmModeFreePlane(p);
|
|
|
|
|
|
|
|
dev->sprites = eina_list_append(dev->sprites, sprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* free resources */
|
|
|
|
drmModeFreePlaneResources(res);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
ecore_drm_sprites_destroy(Ecore_Drm_Device *dev)
|
|
|
|
{
|
|
|
|
Ecore_Drm_Sprite *sprite;
|
|
|
|
|
|
|
|
/* check for valid device */
|
2015-04-24 09:51:34 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(dev);
|
2014-03-06 01:43:48 -08:00
|
|
|
|
|
|
|
EINA_LIST_FREE(dev->sprites, sprite)
|
|
|
|
{
|
2016-04-01 12:54:37 -07:00
|
|
|
if (sprite->output)
|
|
|
|
{
|
|
|
|
ecore_drm_sprites_fb_set(sprite, 0, 0);
|
2014-03-06 01:43:48 -08:00
|
|
|
|
2016-04-01 12:54:37 -07:00
|
|
|
_ecore_drm_output_fb_release(sprite->output, sprite->current_fb);
|
|
|
|
_ecore_drm_output_fb_release(sprite->output, sprite->next_fb);
|
|
|
|
}
|
2014-03-06 01:43:48 -08:00
|
|
|
|
|
|
|
free(sprite);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
ecore_drm_sprites_fb_set(Ecore_Drm_Sprite *sprite, int fb_id, int flags)
|
|
|
|
{
|
2015-04-24 09:51:34 -07:00
|
|
|
EINA_SAFETY_ON_TRUE_RETURN((!sprite) || (!sprite->output));
|
2014-03-06 01:43:48 -08:00
|
|
|
|
|
|
|
if (fb_id)
|
|
|
|
{
|
|
|
|
drmModeSetPlane(sprite->drm_fd, sprite->plane_id,
|
|
|
|
sprite->output->crtc_id, fb_id, flags,
|
|
|
|
sprite->dest.x, sprite->dest.y, sprite->dest.w,
|
|
|
|
sprite->dest.h, sprite->src.x, sprite->src.y,
|
|
|
|
sprite->src.w, sprite->src.h);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
drmModeSetPlane(sprite->drm_fd, sprite->plane_id,
|
|
|
|
sprite->output->crtc_id, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
ecore_drm_sprites_crtc_supported(Ecore_Drm_Output *output, unsigned int supported)
|
|
|
|
{
|
|
|
|
Ecore_Drm_Device *dev;
|
|
|
|
unsigned int c = 0;
|
|
|
|
|
2015-04-24 09:51:34 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(output->dev, EINA_FALSE);
|
2014-03-06 01:43:48 -08:00
|
|
|
dev = output->dev;
|
|
|
|
|
|
|
|
for (c = 0; c < dev->crtc_count; c++)
|
|
|
|
{
|
|
|
|
if (dev->crtcs[c] != output->crtc_id) continue;
|
|
|
|
if ((supported) && (1 << c)) return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|