enlightenment/src/modules/wl_drm/e_sprite.c

89 lines
2.2 KiB
C

#include "e.h"
#include "e_mod_main.h"
/* local function prototypes */
static void _e_sprite_cb_buffer_destroy(struct wl_listener *listener, void *data __UNUSED__);
static void _e_sprite_cb_pending_buffer_destroy(struct wl_listener *listener, void *data __UNUSED__);
/* local variables */
/* wayland interfaces */
/* external variables */
EINTERN E_Sprite *
e_sprite_create(E_Drm_Compositor *dcomp, drmModePlane *plane)
{
E_Sprite *es;
DLOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!plane) return NULL;
es = malloc(sizeof(E_Sprite) + ((sizeof(unsigned int)) * plane->count_formats));
if (!es) return NULL;
memset(es, 0, sizeof(E_Sprite));
es->compositor = dcomp;
es->possible_crtcs = plane->possible_crtcs;
es->plane_id = plane->plane_id;
es->surface = NULL;
es->pending_surface = NULL;
es->fb_id = 0;
es->pending_fb_id = 0;
es->destroy_listener.notify = _e_sprite_cb_buffer_destroy;
es->pending_destroy_listener.notify = _e_sprite_cb_pending_buffer_destroy;
es->format_count = plane->count_formats;
memcpy(es->formats, plane->formats,
plane->count_formats * sizeof(plane->formats[0]));
return es;
}
EINTERN Eina_Bool
e_sprite_crtc_supported(E_Output *output, unsigned int supported)
{
E_Compositor *comp;
E_Drm_Compositor *dcomp;
E_Drm_Output *doutput;
int crtc = 0;
DLOGFN(__FILE__, __LINE__, __FUNCTION__);
comp = output->compositor;
dcomp = (E_Drm_Compositor *)comp;
doutput = (E_Drm_Output *)output;
for (crtc = 0; crtc < dcomp->num_crtcs; crtc++)
{
if (dcomp->crtcs[crtc] != doutput->crtc_id)
continue;
if (supported & (1 << crtc))
return EINA_TRUE;
}
return EINA_FALSE;
}
/* local functions */
static void
_e_sprite_cb_buffer_destroy(struct wl_listener *listener, void *data __UNUSED__)
{
E_Sprite *es;
DLOGFN(__FILE__, __LINE__, __FUNCTION__);
es = container_of(listener, E_Sprite, destroy_listener);
es->surface = NULL;
}
static void
_e_sprite_cb_pending_buffer_destroy(struct wl_listener *listener, void *data __UNUSED__)
{
E_Sprite *es;
DLOGFN(__FILE__, __LINE__, __FUNCTION__);
es = container_of(listener, E_Sprite, pending_destroy_listener);
es->pending_surface = NULL;
}