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
This commit is contained in:
Marcel Hollerbach 2019-03-26 10:09:42 -04:00 committed by Mike Blumenkrantz
parent 2e545ee34e
commit 17e60a5585
7 changed files with 39 additions and 10 deletions

View 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')

View 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};

View File

@ -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";

View File

@ -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()+'"']
)

View 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);

View 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

View File

@ -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);
}