zmike pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=17e60a55851c8d37ccd8cabb5757a9c0f59e2930

commit 17e60a55851c8d37ccd8cabb5757a9c0f59e2930
Author: Marcel Hollerbach <[email protected]>
Date:   Tue Mar 26 10:09:42 2019 -0400

    evas_3d: stop just segfaulting straight away
    
    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                            |  4 +++-
 src/examples/evas/shooter/evas-3d-shooter-header.h       |  6 +++---
 src/examples/evas/shooter/evas-3d-shooter.c              |  5 +++++
 src/examples/evas/shooter/meson.build                    |  5 +++++
 src/lib/evas/canvas/evas_canvas3d_node.c                 |  1 +
 .../evas/engines/gl_generic/Evas_Engine_GL_Generic.h     | 16 ++++++++++++++++
 src/modules/evas/engines/gl_generic/evas_engine.c        | 12 ++++++------
 7 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/src/examples/evas/meson.build b/src/examples/evas/meson.build
index c07587dec6..34c8bd3463 100644
--- a/src/examples/evas/meson.build
+++ b/src/examples/evas/meson.build
@@ -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')
diff --git a/src/examples/evas/shooter/evas-3d-shooter-header.h 
b/src/examples/evas/shooter/evas-3d-shooter-header.h
index aaa6ff389c..cd30fde209 100644
--- a/src/examples/evas/shooter/evas-3d-shooter-header.h
+++ b/src/examples/evas/shooter/evas-3d-shooter-header.h
@@ -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};
 
diff --git a/src/examples/evas/shooter/evas-3d-shooter.c 
b/src/examples/evas/shooter/evas-3d-shooter.c
index 1c4deb4d7e..2dcad1db61 100644
--- a/src/examples/evas/shooter/evas-3d-shooter.c
+++ b/src/examples/evas/shooter/evas-3d-shooter.c
@@ -19,6 +19,11 @@
 #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
index 0000000000..abb782d540
--- /dev/null
+++ b/src/examples/evas/shooter/meson.build
@@ -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()+'"']
+)
diff --git a/src/lib/evas/canvas/evas_canvas3d_node.c 
b/src/lib/evas/canvas/evas_canvas3d_node.c
index 5d78183a39..98492fa502 100644
--- a/src/lib/evas/canvas/evas_canvas3d_node.c
+++ b/src/lib/evas/canvas/evas_canvas3d_node.c
@@ -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);
diff --git a/src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h 
b/src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
index a7effafde0..56a0cf3cad 100644
--- a/src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
+++ b/src/modules/evas/engines/gl_generic/Evas_Engine_GL_Generic.h
@@ -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
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c 
b/src/modules/evas/engines/gl_generic/evas_engine.c
index 78d11edaca..2659498611 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -2306,7 +2306,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
@@ -2317,7 +2317,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);
 }
 
@@ -2349,7 +2349,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;
@@ -2357,7 +2357,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);
 }
@@ -2390,7 +2390,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);
@@ -2453,7 +2453,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);
 }

-- 


Reply via email to