evas_3d: stop just segfaulting straight away
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Tue, 26 Mar 2019 14:09:42 +0000 (10:09 -0400)
committerYeongjong Lee <yj34.lee@samsung.com>
Tue, 2 Apr 2019 03:45:17 +0000 (12:45 +0900)
Summary:
there have been wrong function calls, that did not work at all, since
the function pointer had the wrong type. This fixes the segfaulting
examples of evas3d. However, they still do not render, at least, they
don't crash anymore.

Depends on D8381

Reviewers: cedric, segfaultxavi, zmike, stefan_schmidt

Reviewed By: zmike

Subscribers: #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D8382

src/examples/evas/meson.build
src/examples/evas/shooter/evas-3d-shooter-header.h
src/examples/evas/shooter/evas-3d-shooter.c
src/examples/evas/shooter/meson.build [new file with mode: 0644]
src/lib/evas/canvas/evas_canvas3d_node.c
src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
src/modules/evas/engines/gl_generic/evas_engine.c

index c07587d..34c8bd3 100644 (file)
@@ -51,7 +51,9 @@ examples = [
 ]
 
 foreach example : examples
-  executable(example, example + '.c', 
+  executable(example, example + '.c',
     dependencies: [eina, ecore_evas, ecore_file, m],
     c_args : ['-DPACKAGE_EXAMPLES_DIR="'+meson.current_source_dir()+'"'])
 endforeach
+
+subdir('shooter')
index aaa6ff3..cd30fde 100644 (file)
@@ -113,9 +113,9 @@ typedef struct _Scene_Data
    Eina_Bool   normal;
 } Scene_Data;
 
-static Evas             *evas              = NULL;
-static Eo               *background        = NULL;
-static Eo               *image             = NULL;
+extern Evas             *evas;
+extern Eo               *background;
+extern Eo               *image;
 
 static const vec2 tex_scale = {1, 1};
 
index 1c4deb4..2dcad1d 100644 (file)
 #define LOCAL_IMAGE_FOLDER PACKAGE_EXAMPLES_DIR "" EVAS_PROJECT_IMAGE_FOLDER
 #define LOCAL_MODEL_FOLDER PACKAGE_EXAMPLES_DIR "" EVAS_PROJECT_MODEL_FOLDER
 
+
+Evas             *evas              = NULL;
+Eo               *background        = NULL;
+Eo               *image             = NULL;
+
 static const char *gray_brick_n_path = LOCAL_IMAGE_FOLDER "/brick-stone_n.jpg";
 static const char *gray_brick_path = LOCAL_IMAGE_FOLDER "/brick-stone.jpg";
 static const char *red_brick_n_path = LOCAL_IMAGE_FOLDER "/bricks_n.jpg";
diff --git a/src/examples/evas/shooter/meson.build b/src/examples/evas/shooter/meson.build
new file mode 100644 (file)
index 0000000..abb782d
--- /dev/null
@@ -0,0 +1,5 @@
+executable('evas-3d-shooter',
+  ['evas-3d-shooter-header.c', 'evas-3d-shooter.c'],
+  dependencies: [ecore_evas],
+  c_args : ['-DPACKAGE_EXAMPLES_DIR="'+meson.current_source_dir()+'"']
+)
index 5d78183..98492fa 100644 (file)
@@ -1048,6 +1048,7 @@ _evas_canvas3d_node_efl_object_finalize(Eo *obj, Evas_Canvas3D_Node_Data *pd)
 EOLIAN static Efl_Object *
 _evas_canvas3d_node_efl_object_constructor(Eo *obj, Evas_Canvas3D_Node_Data *pd)
 {
+   efl_constructor(efl_super(obj, MY_CLASS));
    evas_canvas3d_object_type_set(obj, EVAS_CANVAS3D_OBJECT_TYPE_NODE);
 
    eina_vector3_set(&pd->position, 0.0, 0.0, 0.0);
index a7effaf..56a0cf3 100644 (file)
@@ -165,4 +165,20 @@ gl_generic_any_output_get(Render_Engine_GL_Generic *engine)
    return NULL;
 }
 
+static inline Render_Output_GL_Generic *
+gl_generic_output_find(Render_Engine_GL_Generic *engine)
+{
+   Render_Output_GL_Generic *output;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(engine->software.outputs, l, output)
+     {
+        if (!output->software.ob) continue;
+        return output;
+     }
+
+   return NULL;
+}
+
+
 #endif
index abfd0f7..e121f72 100755 (executable)
@@ -2570,7 +2570,7 @@ eng_renderer_3d_get(void *output)
 static void *
 eng_drawable_new(void *engine, int w, int h, int alpha)
 {
-   eng_context_3d_use(engine);
+   eng_context_3d_use(gl_generic_output_find(engine));
 #ifdef GL_GLES
    return e3d_drawable_new(w, h, alpha, GL_DEPTH_STENCIL_OES, GL_NONE);
 #else
@@ -2581,7 +2581,7 @@ eng_drawable_new(void *engine, int w, int h, int alpha)
 static void
 eng_drawable_free(void *engine, void *drawable)
 {
-   eng_context_3d_use(engine);
+   eng_context_3d_use(gl_generic_output_find(engine));
    e3d_drawable_free(drawable);
 }
 
@@ -2613,7 +2613,7 @@ eng_image_drawable_set(void *engine, void *image, void *drawable)
 }
 
 static void
-eng_drawable_scene_render(void *engine EINA_UNUSED, void *data, void *drawable, void *scene_data)
+eng_drawable_scene_render(void *engine, void *data, void *drawable, void *scene_data)
 {
    Evas_Engine_GL_Context *gl_context;
    E3D_Renderer *renderer = NULL;
@@ -2621,7 +2621,7 @@ eng_drawable_scene_render(void *engine EINA_UNUSED, void *data, void *drawable,
    gl_context = gl_generic_context_get(data, 1);
    evas_gl_common_context_flush(gl_context);
 
-   eng_context_3d_use(data);
+   eng_context_3d_use(gl_generic_output_find(engine));
    renderer = eng_renderer_3d_get(data);
    e3d_drawable_scene_render(drawable, renderer, scene_data);
 }
@@ -2654,7 +2654,7 @@ eng_drawable_scene_render_to_texture(void *engine, void *drawable, void *scene_d
    gl_context = gl_generic_context_get(engine, 1);
    evas_gl_common_context_flush(gl_context);
 
-   eng_context_3d_use(engine);
+   eng_context_3d_use(gl_generic_output_find(engine));
    renderer = eng_renderer_3d_get(engine);
 
    return e3d_drawable_scene_render_to_texture((E3D_Drawable *)drawable, renderer, scene_data);
@@ -2717,7 +2717,7 @@ eng_texture_image_set(void *engine, void *texture, void *image)
 {
    Evas_Engine_GL_Context *gl_context;
 
-   gl_context = gl_generic_context_get(engine, 1);
+   gl_context = gl_generic_context_find(engine, 1);
 
    e3d_texture_set(gl_context, (E3D_Texture *)texture, (Evas_GL_Image *)image);
 }