From 8e9657ebb6e6c712fc7c3135e8be7f601884b834 Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Wed, 7 May 2014 16:23:53 +0900 Subject: [PATCH] evas/evas3d: don't be crash when it's running on sw backened. It doesn't have a plan that evas3d supports sw backened in the near future, let it prenvent engine function access in case of sw backened. --- src/lib/evas/canvas/evas_3d_texture.c | 73 +++++++++++++++++++------ src/lib/evas/canvas/evas_object_image.c | 41 +++++++++----- 2 files changed, 84 insertions(+), 30 deletions(-) diff --git a/src/lib/evas/canvas/evas_3d_texture.c b/src/lib/evas/canvas/evas_3d_texture.c index eae825698c..18eda83b3f 100644 --- a/src/lib/evas/canvas/evas_3d_texture.c +++ b/src/lib/evas/canvas/evas_3d_texture.c @@ -169,7 +169,8 @@ _texture_fini(Evas_3D_Texture *obj) if (pd->engine_data) { Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - e->engine.func->texture_free(e->engine.data.output, pd->engine_data); + if (e->engine.func->texture_free) + e->engine.func->texture_free(e->engine.data.output, pd->engine_data); pd->engine_data = NULL; } @@ -214,7 +215,11 @@ _evas_3d_texture_evas_3d_object_update_notify(Eo *obj, Evas_3D_Texture_Data *pd) if (pd->engine_data == NULL) { - pd->engine_data = e->engine.func->texture_new(e->engine.data.output); + if (e->engine.func->texture_new) + { + pd->engine_data = + e->engine.func->texture_new(e->engine.data.output); + } if (pd->engine_data == NULL) { @@ -225,8 +230,12 @@ _evas_3d_texture_evas_3d_object_update_notify(Eo *obj, Evas_3D_Texture_Data *pd) if (src->proxy->surface && !src->proxy->redraw) { - e->engine.func->texture_image_set(e->engine.data.output, pd->engine_data, - src->proxy->surface); + if (e->engine.func->texture_image_set) + { + e->engine.func->texture_image_set(e->engine.data.output, + pd->engine_data, + src->proxy->surface); + } return; } @@ -234,8 +243,10 @@ _evas_3d_texture_evas_3d_object_update_notify(Eo *obj, Evas_3D_Texture_Data *pd) pd->proxy_rendering = EINA_TRUE; _texture_proxy_subrender(obj); - e->engine.func->texture_image_set(e->engine.data.output, pd->engine_data, - src->proxy->surface); + if (e->engine.func->texture_image_set) + e->engine.func->texture_image_set(e->engine.data.output, + pd->engine_data, + src->proxy->surface); pd->proxy_rendering = EINA_FALSE; } } @@ -316,11 +327,12 @@ _evas_3d_texture_data_set(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd, Evas_3D eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - if (pd->engine_data == NULL) + if (!pd->engine_data && e->engine.func->texture_new) pd->engine_data = e->engine.func->texture_new(e->engine.data.output); - e->engine.func->texture_data_set(e->engine.data.output, pd->engine_data, - color_format, pixel_format, w, h, data); + if (e->engine.func->texture_data_set) + e->engine.func->texture_data_set(e->engine.data.output, pd->engine_data, + color_format, pixel_format, w, h, data); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_DATA, NULL)); } @@ -332,10 +344,13 @@ _evas_3d_texture_file_set(Eo *obj, Evas_3D_Texture_Data *pd, const char *file, c eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - if (pd->engine_data == NULL) + if (!pd->engine_data && e->engine.func->texture_new) pd->engine_data = e->engine.func->texture_new(e->engine.data.output); - e->engine.func->texture_file_set(e->engine.data.output, pd->engine_data, file, key); + if (e->engine.func->texture_file_set) + e->engine.func->texture_file_set(e->engine.data.output, pd->engine_data, + file, key); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_DATA, NULL)); } @@ -419,7 +434,11 @@ _evas_3d_texture_color_format_get(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd) Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - e->engine.func->texture_color_format_get(e->engine.data.output, pd->engine_data, &format); + if (e->engine.func->texture_color_format_get) + { + e->engine.func->texture_color_format_get(e->engine.data.output, + pd->engine_data, &format); + } return format; } @@ -429,7 +448,11 @@ _evas_3d_texture_size_get(Eo *obj, Evas_3D_Texture_Data *pd, int *w, int *h) Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - e->engine.func->texture_size_get(e->engine.data.output, pd->engine_data, w, h); + if (e->engine.func->texture_size_get) + { + e->engine.func->texture_size_get(e->engine.data.output, + pd->engine_data, w, h); + } } EOLIAN static void @@ -438,7 +461,11 @@ _evas_3d_texture_wrap_set(Eo *obj, Evas_3D_Texture_Data *pd, Evas_3D_Wrap_Mode s Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - e->engine.func->texture_wrap_set(e->engine.data.output, pd->engine_data, s, t); + if (e->engine.func->texture_wrap_set) + { + e->engine.func->texture_wrap_set(e->engine.data.output, + pd->engine_data, s, t); + } eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_WRAP, NULL)); } @@ -448,7 +475,11 @@ _evas_3d_texture_wrap_get(Eo *obj, Evas_3D_Texture_Data *pd, Evas_3D_Wrap_Mode * Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - e->engine.func->texture_wrap_get(e->engine.data.output, pd->engine_data, s, t); + if (e->engine.func->texture_wrap_set) + { + e->engine.func->texture_wrap_get(e->engine.data.output, + pd->engine_data, s, t); + } } EOLIAN static void @@ -457,7 +488,11 @@ _evas_3d_texture_filter_set(Eo *obj, Evas_3D_Texture_Data *pd, Evas_3D_Texture_F Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - e->engine.func->texture_filter_set(e->engine.data.output, pd->engine_data, min, mag); + if (e->engine.func->texture_filter_set) + { + e->engine.func->texture_filter_set(e->engine.data.output, + pd->engine_data, min, mag); + } eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_FILTER, NULL)); } @@ -467,7 +502,11 @@ _evas_3d_texture_filter_get(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd, Evas_ Eo *evas = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CLASS); - e->engine.func->texture_filter_get(e->engine.data.output, pd->engine_data, min, mag); + if (e->engine.func->texture_filter_get) + { + e->engine.func->texture_filter_get(e->engine.data.output, + pd->engine_data, min, mag); + } } #include "canvas/evas_3d_texture.eo.c" diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 7ea684a43b..e16ca67a32 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -2520,12 +2520,18 @@ _3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED, { int w, h; - e->engine.func->drawable_size_get(e->engine.data.output, - pd_scene->surface, &w, &h); + if (e->engine.func->drawable_size_get) + { + e->engine.func->drawable_size_get(e->engine.data.output, + pd_scene->surface, &w, &h); + } if ((w != pd_scene->w) || (h != pd_scene->h)) { - e->engine.func->drawable_free(e->engine.data.output, - pd_scene->surface); + if (e->engine.func->drawable_free) + { + e->engine.func->drawable_free(e->engine.data.output, + pd_scene->surface); + } pd_scene->surface = NULL; need_native_set = EINA_TRUE; } @@ -2533,9 +2539,12 @@ _3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED, else { /* TODO: Hard-coded alpha on. */ - pd_scene->surface = - e->engine.func->drawable_new(e->engine.data.output, - pd_scene->w, pd_scene->h, 1); + if (e->engine.func->drawable_new) + { + pd_scene->surface = + e->engine.func->drawable_new(e->engine.data.output, + pd_scene->w, pd_scene->h, 1); + } need_native_set = EINA_TRUE; } @@ -2544,10 +2553,13 @@ _3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED, { if (need_native_set) { - data->surface = - e->engine.func->image_drawable_set(e->engine.data.output, - data->surface, - pd_scene->surface); + if (e->engine.func->image_drawable_set) + { + data->surface = + e->engine.func->image_drawable_set(e->engine.data.output, + data->surface, + pd_scene->surface); + } } data->w = pd_scene->w; data->h = pd_scene->h; @@ -2573,8 +2585,11 @@ _3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED, evas_3d_node_light_collect, &scene_data); /* Phase 5 - Draw the scene. */ - e->engine.func->drawable_scene_render(e->engine.data.output, - pd_scene->surface, &scene_data); + if (e->engine.func->drawable_scene_render) + { + e->engine.func->drawable_scene_render(e->engine.data.output, + pd_scene->surface, &scene_data); + } /* Clean up temporary resources. */ evas_3d_scene_data_fini(&scene_data); }