summaryrefslogtreecommitdiff
path: root/src/modules/evas/engines/software_generic/evas_engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/evas/engines/software_generic/evas_engine.c')
-rw-r--r--src/modules/evas/engines/software_generic/evas_engine.c125
1 files changed, 70 insertions, 55 deletions
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c
index 016179da2f..a4c404cb47 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -1899,7 +1899,6 @@ eng_image_data_slice_add(void *engdata, void *image,
for (int y = 0; y < (h / 2); y++)
cs_data[h + (h / 2) + y] = slice->bytes + (y * stride);
}
- else goto fail;
evas_common_image_colorspace_dirty(im);
break;
@@ -2773,7 +2772,7 @@ _map_draw_thread_cmd(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, RG
static void
evas_software_image_map_draw(void *engine EINA_UNUSED, void *data, void *context, RGBA_Image *surface, RGBA_Image *im, RGBA_Map *m, int smooth, int level, int offset)
{
- if (m->count - offset < 3) return;
+ if (m->count - offset < 4) return;
if ((m->pts[0 + offset].x == m->pts[3 + offset].x) &&
(m->pts[1 + offset].x == m->pts[2 + offset].x) &&
@@ -2834,7 +2833,7 @@ evas_software_image_map_draw(void *engine EINA_UNUSED, void *data, void *context
if (m->count > 4)
{
- evas_software_image_map_draw(engine, data, context, surface, im, m, smooth, level, offset + 2);
+ evas_software_image_map_draw(engine, data, context, surface, im, m, smooth, level, offset + 4);
}
}
@@ -3461,6 +3460,19 @@ _tls_check(void)
}
#endif
+static inline Eina_Bool
+_check_gl(void)
+{
+ if (!gl_lib_init()) return 0;
+ return 1;
+}
+
+static Eina_Bool
+eng_gl_supports_evas_gl(void *data EINA_UNUSED)
+{
+ return _check_gl();
+}
+
static void *
eng_gl_surface_create(void *data EINA_UNUSED, void *config, int w, int h)
{
@@ -3468,6 +3480,8 @@ eng_gl_surface_create(void *data EINA_UNUSED, void *config, int w, int h)
Render_Engine_GL_Surface *sfc;
Evas_GL_Config *cfg;
+ if (!_check_gl()) return NULL;
+
sfc = calloc(1, sizeof(Render_Engine_GL_Surface));
if (!sfc) return NULL;
@@ -3568,6 +3582,8 @@ eng_gl_surface_destroy(void *data EINA_UNUSED, void *surface)
#ifdef EVAS_GL
Render_Engine_GL_Surface *sfc;
+ if (!_check_gl()) return 0;
+
sfc = (Render_Engine_GL_Surface*)surface;
if (!sfc) return 0;
@@ -3598,11 +3614,7 @@ eng_gl_context_create(void *data EINA_UNUSED, void *share_context, int version,
Render_Engine_GL_Context *ctx;
Render_Engine_GL_Context *share_ctx;
- if (!_tls_check() && !gl_lib_init())
- {
- WRN("Failed to initialize Evas GL (with OSMesa)");
- return NULL;
- }
+ if (!_check_gl()) return NULL;
if (version != EVAS_GL_GLES_2_X)
{
@@ -3648,6 +3660,8 @@ eng_gl_context_destroy(void *data EINA_UNUSED, void *context)
#ifdef EVAS_GL
Render_Engine_GL_Context *ctx;
+ if (!_check_gl()) return 0;
+
ctx = (Render_Engine_GL_Context*)context;
if (!ctx) return 0;
@@ -3677,6 +3691,8 @@ eng_gl_make_current(void *data EINA_UNUSED, void *surface, void *context)
OSMesaContext share_ctx;
GLboolean ret;
+ if (!_check_gl()) return 0;
+
sfc = (Render_Engine_GL_Surface*)surface;
ctx = (Render_Engine_GL_Context*)context;
@@ -3760,6 +3776,8 @@ static void *
eng_gl_proc_address_get(void *data EINA_UNUSED, const char *name)
{
#ifdef EVAS_GL
+ if (!_check_gl()) return NULL;
+
if (_sym_OSMesaGetProcAddress) return _sym_OSMesaGetProcAddress(name);
return dlsym(RTLD_DEFAULT, name);
#else
@@ -3775,6 +3793,8 @@ eng_gl_native_surface_get(void *data EINA_UNUSED, void *surface, void *native_su
Render_Engine_GL_Surface *sfc;
Evas_Native_Surface *ns;
+ if (!_check_gl()) return 0;
+
sfc = (Render_Engine_GL_Surface*)surface;
ns = (Evas_Native_Surface*)native_surface;
@@ -3792,7 +3812,6 @@ eng_gl_native_surface_get(void *data EINA_UNUSED, void *surface, void *native_su
#endif
}
-
static void *
eng_gl_api_get(void *data EINA_UNUSED, int version)
{
@@ -3800,8 +3819,7 @@ eng_gl_api_get(void *data EINA_UNUSED, int version)
return NULL;
#ifdef EVAS_GL
- if (!_tls_init)
- gl_lib_init();
+ if (!_check_gl()) return NULL;
return &gl_funcs;
#else
@@ -4308,12 +4326,12 @@ eng_ector_create(void *engine EINA_UNUSED)
efl_domain_current_push(EFL_ID_DOMAIN_SHARED);
if (ector_backend && !strcasecmp(ector_backend, "default"))
{
- ector = efl_add(ECTOR_SOFTWARE_SURFACE_CLASS, NULL);
+ ector = efl_add_ref(ECTOR_SOFTWARE_SURFACE_CLASS, NULL);
use_cairo = EINA_FALSE;
}
else
{
- ector = efl_add(ECTOR_CAIRO_SOFTWARE_SURFACE_CLASS, NULL);
+ ector = efl_add_ref(ECTOR_CAIRO_SOFTWARE_SURFACE_CLASS, NULL);
use_cairo = EINA_TRUE;
}
efl_domain_current_pop();
@@ -4368,7 +4386,7 @@ eng_ector_surface_cache_drop(void *engine, void *key)
static void
eng_ector_destroy(void *data EINA_UNUSED, Ector_Surface *ector)
{
- if (ector) efl_del(ector);
+ if (ector) efl_unref(ector);
}
static Ector_Buffer *
@@ -4381,7 +4399,7 @@ eng_ector_buffer_wrap(void *data, Evas *e EINA_UNUSED, void *engine_image)
if (!efl_domain_current_push(EFL_ID_DOMAIN_SHARED))
return NULL;
- buf = efl_add(EVAS_ECTOR_SOFTWARE_BUFFER_CLASS, NULL,
+ buf = efl_add_ref(EVAS_ECTOR_SOFTWARE_BUFFER_CLASS, NULL,
evas_ector_buffer_engine_image_set(efl_added, data, ie));
efl_domain_current_pop();
@@ -4420,20 +4438,6 @@ eng_ector_buffer_new(void *data EINA_UNUSED, Evas *evas, int width, int height,
return buf;
}
-static Efl_Gfx_Render_Op
-_evas_render_op_to_ector_rop(Evas_Render_Op op)
-{
- switch (op)
- {
- case EVAS_RENDER_BLEND:
- return EFL_GFX_RENDER_OP_BLEND;
- case EVAS_RENDER_COPY:
- return EFL_GFX_RENDER_OP_COPY;
- default:
- return EFL_GFX_RENDER_OP_BLEND;
- }
-}
-
static void
_draw_thread_ector_cleanup(Evas_Thread_Command_Ector *ector)
{
@@ -4518,9 +4522,8 @@ eng_ector_renderer_draw(void *engine EINA_UNUSED, void *surface,
ector.r = renderer; // This has already been refcounted by Evas_Object_VG
ector.clips = c;
- ector.render_op = _evas_render_op_to_ector_rop(dc->render_op);
- ector.mul_col = ector_color_multiply(dc->mul.use ? dc->mul.col : 0xffffffff,
- dc->col.col);;
+ ector.render_op = EFL_GFX_RENDER_OP_BLEND;
+ ector.mul_col = 0xffffffff;
ector.free_it = EINA_FALSE;
if (do_async)
@@ -4570,7 +4573,7 @@ _draw_thread_ector_surface_set(void *data)
memset(pixels, 0, (w * h * 4));
}
- ector_buffer_pixels_set(ector_surface->ector, pixels, w, h, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
+ ector_buffer_pixels_set(ector_surface->ector, pixels, w, h, 0, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
ector_surface_reference_point_set(ector_surface->ector, x, y);
eina_mempool_free(_mp_command_ector_surface, ector_surface);
@@ -4608,7 +4611,7 @@ eng_ector_begin(void *engine EINA_UNUSED, void *surface,
// clear the surface before giving to ector
memset(pixels, 0, (w * h * 4));
- ector_buffer_pixels_set(ector, pixels, w, h, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
+ ector_buffer_pixels_set(ector, pixels, w, h, 0, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
ector_surface_reference_point_set(ector, x, y);
}
}
@@ -4632,7 +4635,7 @@ eng_ector_end(void *engine EINA_UNUSED, void *surface EINA_UNUSED,
}
else
{
- ector_buffer_pixels_set(ector, NULL, 0, 0, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
+ ector_buffer_pixels_set(ector, NULL, 0, 0, 0, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
evas_common_cpu_end_opt();
}
}
@@ -4817,26 +4820,27 @@ static Evas_Func func =
eng_font_pen_coords_get,
eng_font_text_props_info_create,
eng_font_right_inset_get,
+ eng_gl_supports_evas_gl, // returns true iif OSMesa is present
NULL, // No need to set output for software engine
- NULL, // need software mesa for gl rendering <- gl_surface_create
+ eng_gl_surface_create, // need software mesa for gl rendering <- gl_surface_create
NULL, // need software mesa for gl rendering <- gl_pbuffer_surface_create
- NULL, // need software mesa for gl rendering <- gl_surface_destroy
- NULL, // need software mesa for gl rendering <- gl_context_create
- NULL, // need software mesa for gl rendering <- gl_context_destroy
- NULL, // need software mesa for gl rendering <- gl_make_current
- NULL, // need software mesa for gl rendering <- gl_string_query
- NULL, // need software mesa for gl rendering <- gl_proc_address_get
- NULL, // need software mesa for gl rendering <- gl_native_surface_get
- NULL, // need software mesa for gl rendering <- gl_api_get
+ eng_gl_surface_destroy, // need software mesa for gl rendering <- gl_surface_destroy
+ eng_gl_context_create, // need software mesa for gl rendering <- gl_context_create
+ eng_gl_context_destroy, // need software mesa for gl rendering <- gl_context_destroy
+ eng_gl_make_current, // need software mesa for gl rendering <- gl_make_current
+ eng_gl_string_query, // need software mesa for gl rendering <- gl_string_query
+ eng_gl_proc_address_get, // need software mesa for gl rendering <- gl_proc_address_get
+ eng_gl_native_surface_get, // need software mesa for gl rendering <- gl_native_surface_get
+ eng_gl_api_get, // need software mesa for gl rendering <- gl_api_get
NULL, // need software mesa for gl rendering <- gl_direct_override
NULL, // need software mesa for gl rendering <- gl_get_pixels_set
NULL, // need software mesa for gl rendering <- gl_surface_lock
NULL, // need software mesa for gl rendering <- gl_surface_read_pixels
NULL, // need software mesa for gl rendering <- gl_surface_unlock
- NULL, // need software mesa for gl rendering <- gl_error_get
- NULL, // need software mesa for gl rendering <- gl_current_context_get
- NULL, // need software mesa for gl rendering <- gl_current_surface_get
- NULL, // need software mesa for gl rendering <- gl_rotation_angle_get
+ eng_gl_error_get, // need software mesa for gl rendering <- gl_error_get
+ eng_gl_current_context_get, // need software mesa for gl rendering <- gl_current_context_get
+ eng_gl_current_surface_get, // need software mesa for gl rendering <- gl_current_surface_get
+ eng_gl_rotation_angle_get, // need software mesa for gl rendering <- gl_rotation_angle_get
NULL, // need software mesa for gl rendering <- gl_surface_query
NULL, // need software mesa for gl rendering <- gl_surface_direct_renderable_get
NULL, // need software mesa for gl rendering <- gl_image_direct_set
@@ -5888,6 +5892,7 @@ gl_lib_init(void)
{
#ifdef EVAS_GL
// Current ctx & sfc stuff
+ if (gl_lib_handle) return 1;
if (!_tls_check()) return 0;
// dlopen OSMesa
@@ -5903,23 +5908,33 @@ gl_lib_init(void)
if (!gl_lib_handle) gl_lib_handle = dlopen("libOSMesa.so", RTLD_NOW);
if (!gl_lib_handle)
{
- DBG("Unable to open libOSMesa: %s", dlerror());
+ WRN("Unable to open libOSMesa: %s", dlerror());
+ DBG("Unable to support EvasGL in this engine module. Install OSMesa to get it running");
return 0;
}
//------------------------------------------------//
- if (!glue_sym_init()) return 0;
- if (!gl_sym_init()) return 0;
+ if (!glue_sym_init())
+ {
+ WRN("Unable to glue OSMesa syms");
+ return 0;
+ }
+ if (!gl_sym_init())
+ {
+ WRN("Unable to init OSMesa syms");
+ return 0;
+ }
override_gl_apis(&gl_funcs);
return 1;
#else
+ WRN("Evas GL not compiled in");
return 0;
#endif
}
-
+/*
static void
init_gl(void)
{
@@ -5938,7 +5953,6 @@ init_gl(void)
ORD(gl_string_query); // FIXME: Need to implement
ORD(gl_proc_address_get); // FIXME: Need to implement
ORD(gl_native_surface_get);
- ORD(gl_api_get);
ORD(gl_error_get);
ORD(gl_current_context_get);
ORD(gl_current_surface_get);
@@ -5946,7 +5960,7 @@ init_gl(void)
#undef ORD
}
}
-
+*/
/*
*****
@@ -5997,7 +6011,8 @@ module_open(Evas_Module *em)
NULL, sizeof(Evas_Thread_Command_Ector_Surface), 128);
ector_init();
- init_gl();
+// do on demand when first evas_gl_api_get is called...
+// init_gl();
ector_glsym_set(dlsym, RTLD_DEFAULT);
evas_common_pipe_init();