aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/evas/engines/drm/evas_engine.c
blob: a8791ae8ee536c84363ec1d06be579cca6818e0c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include "evas_engine.h"

typedef struct _Render_Engine
{
   Render_Output_Software_Generic generic;
} Render_Engine;

static Evas_Func func, pfunc;

int _evas_engine_drm_log_dom;

/* engine functions we override */
static void
eng_output_info_setup(void *info)
{
   Evas_Engine_Info_Drm *einfo;

   DBG("Engine Info Setup");

   einfo = info;
   einfo->render_mode = EVAS_RENDER_MODE_BLOCKING;
}

static void *
eng_output_setup(void *engine, void *info, unsigned int w, unsigned int h)
{
   Evas_Engine_Info_Drm *einfo;
   Render_Engine *re;
   Outbuf *ob;

   einfo = info;

   re = calloc(1, sizeof(Render_Engine));
   if (!re) return NULL;

   ob = _outbuf_setup(einfo, w, h);
   if (!ob) goto err;

   if (!evas_render_engine_software_generic_init(engine, &re->generic, ob,
                                                 NULL, //swap_mode_get
                                                 _outbuf_get_rotation,
                                                 _outbuf_reconfigure,
                                                 NULL, //region_first_rect
                                                 NULL, //damage_region_set
                                                 _outbuf_new_region_for_update,
                                                 NULL, //push_updated_region
                                                 NULL, //free_region_for_update
                                                 NULL, //idle_flush
                                                 NULL, //flush
                                                 NULL, //redraws_clear
                                                 _outbuf_free, //free
                                                 w, h))
     goto init_err;

   evas_render_engine_software_generic_merge_mode_set(&re->generic);

   re->generic.ob->info = einfo;

   return re;

init_err:
   evas_render_engine_software_generic_clean(engine, &re->generic);
err:
   free(re);
   return NULL;
}

static void
eng_output_free(void *engine, void *data)
{
   Render_Engine *re;

   re = data;
   evas_render_engine_software_generic_clean(engine, &re->generic);
   free(re);
}

static int
eng_output_update(void *engine EINA_UNUSED, void *data, void *info, unsigned int w, unsigned int h)
{
   Outbuf *ob;
   Render_Engine *re;
   Evas_Engine_Info_Drm *einfo;

   re = data;
   einfo = info;
   ob = re->generic.ob;

   if ((ob->w != (int)w) || (ob->h != (int)h) ||
       (ob->rotation != (int)einfo->info.rotation))
     {
        _outbuf_reconfigure(ob, w, h, einfo->info.rotation, einfo->info.depth);
        evas_render_engine_software_generic_update(&re->generic, ob, w, h);
     }

   return 1;
}

/* module functions */
static int
module_open(Evas_Module *em)
{
   if (!em) return 0;

   /* try to inherit functions from software_generic engine */
   if (!_evas_module_engine_inherit(&pfunc, "software_generic",
                                    sizeof(Evas_Engine_Info_Drm)))
     return 0;

   /* register eina logging domain */
   _evas_engine_drm_log_dom =
     eina_log_domain_register("evas-drm", EVAS_DEFAULT_LOG_COLOR);
   if (_evas_engine_drm_log_dom < 0)
     {
        EINA_LOG_ERR("Could not create module log domain");
        return 0;
     }

   /* store parent engine functions so we can override the ones we want */
   func = pfunc;

   /* override engine functions we provide */
#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
   ORD(output_info_setup);
   ORD(output_setup);
   ORD(output_free);
   ORD(output_update);

   /* advertise our engine functions */
   em->functions = (void *)(&func);

   return 1;
}

static void
module_close(Evas_Module *em EINA_UNUSED)
{
   /* unregister eina logging domain */
   if (_evas_engine_drm_log_dom >= 0)
     {
        eina_log_domain_unregister(_evas_engine_drm_log_dom);
        _evas_engine_drm_log_dom = -1;
     }
}

static Evas_Module_Api evas_modapi =
{
   EVAS_MODULE_API_VERSION, "drm", "none", { module_open, module_close }
};

EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, drm);

#ifndef EVAS_STATIC_BUILD_DRM
EVAS_EINA_MODULE_DEFINE(engine, drm);
#endif