89 lines
2.2 KiB
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;
|
|
}
|